Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-03-16 21:18:33 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-03-16 21:18:33 +0300
commitf64a639bcfa1fc2bc89ca7db268f594306edfd7c (patch)
treea2c3c2ebcc3b45e596949db485d6ed18ffaacfa1 /doc
parentbfbc3e0d6583ea1a91f627528bedc3d65ba4b10f (diff)
Add latest changes from gitlab-org/gitlab@13-10-stable-eev13.10.0-rc40
Diffstat (limited to 'doc')
-rw-r--r--doc/.vale/gitlab/Admin.yml2
-rw-r--r--doc/.vale/gitlab/AlertBoxStyle.yml2
-rw-r--r--doc/.vale/gitlab/BadgeCapitalization.yml33
-rw-r--r--doc/.vale/gitlab/DefaultBranch.yml14
-rw-r--r--doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml13
-rw-r--r--doc/.vale/gitlab/SubstitutionSuggestions.yml1
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt31
-rw-r--r--doc/README.md4
-rw-r--r--doc/administration/audit_events.md2
-rw-r--r--doc/administration/auth/img/okta_admin_panel.pngbin26164 -> 0 bytes
-rw-r--r--doc/administration/auth/ldap/google_secure_ldap.md2
-rw-r--r--doc/administration/auth/ldap/index.md17
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md8
-rw-r--r--doc/administration/auth/smartcard.md6
-rw-r--r--doc/administration/compliance.md2
-rw-r--r--doc/administration/consul.md2
-rw-r--r--doc/administration/feature_flags.md2
-rw-r--r--doc/administration/file_hooks.md2
-rw-r--r--doc/administration/geo/disaster_recovery/background_verification.md10
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md2
-rw-r--r--doc/administration/geo/glossary.md2
-rw-r--r--doc/administration/geo/replication/configuration.md2
-rw-r--r--doc/administration/geo/replication/datatypes.md28
-rw-r--r--doc/administration/geo/replication/location_aware_git_url.md4
-rw-r--r--doc/administration/geo/replication/remove_geo_node.md2
-rw-r--r--doc/administration/geo/replication/troubleshooting.md2
-rw-r--r--doc/administration/geo/replication/version_specific_updates.md9
-rw-r--r--doc/administration/geo/setup/database.md2
-rw-r--r--doc/administration/geo/setup/external_database.md2
-rw-r--r--doc/administration/gitaly/configure_gitaly.md943
-rw-r--r--doc/administration/gitaly/img/gitaly_network_13_9.pngbin0 -> 9791 bytes
-rw-r--r--doc/administration/gitaly/index.md941
-rw-r--r--doc/administration/gitaly/praefect.md4
-rw-r--r--doc/administration/gitaly/reference.md2
-rw-r--r--doc/administration/index.md4
-rw-r--r--doc/administration/instance_limits.md4
-rw-r--r--doc/administration/instance_review.md2
-rw-r--r--doc/administration/integration/kroki.md2
-rw-r--r--doc/administration/integration/plantuml.md297
-rw-r--r--doc/administration/integration/terminal.md2
-rw-r--r--doc/administration/invalidate_markdown_cache.md4
-rw-r--r--doc/administration/issue_closing_pattern.md6
-rw-r--r--doc/administration/logs.md8
-rw-r--r--doc/administration/maintenance_mode/index.md2
-rw-r--r--doc/administration/monitoring/gitlab_self_monitoring_project/index.md4
-rw-r--r--doc/administration/monitoring/index.md22
-rw-r--r--doc/administration/monitoring/performance/gitlab_configuration.md2
-rw-r--r--doc/administration/monitoring/performance/grafana_configuration.md2
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md6
-rw-r--r--doc/administration/monitoring/performance/request_profiling.md2
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md194
-rw-r--r--doc/administration/nfs.md23
-rw-r--r--doc/administration/object_storage.md16
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md5
-rw-r--r--doc/administration/operations/moving_repositories.md2
-rw-r--r--doc/administration/operations/rails_console.md22
-rw-r--r--doc/administration/packages/container_registry.md98
-rw-r--r--doc/administration/packages/dependency_proxy.md4
-rw-r--r--doc/administration/packages/index.md4
-rw-r--r--doc/administration/pages/index.md207
-rw-r--r--doc/administration/postgresql/replication_and_failover.md7
-rw-r--r--doc/administration/pseudonymizer.md4
-rw-r--r--doc/administration/raketasks/check.md6
-rw-r--r--doc/administration/raketasks/github_import.md4
-rw-r--r--doc/administration/raketasks/maintenance.md7
-rw-r--r--doc/administration/read_only_gitlab.md8
-rw-r--r--doc/administration/reference_architectures/10k_users.md81
-rw-r--r--doc/administration/reference_architectures/25k_users.md886
-rw-r--r--doc/administration/reference_architectures/2k_users.md39
-rw-r--r--doc/administration/reference_architectures/3k_users.md863
-rw-r--r--doc/administration/reference_architectures/50k_users.md900
-rw-r--r--doc/administration/reference_architectures/5k_users.md841
-rw-r--r--doc/administration/reference_architectures/index.md4
-rw-r--r--doc/administration/reference_architectures/troubleshooting.md4
-rw-r--r--doc/administration/repository_checks.md24
-rw-r--r--doc/administration/repository_storage_paths.md38
-rw-r--r--doc/administration/repository_storage_types.md266
-rw-r--r--doc/administration/server_hooks.md12
-rw-r--r--doc/administration/static_objects_external_storage.md4
-rw-r--r--doc/administration/terraform_state.md29
-rw-r--r--doc/administration/troubleshooting/debug.md6
-rw-r--r--doc/administration/troubleshooting/elasticsearch.md23
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md61
-rw-r--r--doc/administration/troubleshooting/log_parsing.md14
-rw-r--r--doc/administration/uploads.md2
-rw-r--r--doc/api/README.md16
-rw-r--r--doc/api/api_resources.md2
-rw-r--r--doc/api/audit_events.md2
-rw-r--r--doc/api/avatar.md2
-rw-r--r--doc/api/branches.md4
-rw-r--r--doc/api/commits.md28
-rw-r--r--doc/api/deployments.md4
-rw-r--r--doc/api/discussions.md56
-rw-r--r--doc/api/dora4_group_analytics.md6
-rw-r--r--doc/api/dora4_project_analytics.md2
-rw-r--r--doc/api/feature_flags.md2
-rw-r--r--doc/api/geo_nodes.md14
-rw-r--r--doc/api/graphql/index.md52
-rw-r--r--doc/api/graphql/reference/gitlab_schema.graphql29539
-rw-r--r--doc/api/graphql/reference/gitlab_schema.json85944
-rw-r--r--doc/api/graphql/reference/index.md8942
-rw-r--r--doc/api/graphql/removed_items.md2
-rw-r--r--doc/api/group_boards.md16
-rw-r--r--doc/api/group_repository_storage_moves.md4
-rw-r--r--doc/api/groups.md2
-rw-r--r--doc/api/invitations.md32
-rw-r--r--doc/api/issue_links.md2
-rw-r--r--doc/api/issues.md2
-rw-r--r--doc/api/job_artifacts.md8
-rw-r--r--doc/api/jobs.md77
-rw-r--r--doc/api/members.md23
-rw-r--r--doc/api/merge_request_approvals.md132
-rw-r--r--doc/api/merge_request_context_commits.md2
-rw-r--r--doc/api/merge_requests.md15
-rw-r--r--doc/api/merge_trains.md2
-rw-r--r--doc/api/notification_settings.md3
-rw-r--r--doc/api/oauth2.md21
-rw-r--r--doc/api/openapi/openapi_interactive.md2
-rw-r--r--doc/api/pipeline_schedules.md2
-rw-r--r--doc/api/pipelines.md6
-rw-r--r--doc/api/plan_limits.md81
-rw-r--r--doc/api/project_badges.md12
-rw-r--r--doc/api/project_import_export.md10
-rw-r--r--doc/api/project_repository_storage_moves.md4
-rw-r--r--doc/api/project_snippets.md4
-rw-r--r--doc/api/project_templates.md6
-rw-r--r--doc/api/project_vulnerabilities.md8
-rw-r--r--doc/api/projects.md91
-rw-r--r--doc/api/protected_branches.md23
-rw-r--r--doc/api/releases/index.md6
-rw-r--r--doc/api/remote_mirrors.md4
-rw-r--r--doc/api/repositories.md88
-rw-r--r--doc/api/repository_files.md4
-rw-r--r--doc/api/repository_submodules.md2
-rw-r--r--doc/api/resource_access_tokens.md3
-rw-r--r--doc/api/search.md30
-rw-r--r--doc/api/services.md2
-rw-r--r--doc/api/settings.md9
-rw-r--r--doc/api/snippet_repository_storage_moves.md4
-rw-r--r--doc/api/snippets.md14
-rw-r--r--doc/api/tags.md7
-rw-r--r--doc/api/users.md31
-rw-r--r--doc/api/vulnerability_findings.md2
-rw-r--r--doc/api/wikis.md2
-rw-r--r--doc/architecture/blueprints/container_registry_metadata_database/index.md359
-rw-r--r--doc/architecture/blueprints/graphql_api/index.md6
-rw-r--r--doc/ci/README.md3
-rw-r--r--doc/ci/ci_cd_for_external_repos/github_integration.md2
-rw-r--r--doc/ci/cloud_deployment/ecs/img/container-name.pngbin0 -> 8813 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/container-port-mapping.pngbin0 -> 8994 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-launch-status.pngbin0 -> 13587 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-policy.pngbin0 -> 10342 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.pngbin0 -> 10367 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/initial-pipeline.pngbin0 -> 8114 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/rails-template.pngbin0 -> 13497 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/registry.pngbin0 -> 5647 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/service-parameter.pngbin0 -> 8170 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/service-running.pngbin0 -> 5207 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/view-running-app-2.pngbin0 -> 5082 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/view-running-app.pngbin0 -> 5181 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/quick_start_guide.md250
-rw-r--r--doc/ci/cloud_deployment/index.md9
-rw-r--r--doc/ci/docker/index.md19
-rw-r--r--doc/ci/docker/using_docker_build.md101
-rw-r--r--doc/ci/docker/using_docker_images.md30
-rw-r--r--doc/ci/docker/using_kaniko.md2
-rw-r--r--doc/ci/environments/deployment_safety.md8
-rw-r--r--doc/ci/environments/img/deployments_list.pngbin0 -> 18119 bytes
-rw-r--r--doc/ci/environments/img/environment_auto_stop_v13_10.pngbin0 -> 53602 bytes
-rw-r--r--doc/ci/environments/img/environments_dynamic_groups_v13_10.pngbin0 -> 57387 bytes
-rw-r--r--doc/ci/environments/img/environments_list.pngbin0 -> 17379 bytes
-rw-r--r--doc/ci/environments/img/environments_terminal_button_on_index_v13_10.pngbin0 -> 42113 bytes
-rw-r--r--doc/ci/environments/img/environments_terminal_button_on_show_v13_10.pngbin0 -> 53590 bytes
-rw-r--r--doc/ci/environments/index.md862
-rw-r--r--doc/ci/environments/protected_environments.md16
-rw-r--r--doc/ci/examples/README.md6
-rw-r--r--doc/ci/examples/authenticating-with-hashicorp-vault/index.md6
-rw-r--r--doc/ci/examples/deployment/README.md4
-rw-r--r--doc/ci/examples/deployment/composer-npm-deploy.md2
-rw-r--r--doc/ci/examples/end_to_end_testing_webdriverio/index.md22
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md4
-rw-r--r--doc/ci/examples/semantic-release.md4
-rw-r--r--doc/ci/examples/test-and-deploy-python-application-to-heroku.md101
-rw-r--r--doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md97
-rw-r--r--doc/ci/examples/test-clojure-application.md46
-rw-r--r--doc/ci/git_submodules.md96
-rw-r--r--doc/ci/img/deployments_view.pngbin23501 -> 12385 bytes
-rw-r--r--doc/ci/img/environment_auto_stop_v12_8.pngbin16587 -> 0 bytes
-rw-r--r--doc/ci/img/environments_available_13_10.pngbin0 -> 13245 bytes
-rw-r--r--doc/ci/img/environments_available_13_7.pngbin29124 -> 0 bytes
-rw-r--r--doc/ci/img/environments_dynamic_groups.pngbin21902 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_deployments.pngbin12635 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_environments.pngbin9485 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_jobs.pngbin8446 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_pipelines.pngbin14979 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_single_pipeline.pngbin10273 -> 0 bytes
-rw-r--r--doc/ci/img/environments_terminal_button_on_index.pngbin11080 -> 0 bytes
-rw-r--r--doc/ci/img/environments_terminal_button_on_show.pngbin7642 -> 0 bytes
-rw-r--r--doc/ci/img/pipelines_junit_test_report_ui_v12_5.pngbin15957 -> 0 bytes
-rw-r--r--doc/ci/img/pipelines_junit_test_report_v13_10.pngbin0 -> 16710 bytes
-rw-r--r--doc/ci/img/pipelines_junit_test_report_with_errors_v13_10.pngbin0 -> 18358 bytes
-rw-r--r--doc/ci/jobs/index.md4
-rw-r--r--doc/ci/merge_request_pipelines/index.md8
-rw-r--r--doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md2
-rw-r--r--doc/ci/metrics_reports.md10
-rw-r--r--doc/ci/multi_project_pipelines.md2
-rw-r--r--doc/ci/pipeline_editor/index.md39
-rw-r--r--doc/ci/pipelines/img/pipelines_settings_test_coverage.pngbin2549 -> 0 bytes
-rw-r--r--doc/ci/pipelines/index.md16
-rw-r--r--doc/ci/pipelines/schedules.md2
-rw-r--r--doc/ci/pipelines/settings.md106
-rw-r--r--doc/ci/quick_start/index.md15
-rw-r--r--doc/ci/review_apps/index.md20
-rw-r--r--doc/ci/runners/README.md4
-rw-r--r--doc/ci/ssh_keys/index.md6
-rw-r--r--doc/ci/test_cases/img/test_case_list_v13_6.pngbin70726 -> 0 bytes
-rw-r--r--doc/ci/test_cases/img/test_case_show_v13_10.pngbin0 -> 27067 bytes
-rw-r--r--doc/ci/test_cases/img/test_case_show_v13_6.pngbin63772 -> 0 bytes
-rw-r--r--doc/ci/test_cases/index.md12
-rw-r--r--doc/ci/triggers/README.md22
-rw-r--r--doc/ci/troubleshooting.md10
-rw-r--r--doc/ci/unit_test_reports.md16
-rw-r--r--doc/ci/variables/README.md4
-rw-r--r--doc/ci/variables/predefined_variables.md284
-rw-r--r--doc/ci/variables/where_variables_can_be_used.md1
-rw-r--r--doc/ci/yaml/README.md1139
-rw-r--r--doc/ci/yaml/gitlab_ci_yaml.md3
-rw-r--r--doc/ci/yaml/script.md35
-rw-r--r--doc/development/README.md3
-rw-r--r--doc/development/agent/user_stories.md2
-rw-r--r--doc/development/api_graphql_styleguide.md54
-rw-r--r--doc/development/application_limits.md12
-rw-r--r--doc/development/appsec/index.md32
-rw-r--r--doc/development/architecture.md18
-rw-r--r--doc/development/auto_devops.md6
-rw-r--r--doc/development/build_test_package.md4
-rw-r--r--doc/development/changelog.md5
-rw-r--r--doc/development/chatops_on_gitlabcom.md2
-rw-r--r--doc/development/cicd/templates.md10
-rw-r--r--doc/development/code_intelligence/index.md2
-rw-r--r--doc/development/code_review.md16
-rw-r--r--doc/development/contributing/issue_workflow.md6
-rw-r--r--doc/development/contributing/merge_request_workflow.md5
-rw-r--r--doc/development/contributing/style_guides.md16
-rw-r--r--doc/development/database/client_side_connection_pool.md2
-rw-r--r--doc/development/database/index.md1
-rw-r--r--doc/development/database/setting_multiple_values.md59
-rw-r--r--doc/development/database_query_comments.md17
-rw-r--r--doc/development/directory_structure.md58
-rw-r--r--doc/development/distributed_tracing.md2
-rw-r--r--doc/development/documentation/feature_flags.md6
-rw-r--r--doc/development/documentation/site_architecture/index.md4
-rw-r--r--doc/development/documentation/site_architecture/release_process.md228
-rw-r--r--doc/development/documentation/styleguide.md8
-rw-r--r--doc/development/documentation/styleguide/index.md37
-rw-r--r--doc/development/documentation/testing.md6
-rw-r--r--doc/development/elasticsearch.md105
-rw-r--r--doc/development/emails.md5
-rw-r--r--doc/development/experiment_guide/experimentation.md399
-rw-r--r--doc/development/experiment_guide/gitlab_experiment.md547
-rw-r--r--doc/development/experiment_guide/index.md397
-rw-r--r--doc/development/export_csv.md2
-rw-r--r--doc/development/fe_guide/accessibility.md193
-rw-r--r--doc/development/fe_guide/architecture.md7
-rw-r--r--doc/development/fe_guide/dark_mode.md4
-rw-r--r--doc/development/fe_guide/dependencies.md2
-rw-r--r--doc/development/fe_guide/editor_lite.md222
-rw-r--r--doc/development/fe_guide/graphql.md61
-rw-r--r--doc/development/fe_guide/index.md2
-rw-r--r--doc/development/fe_guide/keyboard_shortcuts.md63
-rw-r--r--doc/development/fe_guide/security.md8
-rw-r--r--doc/development/fe_guide/style/html.md23
-rw-r--r--doc/development/fe_guide/style/index.md2
-rw-r--r--doc/development/fe_guide/style/javascript.md23
-rw-r--r--doc/development/fe_guide/style/scss.md12
-rw-r--r--doc/development/fe_guide/style/vue.md36
-rw-r--r--doc/development/fe_guide/tooling.md91
-rw-r--r--doc/development/fe_guide/troubleshooting.md27
-rw-r--r--doc/development/fe_guide/vue.md8
-rw-r--r--doc/development/fe_guide/vuex.md11
-rw-r--r--doc/development/fe_guide/widgets.md143
-rw-r--r--doc/development/feature_flags/controls.md18
-rw-r--r--doc/development/feature_flags/development.md594
-rw-r--r--doc/development/feature_flags/index.md657
-rw-r--r--doc/development/feature_flags/process.md177
-rw-r--r--doc/development/features_inside_dot_gitlab.md4
-rw-r--r--doc/development/gemfile.md55
-rw-r--r--doc/development/geo/framework.md13
-rw-r--r--doc/development/git_object_deduplication.md5
-rw-r--r--doc/development/go_guide/index.md16
-rw-r--r--doc/development/graphql_guide/graphql_pro.md4
-rw-r--r--doc/development/graphql_guide/index.md2
-rw-r--r--doc/development/i18n/translation.md12
-rw-r--r--doc/development/image_scaling.md2
-rw-r--r--doc/development/integrations/jenkins.md58
-rw-r--r--doc/development/integrations/jira_connect.md2
-rw-r--r--doc/development/integrations/secure.md34
-rw-r--r--doc/development/integrations/secure_partner_integration.md4
-rw-r--r--doc/development/internal_api.md16
-rw-r--r--doc/development/licensed_feature_availability.md10
-rw-r--r--doc/development/maintenance_mode.md2
-rw-r--r--doc/development/merge_request_performance_guidelines.md2
-rw-r--r--doc/development/migration_style_guide.md33
-rw-r--r--doc/development/multi_version_compatibility.md2
-rw-r--r--doc/development/namespaces_storage_statistics.md6
-rw-r--r--doc/development/new_fe_guide/development/components.md2
-rw-r--r--doc/development/new_fe_guide/tips.md8
-rw-r--r--doc/development/packages.md60
-rw-r--r--doc/development/performance.md111
-rw-r--r--doc/development/pipelines.md43
-rw-r--r--doc/development/product_analytics/usage_ping.md4
-rw-r--r--doc/development/prometheus.md8
-rw-r--r--doc/development/query_performance.md4
-rw-r--r--doc/development/rake_tasks.md4
-rw-r--r--doc/development/redis.md9
-rw-r--r--doc/development/secure_coding_guidelines.md2
-rw-r--r--doc/development/service_measurement.md2
-rw-r--r--doc/development/sidekiq_style_guide.md2
-rw-r--r--doc/development/snowplow.md7
-rw-r--r--doc/development/sql.md14
-rw-r--r--doc/development/testing_guide/best_practices.md16
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md6
-rw-r--r--doc/development/testing_guide/end_to_end/dynamic_element_validation.md6
-rw-r--r--doc/development/testing_guide/end_to_end/environment_selection.md2
-rw-r--r--doc/development/testing_guide/end_to_end/feature_flags.md4
-rw-r--r--doc/development/testing_guide/end_to_end/page_objects.md2
-rw-r--r--doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md2
-rw-r--r--doc/development/testing_guide/end_to_end/style_guide.md2
-rw-r--r--doc/development/testing_guide/frontend_testing.md161
-rw-r--r--doc/development/testing_guide/review_apps.md4
-rw-r--r--doc/development/transient/prevention-patterns.md2
-rw-r--r--doc/development/usage_ping.md1189
-rw-r--r--doc/development/usage_ping/dictionary.md18170
-rw-r--r--doc/development/usage_ping/index.md1337
-rw-r--r--doc/development/usage_ping/metrics_dictionary.md33
-rw-r--r--doc/development/usage_ping/product_intelligence_review.md80
-rw-r--r--doc/development/value_stream_analytics.md6
-rw-r--r--doc/development/wikis.md2
-rw-r--r--doc/gitlab-basics/create-branch.md2
-rw-r--r--doc/gitlab-basics/feature_branch_workflow.md2
-rw-r--r--doc/gitlab-basics/index.md6
-rw-r--r--doc/gitlab-basics/start-using-git.md61
-rw-r--r--doc/install/aws/index.md29
-rw-r--r--doc/install/azure/index.md6
-rw-r--r--doc/install/digitaloceandocker.md2
-rw-r--r--doc/install/docker.md2
-rw-r--r--doc/install/google_cloud_platform/index.md2
-rw-r--r--doc/install/index.md105
-rw-r--r--doc/install/installation.md15
-rw-r--r--doc/install/openshift_and_gitlab/index.md4
-rw-r--r--doc/install/postgresql_extensions.md10
-rw-r--r--doc/install/relative_url.md2
-rw-r--r--doc/install/requirements.md29
-rw-r--r--doc/integration/README.md5
-rw-r--r--doc/integration/akismet.md2
-rw-r--r--doc/integration/auth0.md2
-rw-r--r--doc/integration/azure.md106
-rw-r--r--doc/integration/bitbucket.md11
-rw-r--r--doc/integration/cas.md2
-rw-r--r--doc/integration/elasticsearch.md85
-rw-r--r--doc/integration/external-issue-tracker.md2
-rw-r--r--doc/integration/facebook.md2
-rw-r--r--doc/integration/github.md17
-rw-r--r--doc/integration/gitlab.md2
-rw-r--r--doc/integration/gitpod.md7
-rw-r--r--doc/integration/gmail_action_buttons_for_gitlab.md2
-rw-r--r--doc/integration/google.md2
-rw-r--r--doc/integration/img/oauth_provider_admin_application.pngbin17071 -> 0 bytes
-rw-r--r--doc/integration/jenkins.md14
-rw-r--r--doc/integration/jenkins_deprecated.md4
-rw-r--r--doc/integration/oauth2_generic.md2
-rw-r--r--doc/integration/omniauth.md3
-rw-r--r--doc/integration/openid_connect_provider.md2
-rw-r--r--doc/integration/recaptcha.md2
-rw-r--r--doc/integration/salesforce.md2
-rw-r--r--doc/integration/saml.md20
-rw-r--r--doc/integration/shibboleth.md2
-rw-r--r--doc/integration/slash_commands.md2
-rw-r--r--doc/integration/trello_power_up.md2
-rw-r--r--doc/integration/twitter.md2
-rw-r--r--doc/intro/index.md2
-rw-r--r--doc/operations/feature_flags.md6
-rw-r--r--doc/operations/incident_management/img/custom_alert_mapping_v13_10.pngbin0 -> 100141 bytes
-rw-r--r--doc/operations/incident_management/incidents.md2
-rw-r--r--doc/operations/incident_management/integrations.md35
-rw-r--r--doc/operations/incident_management/paging.md12
-rw-r--r--doc/operations/incident_management/status_page.md2
-rw-r--r--doc/operations/metrics/dashboards/variables.md2
-rw-r--r--doc/operations/metrics/embed.md4
-rw-r--r--doc/operations/metrics/embed_grafana.md101
-rw-r--r--doc/operations/metrics/img/grafana_embedded.pngbin28071 -> 0 bytes
-rw-r--r--doc/operations/metrics/img/grafana_live_embed.pngbin44603 -> 0 bytes
-rw-r--r--doc/operations/metrics/img/grafana_panel_v12_5.pngbin44193 -> 0 bytes
-rw-r--r--doc/operations/metrics/img/grafana_sharing_dialog_v12_5.pngbin41203 -> 0 bytes
-rw-r--r--doc/operations/metrics/img/http_proxy_access_v12_5.pngbin47813 -> 0 bytes
-rw-r--r--doc/operations/metrics/img/select_query_variables_v12_5.pngbin7368 -> 0 bytes
-rw-r--r--doc/raketasks/backup_restore.md6
-rw-r--r--doc/raketasks/index.md2
-rw-r--r--doc/security/README.md1
-rw-r--r--doc/security/token_overview.md108
-rw-r--r--doc/security/two_factor_authentication.md13
-rw-r--r--doc/ssh/README.md314
-rw-r--r--doc/subscriptions/bronze_starter.md15
-rw-r--r--doc/subscriptions/gitlab_com/index.md6
-rw-r--r--doc/topics/autodevops/customize.md66
-rw-r--r--doc/topics/autodevops/img/alexj_autodevops_min_v13_8.pngbin20836 -> 0 bytes
-rw-r--r--doc/topics/autodevops/img/kai_autodevops_min_v13_8.pngbin39770 -> 0 bytes
-rw-r--r--doc/topics/autodevops/index.md510
-rw-r--r--doc/topics/autodevops/quick_start_guide.md8
-rw-r--r--doc/topics/autodevops/requirements.md12
-rw-r--r--doc/topics/autodevops/stages.md108
-rw-r--r--doc/topics/autodevops/troubleshooting.md247
-rw-r--r--doc/topics/autodevops/upgrading_auto_deploy_dependencies.md10
-rw-r--r--doc/topics/autodevops/upgrading_postgresql.md4
-rw-r--r--doc/topics/git/cherry_picking.md53
-rw-r--r--doc/topics/git/feature_branch_development.md6
-rw-r--r--doc/topics/git/how_to_install_git/index.md4
-rw-r--r--doc/topics/git/index.md8
-rw-r--r--doc/topics/git/lfs/index.md43
-rw-r--r--doc/topics/git/numerous_undo_possibilities_in_git/index.md2
-rw-r--r--doc/topics/git/partial_clone.md14
-rw-r--r--doc/topics/git/tags.md41
-rw-r--r--doc/topics/git/troubleshooting_git.md2
-rw-r--r--doc/topics/gitlab_flow.md2
-rw-r--r--doc/university/index.md6
-rw-r--r--doc/university/training/gitlab_flow/feature_branches.pngbin6202 -> 0 bytes
-rw-r--r--doc/university/training/index.md1
-rw-r--r--doc/university/training/topics/cherry_picking.md36
-rw-r--r--doc/university/training/topics/tags.md52
-rw-r--r--doc/update/index.md76
-rw-r--r--doc/update/upgrading_from_ce_to_ee.md4
-rw-r--r--doc/update/upgrading_from_source.md163
-rw-r--r--doc/user/abuse_reports.md4
-rw-r--r--doc/user/admin_area/analytics/index.md1
-rw-r--r--doc/user/admin_area/analytics/instance_statistics.md8
-rw-r--r--doc/user/admin_area/analytics/usage_trends.md19
-rw-r--r--doc/user/admin_area/analytics/user_cohorts.md36
-rw-r--r--doc/user/admin_area/approving_users.md49
-rw-r--r--doc/user/admin_area/credentials_inventory.md44
-rw-r--r--doc/user/admin_area/img/cohorts_v13_9.png (renamed from doc/user/admin_area/analytics/img/cohorts_v13_9.png)bin62434 -> 62434 bytes
-rw-r--r--doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.pngbin0 -> 62501 bytes
-rw-r--r--doc/user/admin_area/img/credentials_inventory_v13_10.pngbin0 -> 100241 bytes
-rw-r--r--doc/user/admin_area/img/credentials_inventory_v13_4.pngbin28945 -> 0 bytes
-rw-r--r--doc/user/admin_area/index.md80
-rw-r--r--doc/user/admin_area/license.md2
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md28
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md17
-rw-r--r--doc/user/admin_area/settings/email.md2
-rw-r--r--doc/user/admin_area/settings/index.md2
-rw-r--r--doc/user/admin_area/settings/instance_template_repository.md12
-rw-r--r--doc/user/admin_area/settings/project_integration_management.md2
-rw-r--r--doc/user/admin_area/settings/push_event_activities_limit.md2
-rw-r--r--doc/user/admin_area/settings/sign_up_restrictions.md25
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md2
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md6
-rw-r--r--doc/user/admin_area/user_cohorts.md36
-rw-r--r--doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.pngbin0 -> 12299 bytes
-rw-r--r--doc/user/analytics/index.md2
-rw-r--r--doc/user/analytics/merge_request_analytics.md9
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_configuration_snippet_v13.10.pngbin0 -> 27293 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.pngbin0 -> 22389 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.pngbin0 -> 17801 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.pngbin0 -> 21915 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/index.md253
-rw-r--r--doc/user/application_security/configuration/index.md22
-rw-r--r--doc/user/application_security/container_scanning/index.md6
-rw-r--r--doc/user/application_security/coverage_fuzzing/index.md2
-rw-r--r--doc/user/application_security/dast/img/dast_single_v13_0.pngbin135324 -> 0 bytes
-rw-r--r--doc/user/application_security/dast/index.md229
-rw-r--r--doc/user/application_security/dependency_list/index.md62
-rw-r--r--doc/user/application_security/dependency_scanning/index.md37
-rw-r--r--doc/user/application_security/img/create_mr_from_vulnerability_v13_4.pngbin33743 -> 49215 bytes
-rw-r--r--doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.pngbin15394 -> 0 bytes
-rw-r--r--doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.pngbin33345 -> 0 bytes
-rw-r--r--doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gifbin35842 -> 0 bytes
-rw-r--r--doc/user/application_security/index.md171
-rw-r--r--doc/user/application_security/offline_deployments/index.md4
-rw-r--r--doc/user/application_security/sast/index.md55
-rw-r--r--doc/user/application_security/secret_detection/index.md11
-rw-r--r--doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.pngbin0 -> 80367 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/security_center_dashboard_empty_v13_4.pngbin13264 -> 0 bytes
-rw-r--r--doc/user/application_security/security_dashboard/index.md24
-rw-r--r--doc/user/application_security/threat_monitoring/index.md4
-rw-r--r--doc/user/application_security/vulnerabilities/index.md33
-rw-r--r--doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.pngbin37066 -> 0 bytes
-rw-r--r--doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.pngbin0 -> 41154 bytes
-rw-r--r--doc/user/application_security/vulnerability_report/img/project_security_dashboard_v13_9.pngbin56375 -> 0 bytes
-rw-r--r--doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.pngbin31816 -> 0 bytes
-rw-r--r--doc/user/application_security/vulnerability_report/index.md168
-rw-r--r--doc/user/asciidoc.md6
-rw-r--r--doc/user/clusters/agent/index.md214
-rw-r--r--doc/user/clusters/applications.md27
-rw-r--r--doc/user/clusters/management_project.md2
-rw-r--r--doc/user/compliance/license_compliance/index.md13
-rw-r--r--doc/user/discussions/index.md204
-rw-r--r--doc/user/gitlab_com/index.md2
-rw-r--r--doc/user/group/custom_project_templates.md4
-rw-r--r--doc/user/group/epics/index.md2
-rw-r--r--doc/user/group/epics/manage_epics.md5
-rw-r--r--doc/user/group/img/access_requests_management.pngbin22616 -> 0 bytes
-rw-r--r--doc/user/group/img/add_new_members_v13_7.pngbin58897 -> 0 bytes
-rw-r--r--doc/user/group/img/create_new_group_info.pngbin27101 -> 0 bytes
-rw-r--r--doc/user/group/img/create_new_project_from_group_v13_6.pngbin40062 -> 0 bytes
-rw-r--r--doc/user/group/img/group_activity_analytics_v12_10.pngbin56709 -> 0 bytes
-rw-r--r--doc/user/group/img/group_activity_analytics_v13_10.pngbin0 -> 12597 bytes
-rw-r--r--doc/user/group/img/group_file_template_dropdown.pngbin9516 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_2fa_disabled_13_7.pngbin39226 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_2fa_enabled_13_7.pngbin41497 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_direct_13_7.pngbin40549 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_inherited_13_7.pngbin43436 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_search_13_7.pngbin28622 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_sort_13_7.pngbin41897 -> 0 bytes
-rw-r--r--doc/user/group/img/group_settings.pngbin51335 -> 0 bytes
-rw-r--r--doc/user/group/img/groups.pngbin61507 -> 0 bytes
-rw-r--r--doc/user/group/img/ldap_sync_cn_v13_1.pngbin38094 -> 0 bytes
-rw-r--r--doc/user/group/img/ldap_sync_filter_v13_1.pngbin44302 -> 0 bytes
-rw-r--r--doc/user/group/img/manual_permissions_v13_7.pngbin69289 -> 0 bytes
-rw-r--r--doc/user/group/img/member_lock.pngbin3168 -> 0 bytes
-rw-r--r--doc/user/group/img/new_group_from_groups.pngbin25256 -> 0 bytes
-rw-r--r--doc/user/group/img/new_group_from_other_pages.pngbin21593 -> 0 bytes
-rw-r--r--doc/user/group/img/request_access_button.pngbin36258 -> 0 bytes
-rw-r--r--doc/user/group/img/select_group_dropdown.pngbin64359 -> 0 bytes
-rw-r--r--doc/user/group/img/select_group_dropdown_13_10.pngbin0 -> 11986 bytes
-rw-r--r--doc/user/group/img/share_with_group_lock.pngbin7493 -> 0 bytes
-rw-r--r--doc/user/group/img/withdraw_access_request_button.pngbin36782 -> 0 bytes
-rw-r--r--doc/user/group/import/index.md38
-rw-r--r--doc/user/group/index.md856
-rw-r--r--doc/user/group/repositories_analytics/index.md3
-rw-r--r--doc/user/group/roadmap/index.md2
-rw-r--r--doc/user/group/saml_sso/group_managed_accounts.md12
-rw-r--r--doc/user/group/saml_sso/index.md37
-rw-r--r--doc/user/group/saml_sso/scim_setup.md9
-rw-r--r--doc/user/group/subgroups/index.md6
-rw-r--r--doc/user/group/value_stream_analytics/img/delete_value_stream_v13_4.png (renamed from doc/user/group/value_stream_analytics/img/delete_value_stream_v13.4.png)bin29439 -> 29439 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/extended_value_stream_form_v13_10.pngbin0 -> 259265 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.pngbin0 -> 47083 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.pngbin0 -> 43974 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_3.png (renamed from doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13.3.png)bin33694 -> 33694 bytes
-rw-r--r--doc/user/group/value_stream_analytics/index.md53
-rw-r--r--doc/user/img/gitlab_snippet_v13_0.pngbin28925 -> 0 bytes
-rw-r--r--doc/user/img/gitlab_snippet_v13_5.pngbin20563 -> 0 bytes
-rw-r--r--doc/user/img/new_personal_snippet_from_project_v12_10.pngbin77106 -> 0 bytes
-rw-r--r--doc/user/img/new_personal_snippet_v12_10.pngbin39878 -> 0 bytes
-rw-r--r--doc/user/index.md16
-rw-r--r--doc/user/infrastructure/index.md4
-rw-r--r--doc/user/infrastructure/terraform_state.md14
-rw-r--r--doc/user/markdown.md49
-rw-r--r--doc/user/packages/conan_repository/index.md9
-rw-r--r--doc/user/packages/container_registry/index.md8
-rw-r--r--doc/user/packages/dependency_proxy/index.md32
-rw-r--r--doc/user/packages/generic_packages/index.md22
-rw-r--r--doc/user/packages/go_proxy/index.md2
-rw-r--r--doc/user/packages/index.md5
-rw-r--r--doc/user/packages/npm_registry/index.md26
-rw-r--r--doc/user/packages/nuget_repository/index.md2
-rw-r--r--doc/user/packages/package_registry/index.md4
-rw-r--r--doc/user/packages/pypi_repository/index.md18
-rw-r--r--doc/user/packages/workflows/monorepo.md9
-rw-r--r--doc/user/packages/workflows/project_registry.md5
-rw-r--r--doc/user/permissions.md12
-rw-r--r--doc/user/profile/account/two_factor_authentication.md24
-rw-r--r--doc/user/profile/img/busy_indicator_note_header_v13_9.pngbin0 -> 24006 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_notes_v13_9.pngbin0 -> 41947 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_profile_page_v13_6.pngbin0 -> 25119 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_settings_menu_v13_6.pngbin0 -> 26843 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.pngbin0 -> 6190 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_sidebar_v13_9.pngbin0 -> 21914 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_user_popovers_v13_6.pngbin0 -> 32158 bytes
-rw-r--r--doc/user/profile/img/busy_status_indicator_v13_6.pngbin13763 -> 0 bytes
-rw-r--r--doc/user/profile/img/change_password_v13_0.pngbin15919 -> 0 bytes
-rw-r--r--doc/user/profile/img/profile_following_v13_9.pngbin162916 -> 0 bytes
-rw-r--r--doc/user/profile/index.md250
-rw-r--r--doc/user/profile/notifications.md3
-rw-r--r--doc/user/profile/personal_access_tokens.md2
-rw-r--r--doc/user/profile/preferences.md11
-rw-r--r--doc/user/project/autocomplete_characters.md47
-rw-r--r--doc/user/project/badges.md6
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md10
-rw-r--r--doc/user/project/clusters/index.md21
-rw-r--r--doc/user/project/clusters/protect/container_host_security/quick_start_guide.md4
-rw-r--r--doc/user/project/clusters/protect/container_network_security/quick_start_guide.md4
-rw-r--r--doc/user/project/clusters/serverless/aws.md9
-rw-r--r--doc/user/project/clusters/serverless/index.md8
-rw-r--r--doc/user/project/code_intelligence.md7
-rw-r--r--doc/user/project/deploy_boards.md12
-rw-r--r--doc/user/project/deploy_tokens/index.md29
-rw-r--r--doc/user/project/description_templates.md112
-rw-r--r--doc/user/project/file_lock.md32
-rw-r--r--doc/user/project/git_attributes.md2
-rw-r--r--doc/user/project/img/autocomplete_characters_example1_v12_0.pngbin17510 -> 0 bytes
-rw-r--r--doc/user/project/img/autocomplete_characters_example2_v12_0.pngbin14623 -> 0 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.pngbin41386 -> 0 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.pngbin0 -> 30238 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_protected_branch_v12_4.pngbin16195 -> 0 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_protected_branch_v13_10.pngbin0 -> 17263 bytes
-rw-r--r--doc/user/project/img/description_templates_issue_settings.pngbin9315 -> 0 bytes
-rw-r--r--doc/user/project/img/description_templates_merge_request_settings.pngbin49367 -> 0 bytes
-rw-r--r--doc/user/project/img/issue_boards_remove_issue_v13_6.pngbin27886 -> 0 bytes
-rw-r--r--doc/user/project/import/github.md9
-rw-r--r--doc/user/project/index.md4
-rw-r--r--doc/user/project/integrations/bamboo.md2
-rw-r--r--doc/user/project/integrations/bugzilla.md2
-rw-r--r--doc/user/project/integrations/custom_issue_tracker.md2
-rw-r--r--doc/user/project/integrations/discord_notifications.md2
-rw-r--r--doc/user/project/integrations/emails_on_push.md2
-rw-r--r--doc/user/project/integrations/github.md2
-rw-r--r--doc/user/project/integrations/hangouts_chat.md2
-rw-r--r--doc/user/project/integrations/hipchat.md2
-rw-r--r--doc/user/project/integrations/img/mattermost_config_help.pngbin102890 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_console_integrations.pngbin114618 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_goto_console.pngbin7746 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_slash_command_configuration.pngbin24162 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_slash_command_token.pngbin8624 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_team_integrations.pngbin4757 -> 0 bytes
-rw-r--r--doc/user/project/integrations/index.md2
-rw-r--r--doc/user/project/integrations/irker.md2
-rw-r--r--doc/user/project/integrations/jira.md2
-rw-r--r--doc/user/project/integrations/jira_cloud_configuration.md2
-rw-r--r--doc/user/project/integrations/jira_integrations.md2
-rw-r--r--doc/user/project/integrations/jira_server_configuration.md2
-rw-r--r--doc/user/project/integrations/mattermost.md2
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md161
-rw-r--r--doc/user/project/integrations/microsoft_teams.md2
-rw-r--r--doc/user/project/integrations/mock_ci.md2
-rw-r--r--doc/user/project/integrations/overview.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/cloudwatch.md35
-rw-r--r--doc/user/project/integrations/redmine.md2
-rw-r--r--doc/user/project/integrations/servicenow.md2
-rw-r--r--doc/user/project/integrations/services_templates.md2
-rw-r--r--doc/user/project/integrations/slack.md2
-rw-r--r--doc/user/project/integrations/unify_circuit.md2
-rw-r--r--doc/user/project/integrations/webex_teams.md2
-rw-r--r--doc/user/project/integrations/webhooks.md24
-rw-r--r--doc/user/project/integrations/youtrack.md2
-rw-r--r--doc/user/project/issue_board.md101
-rw-r--r--doc/user/project/issues/associate_zoom_meeting.md2
-rw-r--r--doc/user/project/issues/design_management.md2
-rw-r--r--doc/user/project/issues/index.md22
-rw-r--r--doc/user/project/issues/issue_data_and_actions.md8
-rw-r--r--doc/user/project/issues/managing_issues.md4
-rw-r--r--doc/user/project/members/img/project_members_filter_v12_6.pngbin6381 -> 0 bytes
-rw-r--r--doc/user/project/members/index.md29
-rw-r--r--doc/user/project/members/share_project_with_groups.md2
-rw-r--r--doc/user/project/merge_requests/allow_collaboration.md12
-rw-r--r--doc/user/project/merge_requests/authorization_for_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/browser_performance_testing.md9
-rw-r--r--doc/user/project/merge_requests/code_quality.md18
-rw-r--r--doc/user/project/merge_requests/creating_merge_requests.md17
-rw-r--r--doc/user/project/merge_requests/drafts.md99
-rw-r--r--doc/user/project/merge_requests/fast_forward_merge.md8
-rw-r--r--doc/user/project/merge_requests/getting_started.md70
-rw-r--r--doc/user/project/merge_requests/img/comment-on-any-diff-line.pngbin33199 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.pngbin0 -> 21304 bytes
-rw-r--r--doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.pngbin0 -> 4958 bytes
-rw-r--r--doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.pngbin11774 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.pngbin0 -> 3453 bytes
-rw-r--r--doc/user/project/merge_requests/img/filter_wip_merge_requests.pngbin11017 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/multiline-comment-highlighted.pngbin38822 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.pngbin32970 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.pngbin0 -> 39889 bytes
-rw-r--r--doc/user/project/merge_requests/img/update_approval_rule_v13_10.pngbin0 -> 42956 bytes
-rw-r--r--doc/user/project/merge_requests/img/update_approval_rule_v13_4.pngbin32006 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/index.md35
-rw-r--r--doc/user/project/merge_requests/load_performance_testing.md6
-rw-r--r--doc/user/project/merge_requests/merge_request_approvals.md13
-rw-r--r--doc/user/project/merge_requests/merge_request_dependencies.md7
-rw-r--r--doc/user/project/merge_requests/merge_when_pipeline_succeeds.md4
-rw-r--r--doc/user/project/merge_requests/resolve_conflicts.md2
-rw-r--r--doc/user/project/merge_requests/revert_changes.md26
-rw-r--r--doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md28
-rw-r--r--doc/user/project/merge_requests/squash_and_merge.md20
-rw-r--r--doc/user/project/merge_requests/test_coverage_visualization.md33
-rw-r--r--doc/user/project/merge_requests/versions.md2
-rw-r--r--doc/user/project/merge_requests/work_in_progress_merge_requests.md78
-rw-r--r--doc/user/project/milestones/burndown_charts.md8
-rw-r--r--doc/user/project/pages/getting_started/pages_ci_cd_template.md2
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md4
-rw-r--r--doc/user/project/pages/index.md4
-rw-r--r--doc/user/project/protected_branches.md60
-rw-r--r--doc/user/project/push_options.md10
-rw-r--r--doc/user/project/quick_actions.md199
-rw-r--r--doc/user/project/releases/index.md17
-rw-r--r--doc/user/project/repository/branches/img/branch_filter_search_box.pngbin23522 -> 0 bytes
-rw-r--r--doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.pngbin0 -> 48672 bytes
-rw-r--r--doc/user/project/repository/branches/img/compare_branches.pngbin62436 -> 0 bytes
-rw-r--r--doc/user/project/repository/branches/img/compare_branches_v13_10.pngbin0 -> 82538 bytes
-rw-r--r--doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.pngbin0 -> 17166 bytes
-rw-r--r--doc/user/project/repository/branches/index.md28
-rw-r--r--doc/user/project/repository/file_finder.md2
-rw-r--r--doc/user/project/repository/forking_workflow.md16
-rw-r--r--doc/user/project/repository/git_blame.md9
-rw-r--r--doc/user/project/repository/git_history.md9
-rw-r--r--doc/user/project/repository/gpg_signed_commits/index.md11
-rw-r--r--doc/user/project/repository/index.md55
-rw-r--r--doc/user/project/repository/jupyter_notebooks/index.md4
-rw-r--r--doc/user/project/repository/repository_mirroring.md211
-rw-r--r--doc/user/project/repository/web_editor.md4
-rw-r--r--doc/user/project/repository/x509_signed_commits/index.md4
-rw-r--r--doc/user/project/requirements/index.md10
-rw-r--r--doc/user/project/service_desk.md6
-rw-r--r--doc/user/project/settings/import_export.md4
-rw-r--r--doc/user/project/settings/index.md16
-rw-r--r--doc/user/project/settings/project_access_tokens.md30
-rw-r--r--doc/user/project/static_site_editor/index.md2
-rw-r--r--doc/user/project/time_tracking.md3
-rw-r--r--doc/user/project/web_ide/img/solarized_dark_theme_v13_1.pngbin117131 -> 43014 bytes
-rw-r--r--doc/user/project/web_ide/img/solarized_light_theme_v13_0.pngbin99981 -> 0 bytes
-rw-r--r--doc/user/project/web_ide/index.md19
-rw-r--r--doc/user/project/wiki/index.md74
-rw-r--r--doc/user/project/working_with_projects.md4
-rw-r--r--doc/user/search/advanced_global_search.md70
-rw-r--r--doc/user/search/advanced_search.md (renamed from doc/user/search/advanced_search_syntax.md)77
-rw-r--r--doc/user/search/img/advanced_global_search.pngbin15017 -> 0 bytes
-rw-r--r--doc/user/search/img/advanced_search_v13.10.pngbin0 -> 46767 bytes
-rw-r--r--doc/user/search/index.md23
-rw-r--r--doc/user/shortcuts.md117
-rw-r--r--doc/user/snippets.md282
-rw-r--r--doc/user/upgrade_email_bypass.md4
718 files changed, 40279 insertions, 130996 deletions
diff --git a/doc/.vale/gitlab/Admin.yml b/doc/.vale/gitlab/Admin.yml
index d74621bde8e..560752594d5 100644
--- a/doc/.vale/gitlab/Admin.yml
+++ b/doc/.vale/gitlab/Admin.yml
@@ -6,7 +6,7 @@
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: substitution
message: 'Verify this use of the word "admin". Can it be updated to "administration", "administrator", "administer", or "Admin Area"?'
-link: https://docs.gitlab.com/ee/development/documentation/styleguide.html
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
level: suggestion
ignorecase: true
swap:
diff --git a/doc/.vale/gitlab/AlertBoxStyle.yml b/doc/.vale/gitlab/AlertBoxStyle.yml
index 92c3a16cab8..5912c4707fd 100644
--- a/doc/.vale/gitlab/AlertBoxStyle.yml
+++ b/doc/.vale/gitlab/AlertBoxStyle.yml
@@ -10,7 +10,7 @@
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: existence
message: 'Alert box "%s" must use the formatting in the style guide.'
-link: https://docs.gitlab.com/ee/development/documentation/styleguide.html#alert-boxes
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#alert-boxes
level: error
nonword: true
scope: raw
diff --git a/doc/.vale/gitlab/BadgeCapitalization.yml b/doc/.vale/gitlab/BadgeCapitalization.yml
index 3da5831ed56..89d6f509d63 100644
--- a/doc/.vale/gitlab/BadgeCapitalization.yml
+++ b/doc/.vale/gitlab/BadgeCapitalization.yml
@@ -10,35 +10,4 @@ link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
level: error
scope: raw
raw:
- - '(\*\*\(Core\)\*\*|'
- - '\*\*\(core\)\*\*|'
- - '\*\*\(Starter\)\*\*|'
- - '\*\*\(starter\)\*\*|'
- - '\*\*\(Premium\)\*\*|'
- - '\*\*\(premium\)\*\*|'
- - '\*\*\(Ultimate\)\*\*|'
- - '\*\*\(ultimate\)\*\*|'
- - '\*\*\(Core Only\)\*\*|'
- - '\*\*\(Core only\)\*\*|'
- - '\*\*\(core only\)\*\*|'
- - '\*\*\(Starter Only\)\*\*|'
- - '\*\*\(Starter only\)\*\*|'
- - '\*\*\(starter only\)\*\*|'
- - '\*\*\(Premium Only\)\*\*|'
- - '\*\*\(Premium only\)\*\*|'
- - '\*\*\(premium only\)\*\*|'
- - '\*\*\(Ultimate Only\)\*\*|'
- - '\*\*\(Ultimate only\)\*\*|'
- - '\*\*\(ultimate only\)\*\*|'
- - '\*\*\(Free Only\)\*\*|'
- - '\*\*\(Free only\)\*\*|'
- - '\*\*\(free only\)\*\*|'
- - '\*\*\(Bronze Only\)\*\*|'
- - '\*\*\(Bronze only\)\*\*|'
- - '\*\*\(bronze only\)\*\*|'
- - '\*\*\(Silver Only\)\*\*|'
- - '\*\*\(Silver only\)\*\*|'
- - '\*\*\(silver only\)\*\*|'
- - '\*\*\(Gold Only\)\*\*|'
- - '\*\*\(Gold only\)\*\*|'
- - '\*\*\(gold only\)\*\*)'
+ - '\*\*\(([Ff]ree|[Pp]remium|[Uu]ltimate)( [Ss](elf|ass))?\)\*\*'
diff --git a/doc/.vale/gitlab/DefaultBranch.yml b/doc/.vale/gitlab/DefaultBranch.yml
new file mode 100644
index 00000000000..4bc68433c6d
--- /dev/null
+++ b/doc/.vale/gitlab/DefaultBranch.yml
@@ -0,0 +1,14 @@
+---
+# Warning: gitlab.DefaultBranch
+#
+# Do not refer to the default branch as the "master" branch, if possible.
+#
+# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+extends: existence
+message: 'Use "default branch" or `main` instead of `master`, when possible.'
+level: warning
+ignorecase: true
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
+scope: raw
+raw:
+ - '\`master\`'
diff --git a/doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml b/doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml
new file mode 100644
index 00000000000..ce6ce8b5691
--- /dev/null
+++ b/doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml
@@ -0,0 +1,13 @@
+---
+# Error: gitlab.RelativeLinksDoubleSlashes
+#
+# Checks for the presence of double slashes in relative URLs.
+#
+# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+extends: existence
+message: 'Relative links must not include a double slash.'
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#links-to-internal-documentation
+level: error
+scope: raw
+raw:
+ - '\.//'
diff --git a/doc/.vale/gitlab/SubstitutionSuggestions.yml b/doc/.vale/gitlab/SubstitutionSuggestions.yml
index eac738d9eec..d2b8b37b301 100644
--- a/doc/.vale/gitlab/SubstitutionSuggestions.yml
+++ b/doc/.vale/gitlab/SubstitutionSuggestions.yml
@@ -14,6 +14,7 @@ swap:
active user: '"billable user"'
active users: '"billable users"'
docs: '"documentation"'
+ GFM: '"GitLab Flavored Markdown"'
once that: '"after that"'
once the: '"after the"'
once you: '"after you"'
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 375cecfdee4..88d1d2555f1 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -41,6 +41,7 @@ autoscales
autoscaling
awardable
awardables
+Ayoa
Axios
Azure
B-tree
@@ -56,6 +57,7 @@ backtracing
badging
Bamboo
Bazel
+Bhyve
Bitbucket
blockquote
blockquoted
@@ -89,6 +91,7 @@ Certbot
changeset
changesets
chai
+ChaosKube
chatbot
chatbots
ChatOps
@@ -111,6 +114,8 @@ Contentful
Corosync
Coursier
cron
+cronjob
+cronjobs
crons
crontab
crontabs
@@ -122,6 +127,8 @@ CrowdIn
CSV
cybersecurity
Dangerfile
+datasource
+datasources
datetime
Debian
Decompressor
@@ -280,6 +287,7 @@ kaniko
Karma
Kerberos
keyset
+keyspace
keytab
keytabs
Kibana
@@ -350,6 +358,7 @@ mixins
mockup
mockups
ModSecurity
+Monokai
monorepo
monorepos
multiline
@@ -373,6 +382,7 @@ nullable
Nurtch
nyc
OAuth
+Octokit
offboarded
offboarding
offboards
@@ -404,9 +414,11 @@ Poedit
polyfill
polyfills
pooler
+postfixed
postgres.ai
PostgreSQL
precompile
+precompiled
preconfigure
preconfigured
preconfigures
@@ -421,6 +433,7 @@ prepend
prepended
prepending
prepends
+prepopulated
Prettifier
Pritaly
Priyanka
@@ -443,6 +456,7 @@ queryable
Quicktime
Rackspace
Raspbian
+rbtrace
Rdoc
reachability
Realplayer
@@ -477,6 +491,7 @@ reinitialize
reinitializing
relicensing
remediations
+replicables
repmgr
repmgrd
repurposing
@@ -519,10 +534,12 @@ Salesforce
sandboxing
sanitization
sbt
+scalers
scatterplot
scatterplots
Schemastore
scrollable
+Semgrep
Sendmail
Sentry
serializer
@@ -538,11 +555,13 @@ Sidekiq
Silverlight
Sisense
Sitespeed
+skippable
Slack
Slackbot
Slony
smartcard
smartcards
+snapshotting
Sobelow
Solarized
Sourcegraph
@@ -561,6 +580,9 @@ strace
strikethrough
strikethroughs
stunnel
+stylelint
+subchart
+subcharts
subfolder
subfolders
subgraph
@@ -620,12 +642,14 @@ todos
tokenizer
Tokenizers
tokenizing
+tolerations
toolchain
toolchains
toolkit
toolkits
tooltip
tooltips
+transactionally
transpile
transpiled
transpiles
@@ -634,6 +658,7 @@ Trello
triaged
triages
triaging
+Trivy
truthy
Truststore
Twilio
@@ -665,6 +690,9 @@ unencoded
unencoder
unencodes
unencrypted
+unfollow
+unfollowed
+unfollows
Unicorn
unindexed
unlink
@@ -703,6 +731,7 @@ unreplicated
unresolve
unresolved
unresolving
+unreviewed
unsanitized
unschedule
unscoped
@@ -720,6 +749,7 @@ unstash
unstashed
unstashing
unsynced
+unsynchronized
untarred
untracked
untrusted
@@ -772,3 +802,4 @@ Yubico
Zeitwerk
Zendesk
zsh
+Zstandard
diff --git a/doc/README.md b/doc/README.md
index 4c4b0cd3a15..1cc309bd957 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -67,7 +67,7 @@ We have the following documentation to rapidly uplift your GitLab knowledge:
| Topic | Description |
|:--------------------------------------------------------------------------------------------------|:------------|
| [GitLab basics guides](gitlab-basics/index.md) | Start working on the command line and with GitLab. |
-| [GitLab workflow overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/) | Enhance your workflow with the best of GitLab Workflow. |
+| [GitLab workflow overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/) | Enhance your workflow with the best of GitLab Workflow. |
| [Get started with GitLab CI/CD](ci/quick_start/index.md) | Quickly implement GitLab CI/CD. |
| [Auto DevOps](topics/autodevops/index.md) | Learn more about Auto DevOps in GitLab. |
| [GitLab Markdown](user/markdown.md) | Advanced formatting system (GitLab Flavored Markdown). |
@@ -80,7 +80,7 @@ Learn more about GitLab account management:
|:-----------------------------------------------------------|:------------|
| [User account](user/profile/index.md) | Manage your account. |
| [Authentication](topics/authentication/index.md) | Account security with two-factor authentication, set up your SSH keys, and deploy keys for secure access to your projects. |
-| [User settings](user/profile/index.md#user-settings) | Manage your user settings, two factor authentication, and more. |
+| [User settings](user/profile/index.md#access-your-user-settings) | Manage your user settings, two factor authentication, and more. |
| [User permissions](user/permissions.md) | Learn what each role in a project can do. |
### Git and GitLab
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index d5755474c00..9aa533d54f6 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -167,7 +167,7 @@ It may make the user interface for your project or audit events very busy, and t
to prevent performance degradations on GitLab instances with very high Git write traffic.
In an upcoming release, Audit Events for Git push events will be enabled
-by default. Follow [#7865](https://gitlab.com/gitlab-org/gitlab/-/issues/7865) for updates.
+by default. Follow our [Partitioning strategy for Audit Events epic](https://gitlab.com/groups/gitlab-org/-/epics/3206) for updates.
If you still wish to enable **Repository push** events in your instance, follow
the steps bellow.
diff --git a/doc/administration/auth/img/okta_admin_panel.png b/doc/administration/auth/img/okta_admin_panel.png
deleted file mode 100644
index 12e21956715..00000000000
--- a/doc/administration/auth/img/okta_admin_panel.png
+++ /dev/null
Binary files differ
diff --git a/doc/administration/auth/ldap/google_secure_ldap.md b/doc/administration/auth/ldap/google_secure_ldap.md
index 2b75d864352..55ccf6653a3 100644
--- a/doc/administration/auth/ldap/google_secure_ldap.md
+++ b/doc/administration/auth/ldap/google_secure_ldap.md
@@ -20,7 +20,7 @@ The steps below cover:
## Configuring Google LDAP client
-1. Navigate to <https://admin.google.com/Dashboard> and sign in as a Google Workspace domain administrator.
+1. Go to <https://admin.google.com/Dashboard> and sign in as a Google Workspace domain administrator.
1. Go to **Apps > LDAP > Add Client**.
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index 466ae8e108c..0e55efba8ae 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -180,9 +180,16 @@ production:
| `allow_username_or_email_login` | If enabled, GitLab ignores everything after the first `@` in the LDAP username submitted by the user on sign-in. If you are using `uid: 'userPrincipalName'` on ActiveDirectory you need to disable this setting, because the userPrincipalName contains an `@`. | no | boolean |
| `block_auto_created_users` | To maintain tight control over the number of billable users on your GitLab installation, enable this setting to keep new users blocked until they have been cleared by an administrator (default: false). | no | boolean |
| `base` | Base where we can search for users. | yes | `'ou=people,dc=gitlab,dc=example'` or `'DC=mydomain,DC=com'` |
-| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://tools.ietf.org/search/rfc4515) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | no | `'(employeeType=developer)'` or `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'` |
+| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://tools.ietf.org/search/rfc4515) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | no | For examples, read [Examples of user filters](#examples-of-user-filters). |
| `lowercase_usernames` | If lowercase_usernames is enabled, GitLab converts the name to lower case. | no | boolean |
+#### Examples of user filters
+
+Some examples of the `user_filter` field syntax:
+
+- `'(employeeType=developer)'`
+- `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'`
+
### SSL Configuration Settings **(FREE SELF)**
| Setting | Description | Required | Examples |
@@ -469,8 +476,8 @@ be mandatory and clients cannot be authenticated with the TLS protocol.
## Multiple LDAP servers **(PREMIUM SELF)**
-With GitLab Enterprise Edition Starter, you can configure multiple LDAP servers
-that your GitLab instance connects to.
+With GitLab, you can configure multiple LDAP servers that your GitLab instance
+connects to.
To add another LDAP server:
@@ -698,8 +705,8 @@ When enabled, the following applies:
To enable it you need to:
1. [Enable LDAP](#configuration)
-1. Navigate to **Admin Area > Settings -> Visibility and access controls**.
-1. Make sure the "Lock memberships to LDAP synchronization" checkbox is enabled.
+1. Go to **Admin Area > Settings > Visibility and access controls**.
+1. Make sure the **Lock memberships to LDAP synchronization** checkbox is selected.
### Adjusting LDAP group sync schedule **(PREMIUM SELF)**
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 438f591856b..f8360e331b6 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -191,7 +191,7 @@ have to be taken here:
will associate this profile to the LDAP identity.
The user can do either of these steps [in their
-profile](../../../user/profile/index.md#user-profile) or an administrator can do it.
+profile](../../../user/profile/index.md#access-your-user-profile) or an administrator can do it.
#### Debug LDAP user filter
@@ -330,10 +330,10 @@ things to check to debug the situation.
group](index.md#adding-group-links).
- Check that the user has an LDAP identity:
1. Sign in to GitLab as an administrator user.
- 1. Navigate to **Admin area -> Users**.
+ 1. Go to **Admin area > Users**.
1. Search for the user
- 1. Open the user, by clicking on their name. Do not click 'Edit'.
- 1. Navigate to the **Identities** tab. There should be an LDAP identity with
+ 1. Open the user by clicking their name. Do not click **Edit**.
+ 1. Select the **Identities** tab. There should be an LDAP identity with
an LDAP DN as the 'Identifier'. If not, this user hasn't signed in with
LDAP yet and must do so first.
- You've waited an hour or [the configured
diff --git a/doc/administration/auth/smartcard.md b/doc/administration/auth/smartcard.md
index dfeee5e7ac4..39c47c6c495 100644
--- a/doc/administration/auth/smartcard.md
+++ b/doc/administration/auth/smartcard.md
@@ -117,9 +117,15 @@ attribute. As a prerequisite, you must use an LDAP server that:
```ruby
gitlab_rails['smartcard_enabled'] = true
gitlab_rails['smartcard_ca_file'] = "/etc/ssl/certs/CA.pem"
+ gitlab_rails['smartcard_client_certificate_required_host'] = "smartcard.example.com"
gitlab_rails['smartcard_client_certificate_required_port'] = 3444
```
+ NOTE: **Note**
+ Assign a value to at least one of the following variables:
+ gitlab_rails['smartcard_client_certificate_required_host'] or
+ gitlab_rails['smartcard_client_certificate_required_port'].
+
1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure)
GitLab for the changes to take effect.
diff --git a/doc/administration/compliance.md b/doc/administration/compliance.md
index 721b0dbb957..04369a76fb3 100644
--- a/doc/administration/compliance.md
+++ b/doc/administration/compliance.md
@@ -20,7 +20,7 @@ relevant compliance standards.
|**[Enforce TOS acceptance](../user/admin_area/settings/terms.md)**<br>Enforce your users accepting new terms of service by blocking GitLab traffic.|Free+||Instance|
|**[Email all users of a project, group, or entire server](../tools/email.md)**<br>An administrator can email groups of users based on project or group membership, or email everyone using the GitLab instance. This is great for scheduled maintenance or upgrades.|Premium+||Instance|
|**[Omnibus package supports log forwarding](https://docs.gitlab.com/omnibus/settings/logs.html#udp-log-forwarding)**<br>Forward your logs to a central system.|Premium+||Instance|
-|**[Lock project membership to group](../user/group/index.md#member-lock)**<br>Group owners can prevent new members from being added to projects within a group.|Premium+|✓|Group|
+|**[Lock project membership to group](../user/group/index.md#prevent-members-from-being-added-to-a-group)**<br>Group owners can prevent new members from being added to projects within a group.|Premium+|✓|Group|
|**[LDAP group sync](auth/ldap/index.md#group-sync)**<br>GitLab Enterprise Edition gives administrators the ability to automatically sync groups and manage SSH keys, permissions, and authentication, so you can focus on building your product, not configuring your tools.|Premium+||Instance|
|**[LDAP group sync filters](auth/ldap/index.md#group-sync)**<br>GitLab Enterprise Edition Premium gives more flexibility to synchronize with LDAP based on filters, meaning you can leverage LDAP attributes to map GitLab permissions.|Premium+||Instance|
|**[Audit events](audit_events.md)**<br>To maintain the integrity of your code, GitLab Enterprise Edition Premium gives administrators the ability to view any modifications made within the GitLab server in an advanced audit events system, so you can control, analyze, and track every change.|Premium+|✓|Instance, Group, Project|
diff --git a/doc/administration/consul.md b/doc/administration/consul.md
index dfc859e30c2..926267a414a 100644
--- a/doc/administration/consul.md
+++ b/doc/administration/consul.md
@@ -146,7 +146,7 @@ sudo gitlab-ctl restart consul
### Consul nodes unable to communicate
By default, Consul will attempt to
-[bind](https://www.consul.io/docs/agent/options.html#_bind) to `0.0.0.0`, but
+[bind](https://www.consul.io/docs/agent/options#_bind) to `0.0.0.0`, but
it will advertise the first private IP address on the node for other Consul nodes
to communicate with it. If the other nodes cannot communicate with a node on
this address, then the cluster will have a failed status.
diff --git a/doc/administration/feature_flags.md b/doc/administration/feature_flags.md
index 55727822654..6882797064b 100644
--- a/doc/administration/feature_flags.md
+++ b/doc/administration/feature_flags.md
@@ -13,7 +13,7 @@ to deploy features in an early stage of development so that they can be
incrementally rolled out.
Before making them permanently available, features can be deployed behind
-flags for a [number of reasons](../development/feature_flags/index.md#when-to-use-feature-flags), such as:
+flags for a [number of reasons](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle#when-to-use-feature-flags), such as:
- To test the feature.
- To get feedback from users and customers while in an early stage of the development of the feature.
diff --git a/doc/administration/file_hooks.md b/doc/administration/file_hooks.md
index 1d028b80257..c60f0040496 100644
--- a/doc/administration/file_hooks.md
+++ b/doc/administration/file_hooks.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# File hooks **(FREE)**
+# File hooks **(FREE SELF)**
> - Introduced in GitLab 10.6.
> - Until GitLab 12.8, the feature name was Plugins.
diff --git a/doc/administration/geo/disaster_recovery/background_verification.md b/doc/administration/geo/disaster_recovery/background_verification.md
index f573b64b5f1..8d3745130bd 100644
--- a/doc/administration/geo/disaster_recovery/background_verification.md
+++ b/doc/administration/geo/disaster_recovery/background_verification.md
@@ -58,14 +58,14 @@ Feature.enable('geo_repository_verification')
## Repository verification
-Navigate to the **Admin Area > Geo** dashboard on the **primary** node and expand
+Go to the **Admin Area > Geo** dashboard on the **primary** node and expand
the **Verification information** tab for that node to view automatic checksumming
status for repositories and wikis. Successes are shown in green, pending work
in gray, and failures in red.
![Verification status](img/verification-status-primary.png)
-Navigate to the **Admin Area > Geo** dashboard on the **secondary** node and expand
+Go to the **Admin Area > Geo** dashboard on the **secondary** node and expand
the **Verification information** tab for that node to view automatic verification
status for repositories and wikis. As with checksumming, successes are shown in
green, pending work in gray, and failures in red.
@@ -92,7 +92,7 @@ data. The default and recommended re-verification interval is 7 days, though
an interval as short as 1 day can be set. Shorter intervals reduce risk but
increase load and vice versa.
-Navigate to the **Admin Area > Geo** dashboard on the **primary** node, and
+Go to the **Admin Area > Geo** dashboard on the **primary** node, and
click the **Edit** button for the **primary** node to customize the minimum
re-verification interval:
@@ -141,7 +141,7 @@ sudo gitlab-rake geo:verification:wiki:reset
If the **primary** and **secondary** nodes have a checksum verification mismatch, the cause may not be apparent. To find the cause of a checksum mismatch:
-1. Navigate to the **Admin Area > Overview > Projects** dashboard on the **primary** node, find the
+1. Go to the **Admin Area > Overview > Projects** dashboard on the **primary** node, find the
project that you want to check the checksum differences and click on the
**Edit** button:
![Projects dashboard](img/checksum-differences-admin-projects.png)
@@ -149,7 +149,7 @@ If the **primary** and **secondary** nodes have a checksum verification mismatch
1. On the project administration page get the **Gitaly storage name**, and **Gitaly relative path**:
![Project administration page](img/checksum-differences-admin-project-page.png)
-1. Navigate to the project's repository directory on both **primary** and **secondary** nodes
+1. Go to the project's repository directory on both **primary** and **secondary** nodes
(the path is usually `/var/opt/gitlab/git-data/repositories`). Note that if `git_data_dirs`
is customized, check the directory layout on your server to be sure.
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index e64d0d4983e..96c6482e3db 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -110,7 +110,7 @@ The maintenance window won't end until Geo replication and verification is
completely finished. To keep the window as short as possible, you should
ensure these processes are close to 100% as possible during active use.
-Navigate to the **Admin Area > Geo** dashboard on the **secondary** node to
+Go to the **Admin Area > Geo** dashboard on the **secondary** node to
review status. Replicated objects (shown in green) should be close to 100%,
and there should be no failures (shown in red). If a large proportion of
objects aren't yet replicated (shown in gray), consider giving the node more
diff --git a/doc/administration/geo/glossary.md b/doc/administration/geo/glossary.md
index e9d57284dd2..98a29c27a89 100644
--- a/doc/administration/geo/glossary.md
+++ b/doc/administration/geo/glossary.md
@@ -23,7 +23,7 @@ these definitions yet.
|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|-------------------------------------------------|
| Node | An individual server that runs GitLab either with a specific role or as a whole (e.g. a Rails application node). In a cloud context this can be a specific machine type. | GitLab | instance, server |
| Site | One or a collection of nodes running a single GitLab application. A site can be single-node or multi-node. | GitLab | deployment, installation instance |
-| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance
+| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance
| Multi-node site | A specific configuration of GitLab that uses more than one node. | GitLab | multi-server, multi-instance, high availability |
| Primary site | A GitLab site that is configured to be read and writable. There can only be a single primary site. | Geo-specific | Geo deployment, Primary node |
| Secondary site(s) | GitLab site that is configured to be read-only. There can be one or more secondary sites. | Geo-specific | Geo deployment, Secondary node |
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index 154815efa51..7dbb0c78166 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -252,7 +252,7 @@ on the **secondary** node.
Geo synchronizes repositories over HTTP/HTTPS, and therefore requires this clone
method to be enabled. This is enabled by default, but if converting an existing node to Geo it should be checked:
-1. Navigate to **Admin Area > Settings** (`/admin/application_settings/general`) on the **primary** node.
+1. Go to **Admin Area > Settings** (`/admin/application_settings/general`) on the **primary** node.
1. Expand "Visibility and access controls".
1. Ensure "Enabled Git access protocols" is set to either "Both SSH and HTTP(S)" or "Only HTTP(S)".
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index f2913dd55ce..dfb460c9f46 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -45,8 +45,8 @@ verification methods:
| Blobs | Archived CI build traces _(object storage)_ | Geo with API/Managed (*2*) | _Not implemented_ |
| Blobs | Container registry _(file system)_ | Geo with API/Docker API | _Not implemented_ |
| Blobs | Container registry _(object storage)_ | Geo with API/Managed/Docker API (*2*) | _Not implemented_ |
-| Blobs | Package registry _(file system)_ | Geo with API | _Not implemented_ |
-| Blobs | Package registry _(object storage)_ | Geo with API/Managed (*2*) | _Not implemented_ |
+| Blobs | Package registry _(file system)_ | Geo with API | SHA256 checksum |
+| Blobs | Package registry _(object storage)_ | Geo with API/Managed (*2*) | SHA256 checksum |
| Blobs | Versioned Terraform State _(file system)_ | Geo with API | _Not implemented_ |
| Blobs | Versioned Terraform State _(object storage)_ | Geo with API/Managed (*2*) | _Not implemented_ |
| Blobs | External Merge Request Diffs _(file system)_ | Geo with API | _Not implemented_ |
@@ -118,7 +118,7 @@ We use PostgreSQL's own replication functionality to replicate data from the **p
We use Redis both as a cache store and to hold persistent data for our background jobs system. Because both
use-cases has data that are exclusive to the same Geo node, we don't replicate it between nodes.
-Elasticsearch is an optional database, that can enable advanced searching capabilities, like improved Global Search
+Elasticsearch is an optional database, that can enable advanced searching capabilities, like improved Advanced Search
in both source-code level and user generated content in Issues / Merge-Requests and discussions. Currently it's not
supported in Geo.
@@ -175,24 +175,24 @@ successfully, you must replicate their data using some other means.
| [Application data in PostgreSQL](../../postgresql/index.md) | **Yes** (10.2) | **Yes** (10.2) | No | |
| [Project repository](../../../user/project/repository/) | **Yes** (10.2) | **Yes** (10.7) | No | |
| [Project wiki repository](../../../user/project/wiki/) | **Yes** (10.2) | **Yes** (10.7) | No |
-| [Group wiki repository](../../../user/group/index.md#group-wikis) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/208147) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/208147) | No | |
+| [Group wiki repository](../../../user/group/index.md#group-wikis) | [**Yes** (13.10)](https://gitlab.com/gitlab-org/gitlab/-/issues/208147) | No | No | Behind feature flag `geo_group_wiki_repository_replication`, enabled by default |
| [Uploads](../../uploads.md) | **Yes** (10.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | No | Verified only on transfer or manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them. |
| [LFS objects](../../lfs/index.md) | **Yes** (10.2) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/8922) | Via Object Storage provider if supported. Native Geo support (Beta). | Verified only on transfer or manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them. GitLab versions 11.11.x and 12.0.x are affected by [a bug that prevents any new LFS objects from replicating](https://gitlab.com/gitlab-org/gitlab/-/issues/32696). |
-| [Personal snippets](../../../user/snippets.md#personal-snippets) | **Yes** (10.2) | **Yes** (10.2) | No | |
-| [Project snippets](../../../user/snippets.md#project-snippets) | **Yes** (10.2) | **Yes** (10.2) | No | |
+| [Personal snippets](../../../user/snippets.md) | **Yes** (10.2) | **Yes** (10.2) | No | |
+| [Project snippets](../../../user/snippets.md) | **Yes** (10.2) | **Yes** (10.2) | No | |
| [CI job artifacts (other than Job Logs)](../../../ci/pipelines/job_artifacts.md) | **Yes** (10.4) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/8923) | Via Object Storage provider if supported. Native Geo support (Beta) . | Verified only manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them |
| [Job logs](../../job_logs.md) | **Yes** (10.4) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/8923) | Via Object Storage provider if supported. Native Geo support (Beta). | Verified only on transfer or manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them |
| [Object pools for forked project deduplication](../../../development/git_object_deduplication.md) | **Yes** | No | No | |
| [Container Registry](../../packages/container_registry.md) | **Yes** (12.3) | No | No | Disabled by default. See [instructions](docker_registry.md) to enable. |
| [Content in object storage (beta)](object_storage.md) | **Yes** (12.4) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/13845) | No | |
| [Project designs repository](../../../user/project/issues/design_management.md) | **Yes** (12.7) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/32467) | Via Object Storage provider if supported. Native Geo support (Beta). | |
-| [Package Registry for npm](../../../user/packages/npm_registry/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for Maven](../../../user/packages/maven_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for Conan](../../../user/packages/conan_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for NuGet](../../../user/packages/nuget_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for PyPI](../../../user/packages/pypi_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for Composer](../../../user/packages/composer_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for generic packages](../../../user/packages/generic_packages/index.md) | **Yes** (13.5) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for npm](../../../user/packages/npm_registry/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for Maven](../../../user/packages/maven_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for Conan](../../../user/packages/conan_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for NuGet](../../../user/packages/nuget_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for PyPI](../../../user/packages/pypi_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for Composer](../../../user/packages/composer_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for generic packages](../../../user/packages/generic_packages/index.md) | **Yes** (13.5) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
| [Versioned Terraform State](../../terraform_state.md) | **Yes** (13.5) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_terraform_state_version_replication`, enabled by default |
| [External merge request diffs](../../merge_request_diffs.md) | **Yes** (13.5) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_merge_request_diff_replication`, enabled by default |
| [Versioned snippets](../../../user/snippets.md#versioned-snippets) | [**Yes** (13.7)](https://gitlab.com/groups/gitlab-org/-/epics/2809) | [No](https://gitlab.com/groups/gitlab-org/-/epics/2810) | No | |
@@ -201,4 +201,4 @@ successfully, you must replicate their data using some other means.
| [GitLab Pages](../../pages/index.md) | [No](https://gitlab.com/groups/gitlab-org/-/epics/589) | No | No | |
| [CI Pipeline Artifacts](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/ci/pipeline_artifact.rb) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/238464) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Persists additional artifacts after a pipeline completes |
| [Dependency proxy images](../../../user/packages/dependency_proxy/index.md) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/259694) | No | No | Blocked on [Geo: Secondary Mimicry](https://gitlab.com/groups/gitlab-org/-/epics/1528). Note that replication of this cache is not needed for Disaster Recovery purposes because it can be recreated from external sources. |
-| [Vulnerability Export](../../../user/application_security/vulnerability_report/#export-vulnerabilities) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/3111) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Not planned because they are ephemeral and sensitive. They can be regenerated on demand. |
+| [Vulnerability Export](../../../user/application_security/vulnerability_report/#export-vulnerability-details) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/3111) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Not planned because they are ephemeral and sensitive. They can be regenerated on demand. |
diff --git a/doc/administration/geo/replication/location_aware_git_url.md b/doc/administration/geo/replication/location_aware_git_url.md
index 0eea792d374..272b746015b 100644
--- a/doc/administration/geo/replication/location_aware_git_url.md
+++ b/doc/administration/geo/replication/location_aware_git_url.md
@@ -51,8 +51,8 @@ If you haven't yet set up a Geo _primary_ node and _secondary_ node, see the
In a Route53 Hosted Zone, traffic policies can be used to set up a variety of
routing configurations.
-1. Navigate to the
-[Route53 dashboard](https://console.aws.amazon.com/route53/home) and click
+1. Go to the
+[Route53 dashboard](https://console.aws.amazon.com/route53/home) and select
**Traffic policies**.
![Traffic policies](img/single_git_traffic_policies.png)
diff --git a/doc/administration/geo/replication/remove_geo_node.md b/doc/administration/geo/replication/remove_geo_node.md
index 26150a6f536..06cf5375f0d 100644
--- a/doc/administration/geo/replication/remove_geo_node.md
+++ b/doc/administration/geo/replication/remove_geo_node.md
@@ -9,7 +9,7 @@ type: howto
**Secondary** nodes can be removed from the Geo cluster using the Geo administration page of the **primary** node. To remove a **secondary** node:
-1. Navigate to **Admin Area > Geo** (`/admin/geo/nodes`).
+1. Go to **Admin Area > Geo** (`/admin/geo/nodes`).
1. Click the **Remove** button for the **secondary** node you want to remove.
1. Confirm by clicking **Remove** when the prompt appears.
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 3b1f60a0f3f..079a3713c73 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -428,7 +428,7 @@ To solve this:
1. Log into the secondary Geo node.
-1. Back up [the `.git` folder](../../repository_storage_types.md#translating-hashed-storage-paths).
+1. Back up [the `.git` folder](../../repository_storage_types.md#translate-hashed-storage-paths).
1. Optional: [Spot-check](../../troubleshooting/log_parsing.md#find-all-projects-affected-by-a-fatal-git-problem))
a few of those IDs whether they indeed correspond
diff --git a/doc/administration/geo/replication/version_specific_updates.md b/doc/administration/geo/replication/version_specific_updates.md
index be2ce0ac2c0..883e5d44b69 100644
--- a/doc/administration/geo/replication/version_specific_updates.md
+++ b/doc/administration/geo/replication/version_specific_updates.md
@@ -11,6 +11,15 @@ Review this page for update instructions for your version. These steps
accompany the [general steps](updating_the_geo_nodes.md#general-update-steps)
for updating Geo nodes.
+## Updating to GitLab 13.9
+
+We've detected an issue [with a column rename](https://gitlab.com/gitlab-org/gitlab/-/issues/324160)
+that may prevent upgrades to GitLab 13.9.0, 13.9.1, 13.9.2 and 13.9.3.
+We are working on a patch and recommend delaying any upgrade attempt until a fixed version
+is released.
+
+More details are available [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160).
+
## Updating to GitLab 13.7
We've detected an issue with the `FetchRemove` call used by Geo secondaries.
diff --git a/doc/administration/geo/setup/database.md b/doc/administration/geo/setup/database.md
index 1272e7d1419..7128d4283d1 100644
--- a/doc/administration/geo/setup/database.md
+++ b/doc/administration/geo/setup/database.md
@@ -496,7 +496,7 @@ A production-ready and secure setup requires at least three Consul nodes, three
Patroni nodes, one internal load-balancing node on the primary site, and a similar
configuration for the secondary site. The internal load balancer provides a single
endpoint for connecting to the Patroni cluster's leader whenever a new leader is
-elected. Be sure to use [password credentials](../..//postgresql/replication_and_failover.md#database-authorization-for-patroni) and other database best practices.
+elected. Be sure to use [password credentials](../../postgresql/replication_and_failover.md#database-authorization-for-patroni) and other database best practices.
Similar to `repmgr`, using Patroni on a secondary node is optional.
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index 8e7d8049467..1b0082687e6 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -49,7 +49,7 @@ developed and tested. We aim to be compatible with most external
To set up an external database, you can either:
-- Set up streaming replication yourself (for example, in AWS RDS).
+- Set up [streaming replication](https://www.postgresql.org/docs/11/warm-standby.html#STREAMING-REPLICATION-SLOTS) yourself (for example AWS RDS, bare metal not managed by Omnibus, etc.).
- Perform the Omnibus configuration manually as follows.
#### Leverage your cloud provider's tools to replicate the primary database
diff --git a/doc/administration/gitaly/configure_gitaly.md b/doc/administration/gitaly/configure_gitaly.md
new file mode 100644
index 00000000000..7e3647d1e34
--- /dev/null
+++ b/doc/administration/gitaly/configure_gitaly.md
@@ -0,0 +1,943 @@
+---
+stage: Create
+group: Gitaly
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Configure Gitaly
+
+The Gitaly service itself is configured by using a [TOML configuration file](reference.md).
+
+To change Gitaly settings:
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb` and add or change the
+ [Gitaly settings](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/1dd07197c7e5ae23626aad5a4a070a800b670380/files/gitlab-config-template/gitlab.rb.template#L1622-1676).
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Edit `/home/git/gitaly/config.toml` and add or change the [Gitaly settings](https://gitlab.com/gitlab-org/gitaly/blob/master/config.toml.example).
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+The following configuration options are also available:
+
+- Enabling [TLS support](#enable-tls-support).
+- Configuring the [number of `gitaly-ruby` workers](#configure-number-of-gitaly-ruby-workers).
+- Limiting [RPC concurrency](#limit-rpc-concurrency).
+
+## Run Gitaly on its own server
+
+By default, Gitaly is run on the same server as Gitaly clients and is
+[configured as above](#configure-gitaly). Single-server installations are best served by
+this default configuration used by:
+
+- [Omnibus GitLab](https://docs.gitlab.com/omnibus/).
+- The GitLab [source installation guide](../../install/installation.md).
+
+However, Gitaly can be deployed to its own server, which can benefit GitLab installations that span
+multiple machines.
+
+NOTE:
+When configured to run on their own servers, Gitaly servers
+[must be upgraded](https://docs.gitlab.com/omnibus/update/#upgrading-gitaly-servers) before Gitaly
+clients in your cluster.
+
+The process for setting up Gitaly on its own server is:
+
+1. [Install Gitaly](#install-gitaly).
+1. [Configure authentication](#configure-authentication).
+1. [Configure Gitaly servers](#configure-gitaly-servers).
+1. [Configure Gitaly clients](#configure-gitaly-clients).
+1. [Disable Gitaly where not required](#disable-gitaly-where-not-required-optional) (optional).
+
+When running Gitaly on its own server, note the following regarding GitLab versions:
+
+- From GitLab 11.4, Gitaly was able to serve all Git requests without requiring a shared NFS mount
+ for Git repository data, except for the
+ [Elasticsearch indexer](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer).
+- From GitLab 11.8, the Elasticsearch indexer also uses Gitaly for data access. NFS can still be
+ leveraged for redundancy on block-level Git data, but should be mounted only on the Gitaly
+ servers.
+- From GitLab 11.8 to 12.2, it is possible to use Elasticsearch in a Gitaly setup that doesn't use
+ NFS. To use Elasticsearch in these versions, the
+ [repository indexer](../../integration/elasticsearch.md#elasticsearch-repository-indexer)
+ must be enabled in your GitLab configuration.
+- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/6481), the new indexer is
+ the default and no configuration is required.
+
+### Network architecture
+
+The following list depicts the network architecture of Gitaly:
+
+- GitLab Rails shards repositories into [repository storages](../repository_storage_paths.md).
+- `/config/gitlab.yml` contains a map from storage names to `(Gitaly address, Gitaly token)` pairs.
+- The `storage name` -\> `(Gitaly address, Gitaly token)` map in `/config/gitlab.yml` is the single
+ source of truth for the Gitaly network topology.
+- A `(Gitaly address, Gitaly token)` corresponds to a Gitaly server.
+- A Gitaly server hosts one or more storages.
+- A Gitaly client can use one or more Gitaly servers.
+- Gitaly addresses must be specified in such a way that they resolve correctly for **all** Gitaly
+ clients.
+- Gitaly clients are:
+ - Puma or Unicorn.
+ - Sidekiq.
+ - GitLab Workhorse.
+ - GitLab Shell.
+ - Elasticsearch indexer.
+ - Gitaly itself.
+- A Gitaly server must be able to make RPC calls **to itself** by using its own
+ `(Gitaly address, Gitaly token)` pair as specified in `/config/gitlab.yml`.
+- Authentication is done through a static token which is shared among the Gitaly and GitLab Rails
+ nodes.
+
+The following digraph illustrates communication between Gitaly servers and GitLab Rails showing
+the default ports for HTTP and HTTPs communication.
+
+![Gitaly network architecture diagram](img/gitaly_network_13_9.png)
+
+WARNING:
+Gitaly servers must not be exposed to the public internet as Gitaly's network traffic is unencrypted
+by default. The use of firewall is highly recommended to restrict access to the Gitaly server.
+Another option is to [use TLS](#enable-tls-support).
+
+In the following sections, we describe how to configure two Gitaly servers with secret token
+`abc123secret`:
+
+- `gitaly1.internal`.
+- `gitaly2.internal`.
+
+We assume your GitLab installation has three repository storages:
+
+- `default`.
+- `storage1`.
+- `storage2`.
+
+You can use as few as one server with one repository storage if desired.
+
+NOTE:
+The token referred to throughout the Gitaly documentation is just an arbitrary password selected by
+the administrator. It is unrelated to tokens created for the GitLab API or other similar web API
+tokens.
+
+### Install Gitaly
+
+Install Gitaly on each Gitaly server using either Omnibus GitLab or install it from source:
+
+- For Omnibus GitLab, [download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package you want but **do not** provide the `EXTERNAL_URL=` value.
+- To install from source, follow the steps at
+ [Install Gitaly](../../install/installation.md#install-gitaly).
+
+### Configure authentication
+
+Gitaly and GitLab use two shared secrets for authentication:
+
+- One to authenticate gRPC requests to Gitaly.
+- A second for authentication callbacks from GitLab Shell to the GitLab internal API.
+
+**For Omnibus GitLab**
+
+To configure the Gitaly token:
+
+1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['gitaly_token'] = 'abc123secret'
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. On the Gitaly server, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitaly['auth_token'] = 'abc123secret'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+There are two ways to configure the GitLab Shell token.
+
+Method 1:
+
+1. Copy `/etc/gitlab/gitlab-secrets.json` from the Gitaly client to same path on the Gitaly servers
+ (and any other Gitaly clients).
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) on Gitaly servers.
+
+Method 2:
+
+1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_shell['secret_token'] = 'shellsecret'
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. On the Gitaly servers, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_shell['secret_token'] = 'shellsecret'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Copy `/home/git/gitlab/.gitlab_shell_secret` from the Gitaly client to the same path on the
+ Gitaly servers (and any other Gitaly clients).
+1. On the Gitaly clients, edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ gitlab:
+ gitaly:
+ token: 'abc123secret'
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. On the Gitaly servers, edit `/home/git/gitaly/config.toml`:
+
+ ```toml
+ [auth]
+ token = 'abc123secret'
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+### Configure Gitaly servers
+
+On the Gitaly servers, you must configure storage paths and enable the network listener.
+The Gitaly server must be able to read, write, and set permissions on the configured path.
+
+If you want to reduce the risk of downtime when you enable authentication, you can temporarily
+disable enforcement. For more information, see the documentation on configuring
+[Gitaly authentication](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/configuration/README.md#authentication).
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ <!--
+ updates to following example must also be made at
+ https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
+ -->
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+ gitlab_exporter['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # If you don't run a separate monitoring node you can
+ # enable Prometheus access & disable these extra services.
+ # This makes Prometheus listen on all interfaces. You must use firewalls to restrict access to this address/port.
+ # prometheus['listen_address'] = '0.0.0.0:9090'
+ # prometheus['monitor_kubernetes'] = false
+
+ # If you don't want to run monitoring services uncomment the following (not recommended)
+ # node_exporter['enable'] = false
+
+ # Prevent database connections during 'gitlab-ctl reconfigure'
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the gitlab-shell API callback URL. Without this, `git push` will
+ # fail. This can be your 'front door' GitLab URL or an internal load
+ # balancer.
+ # Don't forget to copy `/etc/gitlab/gitlab-secrets.json` from Gitaly client to Gitaly server.
+ gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
+
+ # Authentication token to ensure only authorized servers can communicate with
+ # Gitaly server
+ gitaly['auth_token'] = 'AUTH_TOKEN'
+
+ # Make Gitaly accept connections on all network interfaces. You must use
+ # firewalls to restrict access to this address/port.
+ # Comment out following line if you only want to support TLS connections
+ gitaly['listen_addr'] = "0.0.0.0:8075"
+ ```
+
+1. Append the following to `/etc/gitlab/gitlab.rb` for each respective Gitaly server:
+
+ <!--
+ updates to following example must also be made at
+ https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
+ -->
+
+ On `gitaly1.internal`:
+
+ ```ruby
+ git_data_dirs({
+ 'default' => {
+ 'path' => '/var/opt/gitlab/git-data'
+ },
+ 'storage1' => {
+ 'path' => '/mnt/gitlab/git-data'
+ },
+ })
+ ```
+
+ On `gitaly2.internal`:
+
+ ```ruby
+ git_data_dirs({
+ 'storage2' => {
+ 'path' => '/srv/gitlab/git-data'
+ },
+ })
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. Run `sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml`
+ to confirm that Gitaly can perform callbacks to the GitLab internal API.
+
+**For installations from source**
+
+1. Edit `/home/git/gitaly/config.toml`:
+
+ ```toml
+ listen_addr = '0.0.0.0:8075'
+
+ internal_socket_dir = '/var/opt/gitlab/gitaly'
+
+ [logging]
+ format = 'json'
+ level = 'info'
+ dir = '/var/log/gitaly'
+ ```
+
+1. Append the following to `/home/git/gitaly/config.toml` for each respective Gitaly server:
+
+ On `gitaly1.internal`:
+
+ ```toml
+ [[storage]]
+ name = 'default'
+ path = '/var/opt/gitlab/git-data/repositories'
+
+ [[storage]]
+ name = 'storage1'
+ path = '/mnt/gitlab/git-data/repositories'
+ ```
+
+ On `gitaly2.internal`:
+
+ ```toml
+ [[storage]]
+ name = 'storage2'
+ path = '/srv/gitlab/git-data/repositories'
+ ```
+
+1. Edit `/home/git/gitlab-shell/config.yml`:
+
+ ```yaml
+ gitlab_url: https://gitlab.example.com
+ ```
+
+1. Save the files and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. Run `sudo -u git /home/git/gitaly/gitaly-hooks check /home/git/gitaly/config.toml`
+ to confirm that Gitaly can perform callbacks to the GitLab internal API.
+
+### Configure Gitaly clients
+
+As the final step, you must update Gitaly clients to switch from using local Gitaly service to use
+the Gitaly servers you just configured.
+
+This can be risky because anything that prevents your Gitaly clients from reaching the Gitaly
+servers causes all Gitaly requests to fail. For example, any sort of network, firewall, or name
+resolution problems.
+
+Additionally, you must [disable Rugged](../nfs.md#improving-nfs-performance-with-gitlab)
+if previously enabled manually.
+
+Gitaly makes the following assumptions:
+
+- Your `gitaly1.internal` Gitaly server can be reached at `gitaly1.internal:8075` from your Gitaly
+ clients, and that Gitaly server can read, write, and set permissions on `/var/opt/gitlab/git-data` and
+ `/mnt/gitlab/git-data`.
+- Your `gitaly2.internal` Gitaly server can be reached at `gitaly2.internal:8075` from your Gitaly
+ clients, and that Gitaly server can read, write, and set permissions on `/srv/gitlab/git-data`.
+- Your `gitaly1.internal` and `gitaly2.internal` Gitaly servers can reach each other.
+
+You can't define Gitaly servers with some as a local Gitaly server
+(without `gitaly_address`) and some as remote
+server (with `gitaly_address`) unless you use
+[mixed configuration](#mixed-configuration).
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ })
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. Run `sudo gitlab-rake gitlab:gitaly:check` on the Gitaly client (for example, the
+ Rails application) to confirm it can connect to Gitaly servers.
+1. Tail the logs to see the requests:
+
+ ```shell
+ sudo gitlab-ctl tail gitaly
+ ```
+
+**For installations from source**
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ gitlab:
+ repositories:
+ storages:
+ default:
+ gitaly_address: tcp://gitaly1.internal:8075
+ path: /some/local/path
+ storage1:
+ gitaly_address: tcp://gitaly1.internal:8075
+ path: /some/local/path
+ storage2:
+ gitaly_address: tcp://gitaly2.internal:8075
+ path: /some/local/path
+ ```
+
+ NOTE:
+ `/some/local/path` should be set to a local folder that exists, however no data is stored in
+ this folder. This requirement is scheduled to be removed when
+ [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. Run `sudo -u git -H bundle exec rake gitlab:gitaly:check RAILS_ENV=production` to confirm the
+ Gitaly client can connect to Gitaly servers.
+1. Tail the logs to see the requests:
+
+ ```shell
+ tail -f /home/git/gitlab/log/gitaly.log
+ ```
+
+When you tail the Gitaly logs on your Gitaly server, you should see requests coming in. One sure way
+to trigger a Gitaly request is to clone a repository from GitLab over HTTP or HTTPS.
+
+WARNING:
+If you have [server hooks](../server_hooks.md) configured, either per repository or globally, you
+must move these to the Gitaly servers. If you have multiple Gitaly servers, copy your server hooks
+to all Gitaly servers.
+
+#### Mixed configuration
+
+GitLab can reside on the same server as one of many Gitaly servers, but doesn't support
+configuration that mixes local and remote configuration. The following setup is incorrect, because:
+
+- All addresses must be reachable from the other Gitaly servers.
+- `storage1` is assigned a Unix socket for `gitaly_address` which is
+ invalid for some of the Gitaly servers.
+
+```ruby
+git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ 'storage1' => { 'path' => '/mnt/gitlab/git-data' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+})
+```
+
+To combine local and remote Gitaly servers, use an external address for the local Gitaly server. For
+example:
+
+```ruby
+git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ # Address of the GitLab server that has Gitaly running on it
+ 'storage1' => { 'gitaly_address' => 'tcp://gitlab.internal:8075', 'path' => '/mnt/gitlab/git-data' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+})
+
+# Make Gitaly accept connections on all network interfaces
+gitaly['listen_addr'] = "0.0.0.0:8075"
+
+# Or for TLS
+gitaly['tls_listen_addr'] = "0.0.0.0:9999"
+gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+```
+
+`path` can be included only for storage shards on the local Gitaly server.
+If it's excluded, default Git storage directory is used for that storage shard.
+
+### Disable Gitaly where not required (optional)
+
+If you run Gitaly [as a remote service](#run-gitaly-on-its-own-server), consider
+disabling the local Gitaly service that runs on your GitLab server by default, and run it
+only where required.
+
+Disabling Gitaly on the GitLab instance makes sense only when you run GitLab in a custom cluster configuration, where
+Gitaly runs on a separate machine from the GitLab instance. Disabling Gitaly on all machines in the cluster is not
+a valid configuration (some machines much act as Gitaly servers).
+
+To disable Gitaly on a GitLab server:
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitaly['enable'] = false
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Edit `/etc/default/gitlab`:
+
+ ```shell
+ gitaly_enabled=false
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+## Enable TLS support
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22602) in GitLab 11.8.
+> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3160) in GitLab 13.6, outgoing TLS connections to GitLab provide client certificates if configured.
+
+Gitaly supports TLS encryption. To communicate with a Gitaly instance that listens for secure
+connections, use the `tls://` URL scheme in the `gitaly_address` of the corresponding
+storage entry in the GitLab configuration.
+
+Gitaly provides the same server certificates as client certificates in TLS
+connections to GitLab. This can be used as part of a mutual TLS authentication strategy
+when combined with reverse proxies (for example, NGINX) that validate client certificate
+to grant access to GitLab.
+
+You must supply your own certificates as this isn't provided automatically. The certificate
+corresponding to each Gitaly server must be installed on that Gitaly server.
+
+Additionally, the certificate (or its certificate authority) must be installed on all:
+
+- Gitaly servers.
+- Gitaly clients that communicate with it.
+
+Note the following:
+
+- The certificate must specify the address you use to access the Gitaly server. You must add the hostname or IP address as a Subject Alternative Name to the certificate.
+- You can configure Gitaly servers with both an unencrypted listening address `listen_addr` and an
+ encrypted listening address `tls_listen_addr` at the same time. This allows you to gradually
+ transition from unencrypted to encrypted traffic if necessary.
+
+To configure Gitaly with TLS:
+
+**For Omnibus GitLab**
+
+1. Create certificates for Gitaly servers.
+1. On the Gitaly clients, copy the certificates (or their certificate authority) into
+ `/etc/gitlab/trusted-certs`:
+
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
+ ```
+
+1. On the Gitaly clients, edit `git_data_dirs` in `/etc/gitlab/gitlab.rb` as follows:
+
+ ```ruby
+ git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
+ 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
+ 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ })
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate
+ there:
+
+ ```shell
+ sudo mkdir -p /etc/gitlab/ssl
+ sudo chmod 755 /etc/gitlab/ssl
+ sudo cp key.pem cert.pem /etc/gitlab/ssl/
+ sudo chmod 644 key.pem cert.pem
+ ```
+
+1. Copy all Gitaly server certificates (or their certificate authority) to
+ `/etc/gitlab/trusted-certs` on all Gitaly servers and clients
+ so that Gitaly servers and clients trust the certificate when calling into themselves
+ or other Gitaly servers:
+
+ ```shell
+ sudo cp cert1.pem cert2.pem /etc/gitlab/trusted-certs/
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` and add:
+
+ <!--
+ updates to following example must also be made at
+ https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
+ -->
+
+ ```ruby
+ gitaly['tls_listen_addr'] = "0.0.0.0:9999"
+ gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. Verify Gitaly traffic is being served over TLS by
+ [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
+1. (Optional) Improve security by:
+ 1. Disabling non-TLS connections by commenting out or deleting `gitaly['listen_addr']` in
+ `/etc/gitlab/gitlab.rb`.
+ 1. Saving the file.
+ 1. [Reconfiguring GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Create certificates for Gitaly servers.
+1. On the Gitaly clients, copy the certificates into the system trusted certificates:
+
+ ```shell
+ sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
+ sudo update-ca-certificates
+ ```
+
+1. On the Gitaly clients, edit `storages` in `/home/git/gitlab/config/gitlab.yml` as follows:
+
+ ```yaml
+ gitlab:
+ repositories:
+ storages:
+ default:
+ gitaly_address: tls://gitaly1.internal:9999
+ path: /some/local/path
+ storage1:
+ gitaly_address: tls://gitaly1.internal:9999
+ path: /some/local/path
+ storage2:
+ gitaly_address: tls://gitaly2.internal:9999
+ path: /some/local/path
+ ```
+
+ NOTE:
+ `/some/local/path` should be set to a local folder that exists, however no data is stored
+ in this folder. This requirement is scheduled to be removed when
+ [Gitaly issue #1282](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. On the Gitaly servers, create or edit `/etc/default/gitlab` and add:
+
+ ```shell
+ export SSL_CERT_DIR=/etc/gitlab/ssl
+ ```
+
+1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+
+ ```shell
+ sudo mkdir -p /etc/gitlab/ssl
+ sudo chmod 755 /etc/gitlab/ssl
+ sudo cp key.pem cert.pem /etc/gitlab/ssl/
+ sudo chmod 644 key.pem cert.pem
+ ```
+
+1. Copy all Gitaly server certificates (or their certificate authority) to the system trusted
+ certificates folder so Gitaly server trusts the certificate when calling into itself or other Gitaly
+ servers.
+
+ ```shell
+ sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
+ sudo update-ca-certificates
+ ```
+
+1. Edit `/home/git/gitaly/config.toml` and add:
+
+ ```toml
+ tls_listen_addr = '0.0.0.0:9999'
+
+ [tls]
+ certificate_path = '/etc/gitlab/ssl/cert.pem'
+ key_path = '/etc/gitlab/ssl/key.pem'
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. Verify Gitaly traffic is being served over TLS by
+ [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
+1. (Optional) Improve security by:
+ 1. Disabling non-TLS connections by commenting out or deleting `listen_addr` in
+ `/home/git/gitaly/config.toml`.
+ 1. Saving the file.
+ 1. [Restarting GitLab](../restart_gitlab.md#installations-from-source).
+
+### Observe type of Gitaly connections
+
+[Prometheus](../monitoring/prometheus/index.md) can be used observe what type of connections Gitaly
+is serving a production environment. Use the following Prometheus query:
+
+```prometheus
+sum(rate(gitaly_connections_total[5m])) by (type)
+```
+
+## `gitaly-ruby`
+
+Gitaly was developed to replace the Ruby application code in GitLab.
+
+To save time and avoid the risk of rewriting existing application logic, we chose to copy some
+application code from GitLab into Gitaly.
+
+To be able to run that code, `gitaly-ruby` was created, which is a "sidecar" process for the main
+Gitaly Go process. Some examples of things that are implemented in `gitaly-ruby` are:
+
+- RPCs that deal with wikis.
+- RPCs that create commits on behalf of a user, such as merge commits.
+
+We recommend:
+
+- At least 300 MB memory per worker.
+- No more than one worker per core.
+
+NOTE:
+`gitaly-ruby` is planned to be eventually removed. To track progress, see the
+[Remove the Gitaly-Ruby sidecar](https://gitlab.com/groups/gitlab-org/-/epics/2862) epic.
+
+### Configure number of `gitaly-ruby` workers
+
+`gitaly-ruby` has much less capacity than Gitaly implemented in Go. If your Gitaly server has to handle lots of
+requests, the default setting of having just one active `gitaly-ruby` sidecar might not be enough.
+
+If you see `ResourceExhausted` errors from Gitaly, it's very likely that you have not enough
+`gitaly-ruby` capacity.
+
+You can increase the number of `gitaly-ruby` processes on your Gitaly server with the following
+settings:
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ # Default is 2 workers. The minimum is 2; 1 worker is always reserved as
+ # a passive stand-by.
+ gitaly['ruby_num_workers'] = 4
+ ```
+
+1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Edit `/home/git/gitaly/config.toml`:
+
+ ```toml
+ [gitaly-ruby]
+ num_workers = 4
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+## Limit RPC concurrency
+
+Clone traffic can put a large strain on your Gitaly service. The bulk of the work gets done in the
+either of the following RPCs:
+
+- `SSHUploadPack` (for Git SSH).
+- `PostUploadPack` (for Git HTTP).
+
+To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in
+Gitaly's configuration file. For example:
+
+```ruby
+# in /etc/gitlab/gitlab.rb
+
+gitaly['concurrency'] = [
+ {
+ 'rpc' => "/gitaly.SmartHTTPService/PostUploadPack",
+ 'max_per_repo' => 20
+ },
+ {
+ 'rpc' => "/gitaly.SSHService/SSHUploadPack",
+ 'max_per_repo' => 20
+ }
+]
+```
+
+This limits the number of in-flight RPC calls for the given RPCs. The limit is applied per
+repository. In the example above:
+
+- Each repository served by the Gitaly server can have at most 20 simultaneous `PostUploadPack` RPC
+ calls in flight, and the same for `SSHUploadPack`.
+- If another request comes in for a repository that has used up its 20 slots, that request gets
+ queued.
+
+You can observe the behavior of this queue using the Gitaly logs and Prometheus:
+
+- In the Gitaly logs, look for the string (or structured log field) `acquire_ms`. Messages that have
+ this field are reporting about the concurrency limiter.
+- In Prometheus, look for the following metrics:
+
+ - `gitaly_rate_limiting_in_progress`.
+ - `gitaly_rate_limiting_queued`.
+ - `gitaly_rate_limiting_seconds`.
+
+NOTE:
+Although the name of the Prometheus metric contains `rate_limiting`, it's a concurrency limiter, not
+a rate limiter. If a Gitaly client makes 1,000 requests in a row very quickly, concurrency doesn't
+exceed 1, and the concurrency limiter has no effect.
+
+## Background Repository Optimization
+
+Empty directories and unneeded configuration settings may accumulate in a repository and
+slow down Git operations. Gitaly can schedule a daily background task with a maximum duration
+to clean up these items and improve performance.
+
+WARNING:
+This is an experimental feature and may place significant load on the host while running.
+Make sure to schedule this during off-peak hours and keep the duration short (for example, 30-60 minutes).
+
+**For Omnibus GitLab**
+
+Edit `/etc/gitlab/gitlab.rb` and add:
+
+```ruby
+gitaly['daily_maintenance_start_hour'] = 4
+gitaly['daily_maintenance_start_minute'] = 30
+gitaly['daily_maintenance_duration'] = '30m'
+gitaly['daily_maintenance_storages'] = ["default"]
+```
+
+**For installations from source**
+
+Edit `/home/git/gitaly/config.toml` and add:
+
+```toml
+[daily_maintenance]
+start_hour = 4
+start_minute = 30
+duration = '30m'
+storages = ["default"]
+```
+
+## Rotate Gitaly authentication token
+
+Rotating credentials in a production environment often requires downtime, causes outages, or both.
+
+However, you can rotate Gitaly credentials without a service interruption. Rotating a Gitaly
+authentication token involves:
+
+- [Verifying authentication monitoring](#verify-authentication-monitoring).
+- [Enabling "auth transitioning" mode](#enable-auth-transitioning-mode).
+- [Updating Gitaly authentication tokens](#update-gitaly-authentication-token).
+- [Ensuring there are no authentication failures](#ensure-there-are-no-authentication-failures).
+- [Disabling "auth transitioning" mode](#disable-auth-transitioning-mode).
+- [Verifying authentication is enforced](#verify-authentication-is-enforced).
+
+This procedure also works if you are running GitLab on a single server. In that case, "Gitaly
+server" and "Gitaly client" refers to the same machine.
+
+### Verify authentication monitoring
+
+Before rotating a Gitaly authentication token, verify that you can monitor the authentication
+behavior of your GitLab installation using Prometheus. Use the following Prometheus query:
+
+```prometheus
+sum(rate(gitaly_authentications_total[5m])) by (enforced, status)
+```
+
+In a system where authentication is configured correctly and where you have live traffic, you
+see something like this:
+
+```prometheus
+{enforced="true",status="ok"} 4424.985419441742
+```
+
+There may also be other numbers with rate 0. We care only about the non-zero numbers.
+
+The only non-zero number should have `enforced="true",status="ok"`. If you have other non-zero
+numbers, something is wrong in your configuration.
+
+The `status="ok"` number reflects your current request rate. In the example above, Gitaly is
+handling about 4000 requests per second.
+
+Now that you have established that you can monitor the Gitaly authentication behavior of your GitLab
+installation, you can begin the rest of the procedure.
+
+### Enable "auth transitioning" mode
+
+Temporarily disable Gitaly authentication on the Gitaly servers by putting them into "auth
+transitioning" mode as follows:
+
+```ruby
+# in /etc/gitlab/gitlab.rb
+gitaly['auth_transitioning'] = true
+```
+
+After you have made this change, your [Prometheus query](#verify-authentication-monitoring)
+should return something like:
+
+```prometheus
+{enforced="false",status="would be ok"} 4424.985419441742
+```
+
+Because `enforced="false"`, it is safe to start rolling out the new token.
+
+### Update Gitaly authentication token
+
+To update to a new Gitaly authentication token, on each Gitaly client **and** Gitaly server:
+
+1. Update the configuration:
+
+ ```ruby
+ # in /etc/gitlab/gitlab.rb
+
+ gitaly['auth_token'] = '<new secret token>'
+ ```
+
+1. Restart Gitaly:
+
+ ```shell
+ gitlab-ctl restart gitaly
+ ```
+
+If you run your [Prometheus query](#verify-authentication-monitoring) while this change is
+being rolled out, you see non-zero values for the `enforced="false",status="denied"` counter.
+
+### Ensure there are no authentication failures
+
+After the new token is set, and all services involved have been restarted, you will
+[temporarily see](#verify-authentication-monitoring) a mix of:
+
+- `status="would be ok"`.
+- `status="denied"`.
+
+After the new token is picked up by all Gitaly clients and Gitaly servers, the
+**only non-zero rate** should be `enforced="false",status="would be ok"`.
+
+### Disable "auth transitioning" mode
+
+To re-enable Gitaly authentication, disable "auth transitioning" mode. Update the configuration on
+your Gitaly servers as follows:
+
+```ruby
+# in /etc/gitlab/gitlab.rb
+gitaly['auth_transitioning'] = false
+```
+
+WARNING:
+Without completing this step, you have **no Gitaly authentication**.
+
+### Verify authentication is enforced
+
+Refresh your [Prometheus query](#verify-authentication-monitoring). You should now see a similar
+result as you did at the start. For example:
+
+```prometheus
+{enforced="true",status="ok"} 4424.985419441742
+```
+
+Note that `enforced="true"` means that authentication is being enforced.
diff --git a/doc/administration/gitaly/img/gitaly_network_13_9.png b/doc/administration/gitaly/img/gitaly_network_13_9.png
new file mode 100644
index 00000000000..e678f6d7abb
--- /dev/null
+++ b/doc/administration/gitaly/img/gitaly_network_13_9.png
Binary files differ
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index f02b9b8fc1a..b314fa85af7 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -40,931 +40,8 @@ The following is a high-level architecture overview of how Gitaly is used.
## Configure Gitaly
-The Gitaly service itself is configured by using a [TOML configuration file](reference.md).
-
-To change Gitaly settings:
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb` and add or change the
- [Gitaly settings](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/1dd07197c7e5ae23626aad5a4a070a800b670380/files/gitlab-config-template/gitlab.rb.template#L1622-1676).
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Edit `/home/git/gitaly/config.toml` and add or change the [Gitaly settings](https://gitlab.com/gitlab-org/gitaly/blob/master/config.toml.example).
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-The following configuration options are also available:
-
-- Enabling [TLS support](#enable-tls-support).
-- Configuring the [number of `gitaly-ruby` workers](#configure-number-of-gitaly-ruby-workers).
-- Limiting [RPC concurrency](#limit-rpc-concurrency).
-
-## Run Gitaly on its own server
-
-By default, Gitaly is run on the same server as Gitaly clients and is
-[configured as above](#configure-gitaly). Single-server installations are best served by
-this default configuration used by:
-
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/).
-- The GitLab [source installation guide](../../install/installation.md).
-
-However, Gitaly can be deployed to its own server, which can benefit GitLab installations that span
-multiple machines.
-
-NOTE:
-When configured to run on their own servers, Gitaly servers
-[must be upgraded](https://docs.gitlab.com/omnibus/update/#upgrading-gitaly-servers) before Gitaly
-clients in your cluster.
-
-The process for setting up Gitaly on its own server is:
-
-1. [Install Gitaly](#install-gitaly).
-1. [Configure authentication](#configure-authentication).
-1. [Configure Gitaly servers](#configure-gitaly-servers).
-1. [Configure Gitaly clients](#configure-gitaly-clients).
-1. [Disable Gitaly where not required](#disable-gitaly-where-not-required-optional) (optional).
-
-When running Gitaly on its own server, note the following regarding GitLab versions:
-
-- From GitLab 11.4, Gitaly was able to serve all Git requests without requiring a shared NFS mount
- for Git repository data, except for the
- [Elasticsearch indexer](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer).
-- From GitLab 11.8, the Elasticsearch indexer also uses Gitaly for data access. NFS can still be
- leveraged for redundancy on block-level Git data, but should be mounted only on the Gitaly
- servers.
-- From GitLab 11.8 to 12.2, it is possible to use Elasticsearch in a Gitaly setup that doesn't use
- NFS. To use Elasticsearch in these versions, the
- [repository indexer](../../integration/elasticsearch.md#elasticsearch-repository-indexer)
- must be enabled in your GitLab configuration.
-- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/6481), the new indexer is
- the default and no configuration is required.
-
-### Network architecture
-
-The following list depicts the network architecture of Gitaly:
-
-- GitLab Rails shards repositories into [repository storages](../repository_storage_paths.md).
-- `/config/gitlab.yml` contains a map from storage names to `(Gitaly address, Gitaly token)` pairs.
-- The `storage name` -\> `(Gitaly address, Gitaly token)` map in `/config/gitlab.yml` is the single
- source of truth for the Gitaly network topology.
-- A `(Gitaly address, Gitaly token)` corresponds to a Gitaly server.
-- A Gitaly server hosts one or more storages.
-- A Gitaly client can use one or more Gitaly servers.
-- Gitaly addresses must be specified in such a way that they resolve correctly for **all** Gitaly
- clients.
-- Gitaly clients are:
- - Puma or Unicorn.
- - Sidekiq.
- - GitLab Workhorse.
- - GitLab Shell.
- - Elasticsearch indexer.
- - Gitaly itself.
-- A Gitaly server must be able to make RPC calls **to itself** by using its own
- `(Gitaly address, Gitaly token)` pair as specified in `/config/gitlab.yml`.
-- Authentication is done through a static token which is shared among the Gitaly and GitLab Rails
- nodes.
-
-WARNING:
-Gitaly servers must not be exposed to the public internet as Gitaly's network traffic is unencrypted
-by default. The use of firewall is highly recommended to restrict access to the Gitaly server.
-Another option is to [use TLS](#enable-tls-support).
-
-In the following sections, we describe how to configure two Gitaly servers with secret token
-`abc123secret`:
-
-- `gitaly1.internal`.
-- `gitaly2.internal`.
-
-We assume your GitLab installation has three repository storages:
-
-- `default`.
-- `storage1`.
-- `storage2`.
-
-You can use as few as one server with one repository storage if desired.
-
-NOTE:
-The token referred to throughout the Gitaly documentation is just an arbitrary password selected by
-the administrator. It is unrelated to tokens created for the GitLab API or other similar web API
-tokens.
-
-### Install Gitaly
-
-Install Gitaly on each Gitaly server using either Omnibus GitLab or install it from source:
-
-- For Omnibus GitLab, [download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package you want but **do not** provide the `EXTERNAL_URL=` value.
-- To install from source, follow the steps at
- [Install Gitaly](../../install/installation.md#install-gitaly).
-
-### Configure authentication
-
-Gitaly and GitLab use two shared secrets for authentication:
-
-- One to authenticate gRPC requests to Gitaly.
-- A second for authentication callbacks from GitLab Shell to the GitLab internal API.
-
-**For Omnibus GitLab**
-
-To configure the Gitaly token:
-
-1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['gitaly_token'] = 'abc123secret'
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly server, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitaly['auth_token'] = 'abc123secret'
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-There are two ways to configure the GitLab Shell token.
-
-Method 1:
-
-1. Copy `/etc/gitlab/gitlab-secrets.json` from the Gitaly client to same path on the Gitaly servers
- (and any other Gitaly clients).
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) on Gitaly servers.
-
-Method 2:
-
-1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_shell['secret_token'] = 'shellsecret'
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly servers, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_shell['secret_token'] = 'shellsecret'
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Copy `/home/git/gitlab/.gitlab_shell_secret` from the Gitaly client to the same path on the
- Gitaly servers (and any other Gitaly clients).
-1. On the Gitaly clients, edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- gitlab:
- gitaly:
- token: 'abc123secret'
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. On the Gitaly servers, edit `/home/git/gitaly/config.toml`:
-
- ```toml
- [auth]
- token = 'abc123secret'
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-### Configure Gitaly servers
-
-On the Gitaly servers, you must configure storage paths and enable the network listener.
-
-If you want to reduce the risk of downtime when you enable authentication, you can temporarily
-disable enforcement. For more information, see the documentation on configuring
-[Gitaly authentication](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/configuration/README.md#authentication).
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
- ```ruby
- # /etc/gitlab/gitlab.rb
-
- # Avoid running unnecessary services on the Gitaly server
- postgresql['enable'] = false
- redis['enable'] = false
- nginx['enable'] = false
- puma['enable'] = false
- sidekiq['enable'] = false
- gitlab_workhorse['enable'] = false
- grafana['enable'] = false
- gitlab_exporter['enable'] = false
-
- # If you run a separate monitoring node you can disable these services
- alertmanager['enable'] = false
- prometheus['enable'] = false
-
- # If you don't run a separate monitoring node you can
- # enable Prometheus access & disable these extra services.
- # This makes Prometheus listen on all interfaces. You must use firewalls to restrict access to this address/port.
- # prometheus['listen_address'] = '0.0.0.0:9090'
- # prometheus['monitor_kubernetes'] = false
-
- # If you don't want to run monitoring services uncomment the following (not recommended)
- # node_exporter['enable'] = false
-
- # Prevent database connections during 'gitlab-ctl reconfigure'
- gitlab_rails['rake_cache_clear'] = false
- gitlab_rails['auto_migrate'] = false
-
- # Configure the gitlab-shell API callback URL. Without this, `git push` will
- # fail. This can be your 'front door' GitLab URL or an internal load
- # balancer.
- # Don't forget to copy `/etc/gitlab/gitlab-secrets.json` from Gitaly client to Gitaly server.
- gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
-
- # Make Gitaly accept connections on all network interfaces. You must use
- # firewalls to restrict access to this address/port.
- # Comment out following line if you only want to support TLS connections
- gitaly['listen_addr'] = "0.0.0.0:8075"
- ```
-
-1. Append the following to `/etc/gitlab/gitlab.rb` for each respective Gitaly server:
-
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
- On `gitaly1.internal`:
-
- ```ruby
- git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
- })
- ```
-
- On `gitaly2.internal`:
-
- ```ruby
- git_data_dirs({
- 'storage2' => {
- 'path' => '/srv/gitlab/git-data'
- },
- })
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Run `sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml`
- to confirm that Gitaly can perform callbacks to the GitLab internal API.
-
-**For installations from source**
-
-1. Edit `/home/git/gitaly/config.toml`:
-
- ```toml
- listen_addr = '0.0.0.0:8075'
-
- internal_socket_dir = '/var/opt/gitlab/gitaly'
-
- [logging]
- format = 'json'
- level = 'info'
- dir = '/var/log/gitaly'
- ```
-
-1. Append the following to `/home/git/gitaly/config.toml` for each respective Gitaly server:
-
- On `gitaly1.internal`:
-
- ```toml
- [[storage]]
- name = 'default'
- path = '/var/opt/gitlab/git-data/repositories'
-
- [[storage]]
- name = 'storage1'
- path = '/mnt/gitlab/git-data/repositories'
- ```
-
- On `gitaly2.internal`:
-
- ```toml
- [[storage]]
- name = 'storage2'
- path = '/srv/gitlab/git-data/repositories'
- ```
-
-1. Edit `/home/git/gitlab-shell/config.yml`:
-
- ```yaml
- gitlab_url: https://gitlab.example.com
- ```
-
-1. Save the files and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. Run `sudo -u git /home/git/gitaly/gitaly-hooks check /home/git/gitaly/config.toml`
- to confirm that Gitaly can perform callbacks to the GitLab internal API.
-
-### Configure Gitaly clients
-
-As the final step, you must update Gitaly clients to switch from using local Gitaly service to use
-the Gitaly servers you just configured.
-
-This can be risky because anything that prevents your Gitaly clients from reaching the Gitaly
-servers causes all Gitaly requests to fail. For example, any sort of network, firewall, or name
-resolution problems.
-
-Additionally, you must [disable Rugged](../nfs.md#improving-nfs-performance-with-gitlab)
-if previously enabled manually.
-
-Gitaly makes the following assumptions:
-
-- Your `gitaly1.internal` Gitaly server can be reached at `gitaly1.internal:8075` from your Gitaly
- clients, and that Gitaly server can read, write, and set permissions on `/mnt/gitlab/default` and
- `/mnt/gitlab/storage1`.
-- Your `gitaly2.internal` Gitaly server can be reached at `gitaly2.internal:8075` from your Gitaly
- clients, and that Gitaly server can read, write, and set permissions on `/mnt/gitlab/storage2`.
-- Your `gitaly1.internal` and `gitaly2.internal` Gitaly servers can reach each other.
-
-You can't define Gitaly servers with some as a local Gitaly server
-(without `gitaly_address`) and some as remote
-server (with `gitaly_address`) unless you use
-[mixed configuration](#mixed-configuration).
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
- })
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Run `sudo gitlab-rake gitlab:gitaly:check` on the Gitaly client (for example, the
- Rails application) to confirm it can connect to Gitaly servers.
-1. Tail the logs to see the requests:
-
- ```shell
- sudo gitlab-ctl tail gitaly
- ```
-
-**For installations from source**
-
-1. Edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- gitlab:
- repositories:
- storages:
- default:
- gitaly_address: tcp://gitaly1.internal:8075
- path: /some/local/path
- storage1:
- gitaly_address: tcp://gitaly1.internal:8075
- path: /some/local/path
- storage2:
- gitaly_address: tcp://gitaly2.internal:8075
- path: /some/local/path
- ```
-
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no data is stored in
- this folder. This requirement is scheduled to be removed when
- [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. Run `sudo -u git -H bundle exec rake gitlab:gitaly:check RAILS_ENV=production` to confirm the
- Gitaly client can connect to Gitaly servers.
-1. Tail the logs to see the requests:
-
- ```shell
- tail -f /home/git/gitlab/log/gitaly.log
- ```
-
-When you tail the Gitaly logs on your Gitaly server, you should see requests coming in. One sure way
-to trigger a Gitaly request is to clone a repository from GitLab over HTTP or HTTPS.
-
-WARNING:
-If you have [server hooks](../server_hooks.md) configured, either per repository or globally, you
-must move these to the Gitaly servers. If you have multiple Gitaly servers, copy your server hooks
-to all Gitaly servers.
-
-#### Mixed configuration
-
-GitLab can reside on the same server as one of many Gitaly servers, but doesn't support
-configuration that mixes local and remote configuration. The following setup is incorrect, because:
-
-- All addresses must be reachable from the other Gitaly servers.
-- `storage1` is assigned a Unix socket for `gitaly_address` which is
- invalid for some of the Gitaly servers.
-
-```ruby
-git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'path' => '/mnt/gitlab/git-data' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
-})
-```
-
-To combine local and remote Gitaly servers, use an external address for the local Gitaly server. For
-example:
-
-```ruby
-git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- # Address of the GitLab server that has Gitaly running on it
- 'storage1' => { 'gitaly_address' => 'tcp://gitlab.internal:8075', 'path' => '/mnt/gitlab/git-data' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
-})
-
-# Make Gitaly accept connections on all network interfaces
-gitaly['listen_addr'] = "0.0.0.0:8075"
-
-# Or for TLS
-gitaly['tls_listen_addr'] = "0.0.0.0:9999"
-gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
-gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
-```
-
-`path` can be included only for storage shards on the local Gitaly server.
-If it's excluded, default Git storage directory is used for that storage shard.
-
-### Disable Gitaly where not required (optional)
-
-If you run Gitaly [as a remote service](#run-gitaly-on-its-own-server), consider
-disabling the local Gitaly service that runs on your GitLab server by default, and run it
-only where required.
-
-Disabling Gitaly on the GitLab instance makes sense only when you run GitLab in a custom cluster configuration, where
-Gitaly runs on a separate machine from the GitLab instance. Disabling Gitaly on all machines in the cluster is not
-a valid configuration (some machines much act as Gitaly servers).
-
-To disable Gitaly on a GitLab server:
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitaly['enable'] = false
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Edit `/etc/default/gitlab`:
-
- ```shell
- gitaly_enabled=false
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-## Enable TLS support
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22602) in GitLab 11.8.
-> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3160) in GitLab 13.6, outgoing TLS connections to GitLab provide client certificates if configured.
-
-Gitaly supports TLS encryption. To communicate with a Gitaly instance that listens for secure
-connections, use the `tls://` URL scheme in the `gitaly_address` of the corresponding
-storage entry in the GitLab configuration.
-
-Gitaly provides the same server certificates as client certificates in TLS
-connections to GitLab. This can be used as part of a mutual TLS authentication strategy
-when combined with reverse proxies (for example, NGINX) that validate client certificate
-to grant access to GitLab.
-
-You must supply your own certificates as this isn't provided automatically. The certificate
-corresponding to each Gitaly server must be installed on that Gitaly server.
-
-Additionally, the certificate (or its certificate authority) must be installed on all:
-
-- Gitaly servers.
-- Gitaly clients that communicate with it.
-
-Note the following:
-
-- The certificate must specify the address you use to access the Gitaly server. You must add the hostname or IP address as a Subject Alternative Name to the certificate.
-- You can configure Gitaly servers with both an unencrypted listening address `listen_addr` and an
- encrypted listening address `tls_listen_addr` at the same time. This allows you to gradually
- transition from unencrypted to encrypted traffic if necessary.
-
-To configure Gitaly with TLS:
-
-**For Omnibus GitLab**
-
-1. Create certificates for Gitaly servers.
-1. On the Gitaly clients, copy the certificates (or their certificate authority) into
- `/etc/gitlab/trusted-certs`:
-
- ```shell
- sudo cp cert.pem /etc/gitlab/trusted-certs/
- ```
-
-1. On the Gitaly clients, edit `git_data_dirs` in `/etc/gitlab/gitlab.rb` as follows:
-
- ```ruby
- git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
- })
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate
- there:
-
- ```shell
- sudo mkdir -p /etc/gitlab/ssl
- sudo chmod 755 /etc/gitlab/ssl
- sudo cp key.pem cert.pem /etc/gitlab/ssl/
- sudo chmod 644 key.pem cert.pem
- ```
-
-1. Copy all Gitaly server certificates (or their certificate authority) to
- `/etc/gitlab/trusted-certs` so that Gitaly servers trust the certificate when calling into themselves
- or other Gitaly servers:
-
- ```shell
- sudo cp cert1.pem cert2.pem /etc/gitlab/trusted-certs/
- ```
-
-1. Edit `/etc/gitlab/gitlab.rb` and add:
-
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
- ```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Verify Gitaly traffic is being served over TLS by
- [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
-1. (Optional) Improve security by:
- 1. Disabling non-TLS connections by commenting out or deleting `gitaly['listen_addr']` in
- `/etc/gitlab/gitlab.rb`.
- 1. Saving the file.
- 1. [Reconfiguring GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Create certificates for Gitaly servers.
-1. On the Gitaly clients, copy the certificates into the system trusted certificates:
-
- ```shell
- sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
- sudo update-ca-certificates
- ```
-
-1. On the Gitaly clients, edit `storages` in `/home/git/gitlab/config/gitlab.yml` as follows:
-
- ```yaml
- gitlab:
- repositories:
- storages:
- default:
- gitaly_address: tls://gitaly1.internal:9999
- path: /some/local/path
- storage1:
- gitaly_address: tls://gitaly1.internal:9999
- path: /some/local/path
- storage2:
- gitaly_address: tls://gitaly2.internal:9999
- path: /some/local/path
- ```
-
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no data is stored
- in this folder. This requirement is scheduled to be removed when
- [Gitaly issue #1282](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. On the Gitaly servers, create or edit `/etc/default/gitlab` and add:
-
- ```shell
- export SSL_CERT_DIR=/etc/gitlab/ssl
- ```
-
-1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
-
- ```shell
- sudo mkdir -p /etc/gitlab/ssl
- sudo chmod 755 /etc/gitlab/ssl
- sudo cp key.pem cert.pem /etc/gitlab/ssl/
- sudo chmod 644 key.pem cert.pem
- ```
-
-1. Copy all Gitaly server certificates (or their certificate authority) to the system trusted
- certificates folder so Gitaly server trusts the certificate when calling into itself or other Gitaly
- servers.
-
- ```shell
- sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
- sudo update-ca-certificates
- ```
-
-1. Edit `/home/git/gitaly/config.toml` and add:
-
- ```toml
- tls_listen_addr = '0.0.0.0:9999'
-
- [tls]
- certificate_path = '/etc/gitlab/ssl/cert.pem'
- key_path = '/etc/gitlab/ssl/key.pem'
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. Verify Gitaly traffic is being served over TLS by
- [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
-1. (Optional) Improve security by:
- 1. Disabling non-TLS connections by commenting out or deleting `listen_addr` in
- `/home/git/gitaly/config.toml`.
- 1. Saving the file.
- 1. [Restarting GitLab](../restart_gitlab.md#installations-from-source).
-
-### Observe type of Gitaly connections
-
-[Prometheus](../monitoring/prometheus/index.md) can be used observe what type of connections Gitaly
-is serving a production environment. Use the following Prometheus query:
-
-```prometheus
-sum(rate(gitaly_connections_total[5m])) by (type)
-```
-
-## `gitaly-ruby`
-
-Gitaly was developed to replace the Ruby application code in GitLab.
-
-To save time and avoid the risk of rewriting existing application logic, we chose to copy some
-application code from GitLab into Gitaly.
-
-To be able to run that code, `gitaly-ruby` was created, which is a "sidecar" process for the main
-Gitaly Go process. Some examples of things that are implemented in `gitaly-ruby` are:
-
-- RPCs that deal with wikis.
-- RPCs that create commits on behalf of a user, such as merge commits.
-
-We recommend:
-
-- At least 300 MB memory per worker.
-- No more than one worker per core.
-
-NOTE:
-`gitaly-ruby` is planned to be eventually removed. To track progress, see the
-[Remove the Gitaly-Ruby sidecar](https://gitlab.com/groups/gitlab-org/-/epics/2862) epic.
-
-### Configure number of `gitaly-ruby` workers
-
-`gitaly-ruby` has much less capacity than Gitaly implemented in Go. If your Gitaly server has to handle lots of
-requests, the default setting of having just one active `gitaly-ruby` sidecar might not be enough.
-
-If you see `ResourceExhausted` errors from Gitaly, it's very likely that you have not enough
-`gitaly-ruby` capacity.
-
-You can increase the number of `gitaly-ruby` processes on your Gitaly server with the following
-settings:
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- # Default is 2 workers. The minimum is 2; 1 worker is always reserved as
- # a passive stand-by.
- gitaly['ruby_num_workers'] = 4
- ```
-
-1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Edit `/home/git/gitaly/config.toml`:
-
- ```toml
- [gitaly-ruby]
- num_workers = 4
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-## Limit RPC concurrency
-
-Clone traffic can put a large strain on your Gitaly service. The bulk of the work gets done in the
-either of the following RPCs:
-
-- `SSHUploadPack` (for Git SSH).
-- `PostUploadPack` (for Git HTTP).
-
-To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in
-Gitaly's configuration file. For example:
-
-```ruby
-# in /etc/gitlab/gitlab.rb
-
-gitaly['concurrency'] = [
- {
- 'rpc' => "/gitaly.SmartHTTPService/PostUploadPack",
- 'max_per_repo' => 20
- },
- {
- 'rpc' => "/gitaly.SSHService/SSHUploadPack",
- 'max_per_repo' => 20
- }
-]
-```
-
-This limits the number of in-flight RPC calls for the given RPCs. The limit is applied per
-repository. In the example above:
-
-- Each repository served by the Gitaly server can have at most 20 simultaneous `PostUploadPack` RPC
- calls in flight, and the same for `SSHUploadPack`.
-- If another request comes in for a repository that has used up its 20 slots, that request gets
- queued.
-
-You can observe the behavior of this queue using the Gitaly logs and Prometheus:
-
-- In the Gitaly logs, look for the string (or structured log field) `acquire_ms`. Messages that have
- this field are reporting about the concurrency limiter.
-- In Prometheus, look for the following metrics:
-
- - `gitaly_rate_limiting_in_progress`.
- - `gitaly_rate_limiting_queued`.
- - `gitaly_rate_limiting_seconds`.
-
-NOTE:
-Although the name of the Prometheus metric contains `rate_limiting`, it's a concurrency limiter, not
-a rate limiter. If a Gitaly client makes 1,000 requests in a row very quickly, concurrency doesn't
-exceed 1, and the concurrency limiter has no effect.
-
-## Background Repository Optimization
-
-Empty directories and unneeded config settings may accumulate in a repository and
-slow down Git operations. Gitaly can schedule a daily background task with a maximum duration
-to clean up these items and improve performance.
-
-WARNING:
-This is an experimental feature and may place significant load on the host while running.
-Make sure to schedule this during off-peak hours and keep the duration short (for example, 30-60 minutes).
-
-**For Omnibus GitLab**
-
-Edit `/etc/gitlab/gitlab.rb` and add:
-
-```ruby
-gitaly['daily_maintenance_start_hour'] = 4
-gitaly['daily_maintenance_start_minute'] = 30
-gitaly['daily_maintenance_duration'] = '30m'
-gitaly['daily_maintenance_storages'] = ["default"]
-```
-
-**For installations from source**
-
-Edit `/home/git/gitaly/config.toml` and add:
-
-```toml
-[daily_maintenance]
-start_hour = 4
-start_minute = 30
-duration = '30m'
-storages = ["default"]
-```
-
-## Rotate Gitaly authentication token
-
-Rotating credentials in a production environment often requires downtime, causes outages, or both.
-
-However, you can rotate Gitaly credentials without a service interruption. Rotating a Gitaly
-authentication token involves:
-
-- [Verifying authentication monitoring](#verify-authentication-monitoring).
-- [Enabling "auth transitioning" mode](#enable-auth-transitioning-mode).
-- [Updating Gitaly authentication tokens](#update-gitaly-authentication-token).
-- [Ensuring there are no authentication failures](#ensure-there-are-no-authentication-failures).
-- [Disabling "auth transitioning" mode](#disable-auth-transitioning-mode).
-- [Verifying authentication is enforced](#verify-authentication-is-enforced).
-
-This procedure also works if you are running GitLab on a single server. In that case, "Gitaly
-server" and "Gitaly client" refers to the same machine.
-
-### Verify authentication monitoring
-
-Before rotating a Gitaly authentication token, verify that you can monitor the authentication
-behavior of your GitLab installation using Prometheus. Use the following Prometheus query:
-
-```prometheus
-sum(rate(gitaly_authentications_total[5m])) by (enforced, status)
-```
-
-In a system where authentication is configured correctly and where you have live traffic, you
-see something like this:
-
-```prometheus
-{enforced="true",status="ok"} 4424.985419441742
-```
-
-There may also be other numbers with rate 0. We care only about the non-zero numbers.
-
-The only non-zero number should have `enforced="true",status="ok"`. If you have other non-zero
-numbers, something is wrong in your configuration.
-
-The `status="ok"` number reflects your current request rate. In the example above, Gitaly is
-handling about 4000 requests per second.
-
-Now that you have established that you can monitor the Gitaly authentication behavior of your GitLab
-installation, you can begin the rest of the procedure.
-
-### Enable "auth transitioning" mode
-
-Temporarily disable Gitaly authentication on the Gitaly servers by putting them into "auth
-transitioning" mode as follows:
-
-```ruby
-# in /etc/gitlab/gitlab.rb
-gitaly['auth_transitioning'] = true
-```
-
-After you have made this change, your [Prometheus query](#verify-authentication-monitoring)
-should return something like:
-
-```prometheus
-{enforced="false",status="would be ok"} 4424.985419441742
-```
-
-Because `enforced="false"`, it is safe to start rolling out the new token.
-
-### Update Gitaly authentication token
-
-To update to a new Gitaly authentication token, on each Gitaly client **and** Gitaly server:
-
-1. Update the configuration:
-
- ```ruby
- # in /etc/gitlab/gitlab.rb
-
- gitaly['auth_token'] = '<new secret token>'
- ```
-
-1. Restart Gitaly:
-
- ```shell
- gitlab-ctl restart gitaly
- ```
-
-If you run your [Prometheus query](#verify-authentication-monitoring) while this change is
-being rolled out, you see non-zero values for the `enforced="false",status="denied"` counter.
-
-### Ensure there are no authentication failures
-
-After the new token is set, and all services involved have been restarted, you will
-[temporarily see](#verify-authentication-monitoring) a mix of:
-
-- `status="would be ok"`.
-- `status="denied"`.
-
-After the new token is picked up by all Gitaly clients and Gitaly servers, the
-**only non-zero rate** should be `enforced="false",status="would be ok"`.
-
-### Disable "auth transitioning" mode
-
-To re-enable Gitaly authentication, disable "auth transitioning" mode. Update the configuration on
-your Gitaly servers as follows:
-
-```ruby
-# in /etc/gitlab/gitlab.rb
-gitaly['auth_transitioning'] = false
-```
-
-WARNING:
-Without completing this step, you have **no Gitaly authentication**.
-
-### Verify authentication is enforced
-
-Refresh your [Prometheus query](#verify-authentication-monitoring). You should now see a similar
-result as you did at the start. For example:
-
-```prometheus
-{enforced="true",status="ok"} 4424.985419441742
-```
-
-Note that `enforced="true"` means that authentication is being enforced.
+Gitaly comes pre-configured with Omnibus GitLab. For more information on customizing your
+Gitaly installation, see [Configure Gitaly](configure_gitaly.md).
## Direct Git access bypassing Gitaly
@@ -1059,6 +136,12 @@ To see if GitLab can access the repository file system directly, we use the foll
Direct Git access is enable by default in Omnibus GitLab because it fills in the correct repository
paths in the GitLab configuration file `config/gitlab.yml`. This satisfies the UUID check.
+WARNING:
+If directly copying repository data from a GitLab server to Gitaly, ensure that the metadata file,
+default path `/var/opt/gitlab/git-data/repositories/.gitaly-metadata`, is not included in the transfer.
+Copying this file causes GitLab to use the Rugged patches for repositories hosted on the Gitaly server,
+leading to `Error creating pipeline` and `Commit not found` errors, or stale data.
+
### Transition to Gitaly Cluster
For the sake of removing complexity, we must remove direct Git access in GitLab. However, we can't
@@ -1150,7 +233,7 @@ internally pools and re-uses those across RPCs.
### Observing `gitaly-ruby` traffic
-[`gitaly-ruby`](#gitaly-ruby) is an internal implementation detail of Gitaly,
+[`gitaly-ruby`](configure_gitaly.md#gitaly-ruby) is an internal implementation detail of Gitaly,
so, there's not that much visibility into what goes on inside
`gitaly-ruby` processes.
@@ -1178,7 +261,7 @@ If you run Gitaly on its own server and notice these conditions:
make changes to them in the web UI.
Gitaly may be failing to authenticate with the Gitaly client because it has the
-[wrong secrets file](#configure-gitaly-servers).
+[wrong secrets file](configure_gitaly.md#configure-gitaly-servers).
Confirm the following are all true:
@@ -1198,7 +281,7 @@ Confirm the following are all true:
successfully creates the project, but doesn't create the README.
- When [tailing the logs](https://docs.gitlab.com/omnibus/settings/logs.html#tail-logs-in-a-console-on-the-server)
on a Gitaly client and reproducing the error, you get `401` errors
- when reaching the `/api/v4/internal/allowed` endpoint:
+ when reaching the [`/api/v4/internal/allowed`](../../development/internal_api.md) endpoint:
```shell
# api_json.log
@@ -1259,7 +342,7 @@ Confirm the following are all true:
[IP] - - [18/Jul/2019:00:30:14 +0000] "POST /api/v4/internal/allowed HTTP/1.1" 401 30 "" "Ruby"
```
-To fix this problem, confirm that your [`gitlab-secrets.json` file](#configure-gitaly-servers)
+To fix this problem, confirm that your [`gitlab-secrets.json` file](configure_gitaly.md#configure-gitaly-servers)
on the Gitaly server matches the one on Gitaly client. If it doesn't match,
update the secrets file on the Gitaly server to match the Gitaly client, then
[reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index 45f478b8d16..80b5c1bb799 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -701,7 +701,7 @@ Particular attention should be shown to:
`gitaly-2`, and `gitaly-3` as Gitaly storage names.
For more information on Gitaly server configuration, see our [Gitaly
-documentation](index.md#configure-gitaly-servers).
+documentation](configure_gitaly.md#configure-gitaly-servers).
1. SSH into the **Gitaly** node and login as root:
@@ -834,7 +834,7 @@ scope of the GitLab documentation.
NOTE:
The load balancer must be configured to accept traffic from the Gitaly nodes in
addition to the GitLab nodes. Some requests handled by
-[`gitaly-ruby`](index.md#gitaly-ruby) sidecar processes call into the main Gitaly
+[`gitaly-ruby`](configure_gitaly.md#gitaly-ruby) sidecar processes call into the main Gitaly
process. `gitaly-ruby` uses the Gitaly address set in the GitLab server's
`git_data_dirs` setting to make this connection.
diff --git a/doc/administration/gitaly/reference.md b/doc/administration/gitaly/reference.md
index 5105b9ed0d4..f08b03017e4 100644
--- a/doc/administration/gitaly/reference.md
+++ b/doc/administration/gitaly/reference.md
@@ -91,7 +91,7 @@ certificate_path = '/home/git/cert.cert'
key_path = '/home/git/key.pem'
```
-[Read more](index.md#enable-tls-support) about TLS in Gitaly.
+[Read more](configure_gitaly.md#enable-tls-support) about TLS in Gitaly.
### Storage
diff --git a/doc/administration/index.md b/doc/administration/index.md
index e5f20e3ba05..15a3bee4004 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -130,7 +130,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Kerberos authentication](../integration/kerberos.md).
- See also other [authentication](../topics/authentication/index.md#gitlab-administrators) topics (for example, enforcing 2FA).
- [Email users](../tools/email.md): Email GitLab users from within GitLab.
-- [User Cohorts](../user/admin_area/analytics/user_cohorts.md): Display the monthly cohorts of new users and their activities over time.
+- [User Cohorts](../user/admin_area/user_cohorts.md): Display the monthly cohorts of new users and their activities over time.
- [Audit events](audit_events.md): View the changes made within the GitLab server for:
- Groups and projects.
- Instances.
@@ -176,7 +176,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Job logs](job_logs.md): Information about the job logs.
- [Register runners](../ci/runners/README.md#types-of-runners): Learn how to register and configure runners.
- [Shared runners pipelines quota](../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota): Limit the usage of pipeline minutes for shared runners.
-- [Enable/disable Auto DevOps](../topics/autodevops/index.md#enablingdisabling-auto-devops): Enable or disable Auto DevOps for your instance.
+- [Enable/disable Auto DevOps](../topics/autodevops/index.md#enable-or-disable-auto-devops): Enable or disable Auto DevOps for your instance.
## Snippet settings
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 27e8b13812f..ac37ee00210 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -107,7 +107,7 @@ Limit the maximum daily member invitations allowed per group hierarchy.
Clone traffic can put a large strain on your Gitaly service. To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in Gitaly’s configuration file.
-Read more on [Gitaly concurrency limits](gitaly/index.md#limit-rpc-concurrency).
+Read more on [Gitaly concurrency limits](gitaly/configure_gitaly.md#limit-rpc-concurrency).
- **Default rate limit** - Disabled
@@ -526,7 +526,7 @@ amount of memory during indexing.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201826) in GitLab 12.8.
-You can set a limit on the content of text fields indexed for Global Search.
+You can set a limit on the content of text fields indexed for Advanced Search.
Setting a maximum helps to reduce the load of the indexing processes. If any
text field exceeds this limit then the text will be truncated to this number of
characters and the rest will not be indexed and hence will not be searchable.
diff --git a/doc/administration/instance_review.md b/doc/administration/instance_review.md
index 56a305fa4da..f2ba3a5a562 100644
--- a/doc/administration/instance_review.md
+++ b/doc/administration/instance_review.md
@@ -4,7 +4,7 @@ group: Conversion
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Instance Review
+# Instance Review **(FREE SELF)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6995) in [GitLab Free](https://about.gitlab.com/pricing/) 11.3.
diff --git a/doc/administration/integration/kroki.md b/doc/administration/integration/kroki.md
index 5e458399773..9e9ea62c44e 100644
--- a/doc/administration/integration/kroki.md
+++ b/doc/administration/integration/kroki.md
@@ -56,7 +56,7 @@ You need to enable Kroki integration from Settings under Admin Area.
To do that, log in with an administrator account and follow these steps:
1. Select the Admin Area (**{admin}**) icon.
-1. Navigate to **Settings > General**.
+1. Go to **Settings > General**.
1. Expand the **Kroki** section.
1. Select **Enable Kroki** checkbox.
1. Enter the **Kroki URL**.
diff --git a/doc/administration/integration/plantuml.md b/doc/administration/integration/plantuml.md
index dbbe17cccc8..834f4047fdd 100644
--- a/doc/administration/integration/plantuml.md
+++ b/doc/administration/integration/plantuml.md
@@ -5,22 +5,94 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, howto
---
-# PlantUML & GitLab **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8537) in GitLab 8.16.
+# PlantUML and GitLab **(FREE)**
When [PlantUML](https://plantuml.com) integration is enabled and configured in
-GitLab you can create diagrams in AsciiDoc and Markdown documents
-created in snippets, wikis, and repositories.
+GitLab, you can create diagrams in snippets, wikis, and repositories. To set up
+the integration, you must:
+
+1. [Configure your PlantUML server](#configure-your-plantuml-server).
+1. [Configure local PlantUML access](#configure-local-plantuml-access).
+1. [Configure PlantUML security](#configure-plantuml-security).
+1. [Enable the integration](#enable-plantuml-integration).
+
+After completing the integration, PlantUML converts `plantuml`
+blocks to an HTML image tag, with the source pointing to the PlantUML instance. The PlantUML
+diagram delimiters `@startuml`/`@enduml` aren't required, as these are replaced
+by the `plantuml` block:
+
+- **Markdown**
+
+ ````markdown
+ ```plantuml
+ Bob -> Alice : hello
+ Alice -> Bob : hi
+ ```
+ ````
+
+- **AsciiDoc**
+
+ ```plaintext
+ [plantuml, format="png", id="myDiagram", width="200px"]
+ ----
+ Bob->Alice : hello
+ Alice -> Bob : hi
+ ----
+ ```
+
+- **reStructuredText**
-## PlantUML Server
+ ```plaintext
+ .. plantuml::
+ :caption: Caption with **bold** and *italic*
+
+ Bob -> Alice: hello
+ Alice -> Bob: hi
+ ```
-Before you can enable PlantUML in GitLab; set up your own PlantUML
-server to generate the diagrams.
+ Although you can use the `uml::` directive for compatibility with
+ [`sphinxcontrib-plantuml`](https://pypi.org/project/sphinxcontrib-plantuml/),
+ GitLab supports only the `caption` option.
+
+If the PlantUML server is correctly configured, these examples should render a
+diagram instead of the code block:
+
+```plantuml
+Bob -> Alice : hello
+Alice -> Bob : hi
+```
+
+Inside the block you can add any of the diagrams PlantUML supports, such as:
+
+- [Activity](https://plantuml.com/activity-diagram-legacy)
+- [Class](https://plantuml.com/class-diagram)
+- [Component](https://plantuml.com/component-diagram)
+- [Object](https://plantuml.com/object-diagram)
+- [Sequence](https://plantuml.com/sequence-diagram)
+- [State](https://plantuml.com/state-diagram)
+- [Use Case](https://plantuml.com/use-case-diagram)
+
+You can add parameters to block definitions:
+
+- `format`: Can be either `png` (default) or `svg`. Use `svg` with care, as it's
+ not supported by all browsers, and isn't supported by Markdown.
+- `id`: A CSS ID added to the diagram HTML tag.
+- `width`: Width attribute added to the image tag.
+- `height`: Height attribute added to the image tag.
+
+Markdown does not support any parameters, and always uses PNG format.
+
+## Configure your PlantUML server
+
+Before you can enable PlantUML in GitLab, set up your own PlantUML
+server to generate the diagrams:
+
+- [In Docker](#docker).
+- [In Debian/Ubuntu](#debianubuntu).
### Docker
-With Docker, you can just run a container like this:
+To run a PlantUML container in Docker, run this command:
```shell
docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat
@@ -29,8 +101,9 @@ docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat
The **PlantUML URL** is the hostname of the server running the container.
When running GitLab in Docker, it must have access to the PlantUML container.
-You can achieve that by using [Docker Compose](https://docs.docker.com/compose/).
-A basic `docker-compose.yml` file could contain:
+To achieve that, use [Docker Compose](https://docs.docker.com/compose/).
+In this basic `docker-compose.yml` file, PlantUML is accessible to GitLab at the URL
+`http://plantuml:8080/`:
```yaml
version: "3"
@@ -46,37 +119,32 @@ services:
container_name: plantuml
```
-In this scenario, PlantUML is accessible to GitLab at the URL
-`http://plantuml:8080/`.
-
### Debian/Ubuntu
-You can also install and configure a PlantUML server in Debian/Ubuntu distributions using Tomcat.
+You can install and configure a PlantUML server in Debian/Ubuntu distributions
+using Tomcat:
-First you need to create a `plantuml.war` file from the source code:
+1. Run these commands to create a `plantuml.war` file from the source code:
-```shell
-sudo apt-get install graphviz openjdk-8-jdk git-core maven
-git clone https://github.com/plantuml/plantuml-server.git
-cd plantuml-server
-mvn package
-```
+ ```shell
+ sudo apt-get install graphviz openjdk-8-jdk git-core maven
+ git clone https://github.com/plantuml/plantuml-server.git
+ cd plantuml-server
+ mvn package
+ ```
-The above sequence of commands generates a `.war` file you can deploy with Tomcat:
+1. Deploy the `.war` file from the previous step with these commands:
-```shell
-sudo apt-get install tomcat8
-sudo cp target/plantuml.war /var/lib/tomcat8/webapps/plantuml.war
-sudo chown tomcat8:tomcat8 /var/lib/tomcat8/webapps/plantuml.war
-sudo service tomcat8 restart
-```
+ ```shell
+ sudo apt-get install tomcat8
+ sudo cp target/plantuml.war /var/lib/tomcat8/webapps/plantuml.war
+ sudo chown tomcat8:tomcat8 /var/lib/tomcat8/webapps/plantuml.war
+ sudo service tomcat8 restart
+ ```
-After the Tomcat service restarts, the PlantUML service is ready and
-listening for requests on port 8080:
-
-```plaintext
-http://localhost:8080/plantuml
-```
+The Tomcat service should restart. After the restart is complete, the
+PlantUML service is ready and listening for requests on port 8080:
+`http://localhost:8080/plantuml`
To change these defaults, edit the `/etc/tomcat8/server.xml` file.
@@ -85,40 +153,44 @@ The default URL is different when using this approach. The Docker-based image
makes the service available at the root URL, with no relative path. Adjust
the configuration below accordingly.
-### Making local PlantUML accessible using custom GitLab setup
+## Configure local PlantUML access
-The PlantUML server runs locally on your server, so it is not accessible
-externally by default. As such, it is necessary to catch external PlantUML
-calls and redirect them to the local server.
+The PlantUML server runs locally on your server, so it can't be accessed
+externally by default. Your server must catch external PlantUML
+calls to `https://gitlab.example.com/-/plantuml/` and redirect them to the
+local PlantUML server. Depending on your setup, the URL is either of the
+following:
-The idea is to redirect each call to `https://gitlab.example.com/-/plantuml/`
-to the local PlantUML server `http://plantuml:8080/` or `http://localhost:8080/plantuml/`, depending on your setup.
+- `http://plantuml:8080/`
+- `http://localhost:8080/plantuml/`
-To enable the redirection, add the following line in `/etc/gitlab/gitlab.rb`:
+If you're running [GitLab with TLS](https://docs.gitlab.com/omnibus/settings/ssl.html)
+you must configure this redirection, because PlantUML uses the insecure HTTP protocol.
+Newer browsers such as [Google Chrome 86+](https://www.chromestatus.com/feature/4926989725073408)
+don't load insecure HTTP resources on pages served over HTTPS.
-```ruby
-# Docker deployment
-nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
+To enable this redirection:
-# Built from source
-nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
-```
+1. Add the following line in `/etc/gitlab/gitlab.rb`, depending on your setup method:
-To activate the changes, run the following command:
+ ```ruby
+ # Docker deployment
+ nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
-```shell
-sudo gitlab-ctl reconfigure
-```
+ # Built from source
+ nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
+ ```
-Note that the redirection through GitLab must be configured
-when running [GitLab with TLS](https://docs.gitlab.com/omnibus/settings/ssl.html)
-due to PlantUML's use of the insecure HTTP protocol. Newer browsers such
-as [Google Chrome 86+](https://www.chromestatus.com/feature/4926989725073408)
-do not load insecure HTTP resources on a page served over HTTPS.
+1. To activate the changes, run the following command:
-### Security
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-PlantUML has features that allow fetching network resources.
+### Configure PlantUML security
+
+PlantUML has features that allow fetching network resources. If you self-host the
+PlantUML server, put network controls in place to isolate it.
```plaintext
@startuml
@@ -129,98 +201,29 @@ stop;
@enduml
```
-**If you self-host the PlantUML server, network controls should be put in place to isolate it.**
-
-## GitLab
+## Enable PlantUML integration
-You need to enable PlantUML integration from Settings under Admin Area. To do
-that, sign in with an Administrator account, and then do following:
+After configuring your local PlantUML server, you're ready to enable the PlantUML integration:
-1. In GitLab, go to **Admin Area > Settings > General**.
-1. Expand the **PlantUML** section.
+1. Sign in to GitLab as an [Administrator](../../user/permissions.md) user.
+1. In the top menu, click **{admin}** **Admin Area**.
+1. In the left sidebar, go to **Settings > General** and expand the **PlantUML** section.
1. Select the **Enable PlantUML** check box.
-1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`.
-
-NOTE:
-If you are using a PlantUML server running v1.2020.9 and
-above (for example, [plantuml.com](https://plantuml.com)), set the `PLANTUML_ENCODING`
-environment variable to enable the `deflate` compression. On Omnibus GitLab,
-this can be set in `/etc/gitlab.rb`:
-
-```ruby
-gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }
-```
-
-From GitLab 13.1 and later, PlantUML integration now
-[requires a header prefix in the URL](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160)
-to distinguish different encoding types.
-
-## Creating Diagrams
-
-With PlantUML integration enabled and configured, we can start adding diagrams to
-our AsciiDoc snippets, wikis, and repositories using delimited blocks:
-
-- **Markdown**
-
- ````markdown
- ```plantuml
- Bob -> Alice : hello
- Alice -> Bob : hi
- ```
- ````
-
-- **AsciiDoc**
-
- ```plaintext
- [plantuml, format="png", id="myDiagram", width="200px"]
- ----
- Bob->Alice : hello
- Alice -> Bob : hi
- ----
- ```
-
-- **reStructuredText**
-
- ```plaintext
- .. plantuml::
- :caption: Caption with **bold** and *italic*
-
- Bob -> Alice: hello
- Alice -> Bob: hi
- ```
+1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`,
+ and click **Save changes**.
- You can also use the `uml::` directive for compatibility with
- [`sphinxcontrib-plantuml`](https://pypi.org/project/sphinxcontrib-plantuml/),
- but GitLab only supports the `caption` option.
+Depending on your PlantUML and GitLab version numbers, you may also need to take
+these steps:
-The above blocks are converted to an HTML image tag with source pointing to the
-PlantUML instance. If the PlantUML server is correctly configured, this should
-render a nice diagram instead of the block:
+- For PlantUML servers running v1.2020.9 and above, such as [plantuml.com](https://plantuml.com),
+ you must set the `PLANTUML_ENCODING` environment variable to enable the `deflate`
+ compression. In Omnibus GitLab, you can set this value in `/etc/gitlab.rb` with
+ this command:
-```plantuml
-Bob -> Alice : hello
-Alice -> Bob : hi
-```
-
-Inside the block you can add any of the diagrams PlantUML supports, such as:
-
-- [Sequence](https://plantuml.com/sequence-diagram)
-- [Use Case](https://plantuml.com/use-case-diagram)
-- [Class](https://plantuml.com/class-diagram)
-- [Activity](https://plantuml.com/activity-diagram-legacy)
-- [Component](https://plantuml.com/component-diagram)
-- [State](https://plantuml.com/state-diagram),
-- [Object](https://plantuml.com/object-diagram)
-
-You do not need to use the PlantUML
-diagram delimiters `@startuml`/`@enduml`, as these are replaced by the AsciiDoc `plantuml` block.
-
-Some parameters can be added to the AsciiDoc block definition:
-
-- `format`: Can be either `png` or `svg`. Note that `svg` is not supported by
- all browsers so use with care. The default is `png`.
-- `id`: A CSS ID added to the diagram HTML tag.
-- `width`: Width attribute added to the image tag.
-- `height`: Height attribute added to the image tag.
+ ```ruby
+ gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }
+ ```
-Markdown does not support any parameters and always uses PNG format.
+- For GitLab versions 13.1 and later, PlantUML integration now
+ [requires a header prefix in the URL](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160)
+ to distinguish different encoding types.
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index 0f26eb83d17..644e2d905ae 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Web terminals
+# Web terminals **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7690) in GitLab 8.15.
diff --git a/doc/administration/invalidate_markdown_cache.md b/doc/administration/invalidate_markdown_cache.md
index 211316534ee..7a880c81843 100644
--- a/doc/administration/invalidate_markdown_cache.md
+++ b/doc/administration/invalidate_markdown_cache.md
@@ -1,6 +1,6 @@
---
-stage: Create
-group: Source Code
+stage: Plan
+group: Project Management
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
diff --git a/doc/administration/issue_closing_pattern.md b/doc/administration/issue_closing_pattern.md
index 32d367bb15e..3b9ec74e6ee 100644
--- a/doc/administration/issue_closing_pattern.md
+++ b/doc/administration/issue_closing_pattern.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
@@ -12,7 +12,7 @@ This is the administration documentation. There is a separate [user documentatio
on issue closing pattern.
When a commit or merge request resolves one or more issues, it is possible to
-automatically have these issues closed when the commit or merge request lands
+automatically close these issues when the commit or merge request lands
in the project's default branch.
## Change the issue closing pattern
@@ -35,7 +35,7 @@ Because Rubular doesn't understand `%{issue_ref}`, you can replace this by
expression of your liking:
```ruby
- gitlab_rails['gitlab_issue_closing_pattern'] = "\b((?:[Cc]los(?:e[sd]?|ing)|\b[Ff]ix(?:e[sd]|ing)?|\b[Rr]esolv(?:e[sd]?|ing)|\b[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?: *,? +and +| *,? *)?)|([A-Z][A-Z0-9_]+-\d+))+)"
+ gitlab_rails['gitlab_issue_closing_pattern'] = /\b((?:[Cc]los(?:e[sd]?|ing)|\b[Ff]ix(?:e[sd]|ing)?|\b[Rr]esolv(?:e[sd]?|ing)|\b[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?: *,? +and +| *,? *)?)|([A-Z][A-Z0-9_]+-\d+))+)/.source
```
1. [Reconfigure](restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab for the changes to take effect.
diff --git a/doc/administration/logs.md b/doc/administration/logs.md
index 17ecb324417..1950403ce35 100644
--- a/doc/administration/logs.md
+++ b/doc/administration/logs.md
@@ -14,10 +14,12 @@ Find more about them [in Audit Events documentation](audit_events.md).
System log files are typically plain text in a standard log file format.
This guide talks about how to read and use these system log files.
-Read more about how to
-[customize logging on Omnibus GitLab installations](https://docs.gitlab.com/omnibus/settings/logs.html)
+Read more about the log system and using the logs:
+
+- [Customize logging on Omnibus GitLab installations](https://docs.gitlab.com/omnibus/settings/logs.html)
including adjusting log retention, log forwarding,
switching logs from JSON to plain text logging, and more.
+- [How to parse and analyze JSON logs](troubleshooting/log_parsing.md).
## `production_json.log`
@@ -87,7 +89,7 @@ In addition, the log contains the originating IP address,
(`remote_ip`), the user's ID (`user_id`), and username (`username`).
Some endpoints such as `/search` may make requests to Elasticsearch if using
-[Advanced Search](../user/search/advanced_global_search.md). These
+[Advanced Search](../user/search/advanced_search.md). These
additionally log `elasticsearch_calls` and `elasticsearch_call_duration_s`,
which correspond to:
diff --git a/doc/administration/maintenance_mode/index.md b/doc/administration/maintenance_mode/index.md
index 61d321f2176..1cdbda05749 100644
--- a/doc/administration/maintenance_mode/index.md
+++ b/doc/administration/maintenance_mode/index.md
@@ -172,7 +172,7 @@ You can monitor queues and disable jobs in **Admin Area > Monitoring > Backgroun
[Incident management](../../operations/incident_management/index.md) functions will be limited. The creation of [alerts](../../operations/incident_management/alerts.md) and [incidents](../../operations/incident_management/incidents.md#incident-creation) will be paused entirely. Notifications and paging on alerts and incidents will therefore be disabled.
-### Feature flags
+### Feature flags
- [Development feature flags](../../development/feature_flags/index.md) cannot be turned on or off through the API, but can be toggled through the Rails console.
- [The feature flag service](../../operations/feature_flags.md) will respond to feature flag checks but feature flags cannot be toggled
diff --git a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md b/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
index 1262c4192f6..f389a2d2176 100644
--- a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
+++ b/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
@@ -32,7 +32,7 @@ metrics exposed by the [GitLab exporter](../prometheus/gitlab_metrics.md#metrics
## Creating the self monitoring project
-1. Navigate to **Admin Area > Settings > Metrics and profiling**, and expand the **Self monitoring** section.
+1. Go to **Admin Area > Settings > Metrics and profiling** and expand the **Self monitoring** section.
1. Toggle the **Create Project** button on.
1. Once your GitLab instance creates the project, GitLab displays a link to the project in the text above the **Create Project** toggle. You can also find it under **Projects > Your projects**.
@@ -42,7 +42,7 @@ WARNING:
Deleting the self monitoring project removes any changes made to the project. If
you create the project again, it's created in its default state.
-1. Navigate to **Admin Area > Settings > Metrics and profiling**, and expand the **Self monitoring** section.
+1. Go to **Admin Area > Settings > Metrics and profiling** and expand the **Self monitoring** section.
1. Toggle the **Create Project** button off.
1. In the confirmation dialog that opens, click **Delete project**.
It can take a few seconds for it to be deleted.
diff --git a/doc/administration/monitoring/index.md b/doc/administration/monitoring/index.md
index ac09acf2d2e..d2e5f40b171 100644
--- a/doc/administration/monitoring/index.md
+++ b/doc/administration/monitoring/index.md
@@ -11,9 +11,19 @@ Explore our features to monitor your GitLab instance:
- [GitLab self-monitoring](gitlab_self_monitoring_project/index.md): The
GitLab instance administration project helps to monitor the GitLab instance and
take action on alerts.
-- [Performance monitoring](performance/index.md): GitLab Performance Monitoring makes it possible to measure a wide variety of statistics of your instance.
-- [Prometheus](prometheus/index.md): Prometheus is a powerful time-series monitoring service, providing a flexible platform for monitoring GitLab and other software products.
-- [GitHub imports](github_imports.md): Monitor the health and progress of the GitHub importer with various Prometheus metrics.
-- [Monitoring uptime](../../user/admin_area/monitoring/health_check.md): Check the server status using the health check endpoint.
- - [IP whitelists](ip_whitelist.md): Configure GitLab for monitoring endpoints that provide health check information when probed.
-- [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status): Monitor your NGINX server status
+- [Performance monitoring](performance/index.md): GitLab Performance Monitoring
+ makes it possible to measure a wide variety of statistics of your instance.
+- [Prometheus](prometheus/index.md): Prometheus is a powerful time-series monitoring
+ service, providing a flexible platform for monitoring GitLab and other software
+ products.
+- [GitHub imports](github_imports.md): Monitor the health and progress of the GitHub
+ importer with various Prometheus metrics.
+- [Monitoring uptime](../../user/admin_area/monitoring/health_check.md): Check the
+ server status using the health check endpoint.
+ - [IP whitelists](ip_whitelist.md): Configure GitLab for monitoring endpoints that
+ provide health check information when probed.
+- [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status):
+ Monitor your NGINX server status.
+- [Auto Monitoring](../../topics/autodevops/stages.md#auto-monitoring): Automated
+ monitoring for your application’s server and response metrics, provided by
+ [Auto DevOps](../../topics/autodevops/index.md).
diff --git a/doc/administration/monitoring/performance/gitlab_configuration.md b/doc/administration/monitoring/performance/gitlab_configuration.md
index 03eba67292d..a0f170e93d9 100644
--- a/doc/administration/monitoring/performance/gitlab_configuration.md
+++ b/doc/administration/monitoring/performance/gitlab_configuration.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab Performance Monitoring is disabled by default. To enable it and change any of its
settings:
-1. Navigate to **Admin Area > Settings > Metrics and profiling**
+1. Go to **Admin Area > Settings > Metrics and profiling**
(`/admin/application_settings/metrics_and_profiling`).
1. Add the necessary configuration changes.
1. Restart all GitLab for the changes to take effect:
diff --git a/doc/administration/monitoring/performance/grafana_configuration.md b/doc/administration/monitoring/performance/grafana_configuration.md
index e6dda2ac87a..62d4f3c2625 100644
--- a/doc/administration/monitoring/performance/grafana_configuration.md
+++ b/doc/administration/monitoring/performance/grafana_configuration.md
@@ -62,7 +62,7 @@ repository.
After setting up Grafana, you can enable a link to access it easily from the
GitLab sidebar:
-1. Navigate to the **Admin Area > Settings > Metrics and profiling**.
+1. Go to the **Admin Area > Settings > Metrics and profiling**.
1. Expand **Metrics - Grafana**.
1. Check the **Enable access to Grafana** checkbox.
1. Configure the **Grafana URL**:
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index 0516cbc2f8b..39e5e4f6c00 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Performance Bar **(FREE SELF)**
+> The **Stats** field [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271551) in GitLab SaaS 13.9.
+
You can display the GitLab Performance Bar to see statistics for the performance
of a page. When activated, it looks as follows:
@@ -53,6 +55,8 @@ From left to right, it displays:
- **Request Selector**: a select box displayed on the right-hand side of the
Performance Bar which enables you to view these metrics for any requests made while
the current page was open. Only the first two requests per unique URL are captured.
+- **Stats** (optional): if the `GITLAB_PERFORMANCE_BAR_STATS_URL` environment variable is set,
+ this URL is displayed in the bar. In GitLab 13.9 and later, used only in GitLab SaaS.
## Request warnings
@@ -77,7 +81,7 @@ The GitLab Performance Bar is disabled by default. To enable it for a given grou
1. Sign in as a user with Administrator [permissions](../../../user/permissions.md).
1. In the menu bar, click **Admin Area**.
-1. Navigate to **Settings > Metrics and profiling**
+1. Go to **Settings > Metrics and profiling**
(`admin/application_settings/metrics_and_profiling`), and expand the section
**Profiling - Performance bar**.
1. Click **Enable access to the Performance Bar**.
diff --git a/doc/administration/monitoring/performance/request_profiling.md b/doc/administration/monitoring/performance/request_profiling.md
index f0ac8f991d3..ee035c6ad7a 100644
--- a/doc/administration/monitoring/performance/request_profiling.md
+++ b/doc/administration/monitoring/performance/request_profiling.md
@@ -10,7 +10,7 @@ To profile a request:
1. Sign in to GitLab as a user with Administrator or Maintainer [permissions](../../../user/permissions.md).
1. In the navigation bar, click **Admin area**.
-1. Navigate to **Monitoring > Requests Profiles**.
+1. Go to **Monitoring > Requests Profiles**.
1. In the **Requests Profiles** section, copy the token.
1. Pass the headers `X-Profile-Token: <token>` and `X-Profile-Mode: <mode>`(where
`<mode>` can be `execution` or `memory`) to the request you want to profile. When
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 38b26041901..3c6c984cbe3 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
To enable the GitLab Prometheus metrics:
1. Log into GitLab as a user with [administrator permissions](../../../user/permissions.md).
-1. Navigate to **Admin Area > Settings > Metrics and profiling**.
+1. Go to **Admin Area > Settings > Metrics and profiling**.
1. Find the **Metrics - Prometheus** section, and click **Enable Prometheus Metrics**.
1. [Restart GitLab](../../restart_gitlab.md#omnibus-gitlab-restart) for the changes to take effect.
@@ -33,95 +33,102 @@ For enabling and viewing metrics from Sidekiq nodes, see [Sidekiq metrics](#side
The following metrics are available:
-| Metric | Type | Since | Description | Labels |
-|:---------------------------------------------------------------|:----------|------:|:------------------------------------------------------------------------------------------------------|:--------------------------------------------------------|
-| `gitlab_banzai_cached_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output exists | `controller`, `action` |
-| `gitlab_banzai_cacheless_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output does not exist | `controller`, `action` |
-| `gitlab_cache_misses_total` | Counter | 10.2 | Cache read miss | `controller`, `action` |
-| `gitlab_cache_operation_duration_seconds` | Histogram | 10.2 | Cache access time | |
-| `gitlab_cache_operations_total` | Counter | 12.2 | Cache operations by controller or action | `controller`, `action`, `operation` |
-| `gitlab_ci_pipeline_creation_duration_seconds` | Histogram | 13.0 | Time in seconds it takes to create a CI/CD pipeline | |
-| `gitlab_ci_pipeline_size_builds` | Histogram | 13.1 | Total number of builds within a pipeline grouped by a pipeline source | `source` |
-| `job_waiter_started_total` | Counter | 12.9 | Number of batches of jobs started where a web request is waiting for the jobs to complete | `worker` |
-| `job_waiter_timeouts_total` | Counter | 12.9 | Number of batches of jobs that timed out where a web request is waiting for the jobs to complete | `worker` |
-| `gitlab_database_transaction_seconds` | Histogram | 12.1 | Time spent in database transactions, in seconds | |
-| `gitlab_method_call_duration_seconds` | Histogram | 10.2 | Method calls real duration | `controller`, `action`, `module`, `method` |
-| `gitlab_page_out_of_bounds` | Counter | 12.8 | Counter for the PageLimiter pagination limit being hit | `controller`, `action`, `bot` |
-| `gitlab_rails_queue_duration_seconds` | Histogram | 9.4 | Measures latency between GitLab Workhorse forwarding a request to Rails | |
-| `gitlab_sql_duration_seconds` | Histogram | 10.2 | SQL execution time, excluding `SCHEMA` operations and `BEGIN` / `COMMIT` | |
-| `gitlab_ruby_threads_max_expected_threads` | Gauge | 13.3 | Maximum number of threads expected to be running and performing application work | |
-| `gitlab_ruby_threads_running_threads` | Gauge | 13.3 | Number of running Ruby threads by name | |
-| `gitlab_transaction_cache_<key>_count_total` | Counter | 10.2 | Counter for total Rails cache calls (per key) | |
-| `gitlab_transaction_cache_<key>_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (per key) | |
-| `gitlab_transaction_cache_count_total` | Counter | 10.2 | Counter for total Rails cache calls (aggregate) | |
-| `gitlab_transaction_cache_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (aggregate) | |
-| `gitlab_transaction_cache_read_hit_count_total` | Counter | 10.2 | Counter for cache hits for Rails cache calls | `controller`, `action` |
-| `gitlab_transaction_cache_read_miss_count_total` | Counter | 10.2 | Counter for cache misses for Rails cache calls | `controller`, `action` |
-| `gitlab_transaction_duration_seconds` | Histogram | 10.2 | Duration for all transactions (`gitlab_transaction_*` metrics) | `controller`, `action` |
-| `gitlab_transaction_event_build_found_total` | Counter | 9.4 | Counter for build found for API /jobs/request | |
-| `gitlab_transaction_event_build_invalid_total` | Counter | 9.4 | Counter for build invalid due to concurrency conflict for API /jobs/request | |
-| `gitlab_transaction_event_build_not_found_cached_total` | Counter | 9.4 | Counter for cached response of build not found for API /jobs/request | |
-| `gitlab_transaction_event_build_not_found_total` | Counter | 9.4 | Counter for build not found for API /jobs/request | |
-| `gitlab_transaction_event_change_default_branch_total` | Counter | 9.4 | Counter when default branch is changed for any repository | |
-| `gitlab_transaction_event_create_repository_total` | Counter | 9.4 | Counter when any repository is created | |
-| `gitlab_transaction_event_etag_caching_cache_hit_total` | Counter | 9.4 | Counter for ETag cache hit. | `endpoint` |
-| `gitlab_transaction_event_etag_caching_header_missing_total` | Counter | 9.4 | Counter for ETag cache miss - header missing | `endpoint` |
-| `gitlab_transaction_event_etag_caching_key_not_found_total` | Counter | 9.4 | Counter for ETag cache miss - key not found | `endpoint` |
-| `gitlab_transaction_event_etag_caching_middleware_used_total` | Counter | 9.4 | Counter for ETag middleware accessed | `endpoint` |
-| `gitlab_transaction_event_etag_caching_resource_changed_total` | Counter | 9.4 | Counter for ETag cache miss - resource changed | `endpoint` |
-| `gitlab_transaction_event_fork_repository_total` | Counter | 9.4 | Counter for repository forks (RepositoryForkWorker). Only incremented when source repository exists | |
-| `gitlab_transaction_event_import_repository_total` | Counter | 9.4 | Counter for repository imports (RepositoryImportWorker) | |
-| `gitlab_transaction_event_patch_hard_limit_bytes_hit_total` | Counter | 13.9 | Counter for diff patch size limit hits | |
-| `gitlab_transaction_event_push_branch_total` | Counter | 9.4 | Counter for all branch pushes | |
-| `gitlab_transaction_event_push_commit_total` | Counter | 9.4 | Counter for commits | `branch` |
-| `gitlab_transaction_event_push_tag_total` | Counter | 9.4 | Counter for tag pushes | |
-| `gitlab_transaction_event_rails_exception_total` | Counter | 9.4 | Counter for number of rails exceptions | |
-| `gitlab_transaction_event_receive_email_total` | Counter | 9.4 | Counter for received emails | `handler` |
-| `gitlab_transaction_event_remote_mirrors_failed_total` | Counter | 10.8 | Counter for failed remote mirrors | |
-| `gitlab_transaction_event_remote_mirrors_finished_total` | Counter | 10.8 | Counter for finished remote mirrors | |
-| `gitlab_transaction_event_remote_mirrors_running_total` | Counter | 10.8 | Counter for running remote mirrors | |
-| `gitlab_transaction_event_remove_branch_total` | Counter | 9.4 | Counter when a branch is removed for any repository | |
-| `gitlab_transaction_event_remove_repository_total` | Counter | 9.4 | Counter when a repository is removed | |
-| `gitlab_transaction_event_remove_tag_total` | Counter | 9.4 | Counter when a tag is remove for any repository | |
-| `gitlab_transaction_event_sidekiq_exception_total` | Counter | 9.4 | Counter of Sidekiq exceptions | |
-| `gitlab_transaction_event_stuck_import_jobs_total` | Counter | 9.4 | Count of stuck import jobs | `projects_without_jid_count`, `projects_with_jid_count` |
-| `gitlab_transaction_event_update_build_total` | Counter | 9.4 | Counter for update build for API `/jobs/request/:id` | |
-| `gitlab_transaction_new_redis_connections_total` | Counter | 9.4 | Counter for new Redis connections | |
-| `gitlab_transaction_queue_duration_total` | Counter | 9.4 | Duration jobs were enqueued before processing | |
-| `gitlab_transaction_rails_queue_duration_total` | Counter | 9.4 | Measures latency between GitLab Workhorse forwarding a request to Rails | `controller`, `action` |
-| `gitlab_transaction_view_duration_total` | Counter | 9.4 | Duration for views | `controller`, `action`, `view` |
-| `gitlab_view_rendering_duration_seconds` | Histogram | 10.2 | Duration for views (histogram) | `controller`, `action`, `view` |
-| `http_requests_total` | Counter | 9.4 | Rack request count | `method`, `status` |
-| `http_request_duration_seconds` | Histogram | 9.4 | HTTP response time from rack middleware | `method` |
-| `gitlab_transaction_db_count_total` | Counter | 13.1 | Counter for total number of SQL calls | `controller`, `action` |
-| `gitlab_transaction_db_write_count_total` | Counter | 13.1 | Counter for total number of write SQL calls | `controller`, `action` |
-| `gitlab_transaction_db_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls | `controller`, `action` |
-| `http_elasticsearch_requests_duration_seconds` **(PREMIUM)** | Histogram | 13.1 | Elasticsearch requests duration during web transactions | `controller`, `action` |
-| `http_elasticsearch_requests_total` **(PREMIUM)** | Counter | 13.1 | Elasticsearch requests count during web transactions | `controller`, `action` |
-| `pipelines_created_total` | Counter | 9.4 | Counter of pipelines created | |
-| `rack_uncaught_errors_total` | Counter | 9.4 | Rack connections handling uncaught errors count | |
-| `user_session_logins_total` | Counter | 9.4 | Counter of how many users have logged in since GitLab was started or restarted | |
-| `upload_file_does_not_exist` | Counter | 10.7 | Number of times an upload record could not find its file. Made available in all tiers in GitLab 11.5. | |
-| `failed_login_captcha_total` | Gauge | 11.0 | Counter of failed CAPTCHA attempts during login | |
-| `successful_login_captcha_total` | Gauge | 11.0 | Counter of successful CAPTCHA attempts during login | |
-| `auto_devops_pipelines_completed_total` | Counter | 12.7 | Counter of completed Auto DevOps pipelines, labeled by status | |
-| `gitlab_metrics_dashboard_processing_time_ms` | Summary | 12.10 | Metrics dashboard processing time in milliseconds | service, stages |
-| `action_cable_active_connections` | Gauge | 13.4 | Number of ActionCable WS clients currently connected | `server_mode` |
-| `action_cable_pool_min_size` | Gauge | 13.4 | Minimum number of worker threads in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_max_size` | Gauge | 13.4 | Maximum number of worker threads in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_current_size` | Gauge | 13.4 | Current number of worker threads in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_largest_size` | Gauge | 13.4 | Largest number of worker threads observed so far in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_pending_tasks` | Gauge | 13.4 | Number of tasks waiting to be executed in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_tasks_total` | Gauge | 13.4 | Total number of tasks executed in ActionCable thread pool | `server_mode` |
-| `gitlab_issuable_fast_count_by_state_total` | Counter | 13.5 | Total number of row count operations on issue/merge request list pages | |
-| `gitlab_issuable_fast_count_by_state_failures_total` | Counter | 13.5 | Number of soft-failed row count operations on issue/merge request list pages | |
-| `gitlab_external_http_total` | Counter | 13.8 | Total number of HTTP calls to external systems | `controller`, `action` |
-| `gitlab_external_http_duration_seconds` | Counter | 13.8 | Duration in seconds spent on each HTTP call to external systems | |
-| `gitlab_external_http_exception_total` | Counter | 13.8 | Total number of exceptions raised when making external HTTP calls | |
-| `ci_report_parser_duration_seconds` | Histogram | 13.9 | Time to parse CI/CD report artifacts | `parser` |
-| `pipeline_graph_link_calculation_duration_seconds` | Histogram | 13.9 | Total time spent calculating links, in seconds | |
-| `pipeline_graph_links_total` | Histogram | 13.9 | Number of links per graph | |
-| `pipeline_graph_links_per_job_ratio` | Histogram | 13.9 | Ratio of links to job per graph | |
+| Metric | Type | Since | Description | Labels |
+| :--------------------------------------------------------------- | :---------- | ------: | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------- |
+| `gitlab_banzai_cached_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output exists | `controller`, `action` |
+| `gitlab_banzai_cacheless_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output does not exist | `controller`, `action` |
+| `gitlab_cache_misses_total` | Counter | 10.2 | Cache read miss | `controller`, `action` |
+| `gitlab_cache_operation_duration_seconds` | Histogram | 10.2 | Cache access time | |
+| `gitlab_cache_operations_total` | Counter | 12.2 | Cache operations by controller or action | `controller`, `action`, `operation` |
+| `gitlab_ci_pipeline_creation_duration_seconds` | Histogram | 13.0 | Time in seconds it takes to create a CI/CD pipeline | |
+| `gitlab_ci_pipeline_size_builds` | Histogram | 13.1 | Total number of builds within a pipeline grouped by a pipeline source | `source` |
+| `job_waiter_started_total` | Counter | 12.9 | Number of batches of jobs started where a web request is waiting for the jobs to complete | `worker` |
+| `job_waiter_timeouts_total` | Counter | 12.9 | Number of batches of jobs that timed out where a web request is waiting for the jobs to complete | `worker` |
+| `gitlab_database_transaction_seconds` | Histogram | 12.1 | Time spent in database transactions, in seconds | |
+| `gitlab_method_call_duration_seconds` | Histogram | 10.2 | Method calls real duration | `controller`, `action`, `module`, `method` |
+| `gitlab_page_out_of_bounds` | Counter | 12.8 | Counter for the PageLimiter pagination limit being hit | `controller`, `action`, `bot` |
+| `gitlab_rails_queue_duration_seconds` | Histogram | 9.4 | Measures latency between GitLab Workhorse forwarding a request to Rails | |
+| `gitlab_sql_duration_seconds` | Histogram | 10.2 | SQL execution time, excluding `SCHEMA` operations and `BEGIN` / `COMMIT` | |
+| `gitlab_sql_<role>_duration_seconds` | Histogram | 13.10 | SQL execution time, excluding `SCHEMA` operations and `BEGIN` / `COMMIT`, grouped by database roles (primary/replica) | |
+| `gitlab_ruby_threads_max_expected_threads` | Gauge | 13.3 | Maximum number of threads expected to be running and performing application work | |
+| `gitlab_ruby_threads_running_threads` | Gauge | 13.3 | Number of running Ruby threads by name | |
+| `gitlab_transaction_cache_<key>_count_total` | Counter | 10.2 | Counter for total Rails cache calls (per key) | |
+| `gitlab_transaction_cache_<key>_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (per key) | |
+| `gitlab_transaction_cache_count_total` | Counter | 10.2 | Counter for total Rails cache calls (aggregate) | |
+| `gitlab_transaction_cache_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (aggregate) | |
+| `gitlab_transaction_cache_read_hit_count_total` | Counter | 10.2 | Counter for cache hits for Rails cache calls | `controller`, `action` |
+| `gitlab_transaction_cache_read_miss_count_total` | Counter | 10.2 | Counter for cache misses for Rails cache calls | `controller`, `action` |
+| `gitlab_transaction_duration_seconds` | Histogram | 10.2 | Duration for all transactions (`gitlab_transaction_*` metrics) | `controller`, `action` |
+| `gitlab_transaction_event_build_found_total` | Counter | 9.4 | Counter for build found for API /jobs/request | |
+| `gitlab_transaction_event_build_invalid_total` | Counter | 9.4 | Counter for build invalid due to concurrency conflict for API /jobs/request | |
+| `gitlab_transaction_event_build_not_found_cached_total` | Counter | 9.4 | Counter for cached response of build not found for API /jobs/request | |
+| `gitlab_transaction_event_build_not_found_total` | Counter | 9.4 | Counter for build not found for API /jobs/request | |
+| `gitlab_transaction_event_change_default_branch_total` | Counter | 9.4 | Counter when default branch is changed for any repository | |
+| `gitlab_transaction_event_create_repository_total` | Counter | 9.4 | Counter when any repository is created | |
+| `gitlab_transaction_event_etag_caching_cache_hit_total` | Counter | 9.4 | Counter for ETag cache hit. | `endpoint` |
+| `gitlab_transaction_event_etag_caching_header_missing_total` | Counter | 9.4 | Counter for ETag cache miss - header missing | `endpoint` |
+| `gitlab_transaction_event_etag_caching_key_not_found_total` | Counter | 9.4 | Counter for ETag cache miss - key not found | `endpoint` |
+| `gitlab_transaction_event_etag_caching_middleware_used_total` | Counter | 9.4 | Counter for ETag middleware accessed | `endpoint` |
+| `gitlab_transaction_event_etag_caching_resource_changed_total` | Counter | 9.4 | Counter for ETag cache miss - resource changed | `endpoint` |
+| `gitlab_transaction_event_fork_repository_total` | Counter | 9.4 | Counter for repository forks (RepositoryForkWorker). Only incremented when source repository exists | |
+| `gitlab_transaction_event_import_repository_total` | Counter | 9.4 | Counter for repository imports (RepositoryImportWorker) | |
+| `gitlab_transaction_event_patch_hard_limit_bytes_hit_total` | Counter | 13.9 | Counter for diff patch size limit hits | |
+| `gitlab_transaction_event_push_branch_total` | Counter | 9.4 | Counter for all branch pushes | |
+| `gitlab_transaction_event_push_commit_total` | Counter | 9.4 | Counter for commits | `branch` |
+| `gitlab_transaction_event_push_tag_total` | Counter | 9.4 | Counter for tag pushes | |
+| `gitlab_transaction_event_rails_exception_total` | Counter | 9.4 | Counter for number of rails exceptions | |
+| `gitlab_transaction_event_receive_email_total` | Counter | 9.4 | Counter for received emails | `handler` |
+| `gitlab_transaction_event_remote_mirrors_failed_total` | Counter | 10.8 | Counter for failed remote mirrors | |
+| `gitlab_transaction_event_remote_mirrors_finished_total` | Counter | 10.8 | Counter for finished remote mirrors | |
+| `gitlab_transaction_event_remote_mirrors_running_total` | Counter | 10.8 | Counter for running remote mirrors | |
+| `gitlab_transaction_event_remove_branch_total` | Counter | 9.4 | Counter when a branch is removed for any repository | |
+| `gitlab_transaction_event_remove_repository_total` | Counter | 9.4 | Counter when a repository is removed | |
+| `gitlab_transaction_event_remove_tag_total` | Counter | 9.4 | Counter when a tag is remove for any repository | |
+| `gitlab_transaction_event_sidekiq_exception_total` | Counter | 9.4 | Counter of Sidekiq exceptions | |
+| `gitlab_transaction_event_stuck_import_jobs_total` | Counter | 9.4 | Count of stuck import jobs | `projects_without_jid_count`, `projects_with_jid_count` |
+| `gitlab_transaction_event_update_build_total` | Counter | 9.4 | Counter for update build for API `/jobs/request/:id` | |
+| `gitlab_transaction_new_redis_connections_total` | Counter | 9.4 | Counter for new Redis connections | |
+| `gitlab_transaction_queue_duration_total` | Counter | 9.4 | Duration jobs were enqueued before processing | |
+| `gitlab_transaction_rails_queue_duration_total` | Counter | 9.4 | Measures latency between GitLab Workhorse forwarding a request to Rails | `controller`, `action` |
+| `gitlab_transaction_view_duration_total` | Counter | 9.4 | Duration for views | `controller`, `action`, `view` |
+| `gitlab_view_rendering_duration_seconds` | Histogram | 10.2 | Duration for views (histogram) | `controller`, `action`, `view` |
+| `http_requests_total` | Counter | 9.4 | Rack request count | `method`, `status` |
+| `http_request_duration_seconds` | Histogram | 9.4 | HTTP response time from rack middleware | `method` |
+| `gitlab_transaction_db_count_total` | Counter | 13.1 | Counter for total number of SQL calls | `controller`, `action` |
+| `gitlab_transaction_db_<role>_count_total` | Counter | 13.10 | Counter for total number of SQL calls, grouped by database roles (primary/replica) | `controller`, `action` |
+| `gitlab_transaction_db_write_count_total` | Counter | 13.1 | Counter for total number of write SQL calls | `controller`, `action` |
+| `gitlab_transaction_db_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls | `controller`, `action` |
+| `gitlab_transaction_db_<role>_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls, grouped by database roles (primary/replica) | `controller`, `action` |
+| `http_elasticsearch_requests_duration_seconds` **(PREMIUM)** | Histogram | 13.1 | Elasticsearch requests duration during web transactions | `controller`, `action` |
+| `http_elasticsearch_requests_total` **(PREMIUM)** | Counter | 13.1 | Elasticsearch requests count during web transactions | `controller`, `action` |
+| `pipelines_created_total` | Counter | 9.4 | Counter of pipelines created | |
+| `rack_uncaught_errors_total` | Counter | 9.4 | Rack connections handling uncaught errors count | |
+| `user_session_logins_total` | Counter | 9.4 | Counter of how many users have logged in since GitLab was started or restarted | |
+| `upload_file_does_not_exist` | Counter | 10.7 | Number of times an upload record could not find its file. Made available in all tiers in GitLab 11.5. | |
+| `failed_login_captcha_total` | Gauge | 11.0 | Counter of failed CAPTCHA attempts during login | |
+| `successful_login_captcha_total` | Gauge | 11.0 | Counter of successful CAPTCHA attempts during login | |
+| `auto_devops_pipelines_completed_total` | Counter | 12.7 | Counter of completed Auto DevOps pipelines, labeled by status | |
+| `gitlab_metrics_dashboard_processing_time_ms` | Summary | 12.10 | Metrics dashboard processing time in milliseconds | service, stages |
+| `action_cable_active_connections` | Gauge | 13.4 | Number of ActionCable WS clients currently connected | `server_mode` |
+| `action_cable_broadcasts_total` | Counter | 13.10 | The number of ActionCable broadcasts emitted | `server_mode` |
+| `action_cable_pool_min_size` | Gauge | 13.4 | Minimum number of worker threads in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_max_size` | Gauge | 13.4 | Maximum number of worker threads in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_current_size` | Gauge | 13.4 | Current number of worker threads in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_largest_size` | Gauge | 13.4 | Largest number of worker threads observed so far in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_pending_tasks` | Gauge | 13.4 | Number of tasks waiting to be executed in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_tasks_total` | Gauge | 13.4 | Total number of tasks executed in ActionCable thread pool | `server_mode` |
+| `action_cable_single_client_transmissions_total` | Counter | 13.10 | The number of ActionCable messages transmitted to any client in any channel | `server_mode` |
+| `action_cable_subscription_confirmations_total` | Counter | 13.10 | The number of ActionCable subscriptions from clients confirmed | `server_mode` |
+| `action_cable_subscription_rejections_total` | Counter | 13.10 | The number of ActionCable subscriptions from clients rejected | `server_mode` |
+| `gitlab_issuable_fast_count_by_state_total` | Counter | 13.5 | Total number of row count operations on issue/merge request list pages | |
+| `gitlab_issuable_fast_count_by_state_failures_total` | Counter | 13.5 | Number of soft-failed row count operations on issue/merge request list pages | |
+| `gitlab_external_http_total` | Counter | 13.8 | Total number of HTTP calls to external systems | `controller`, `action` |
+| `gitlab_external_http_duration_seconds` | Counter | 13.8 | Duration in seconds spent on each HTTP call to external systems | |
+| `gitlab_external_http_exception_total` | Counter | 13.8 | Total number of exceptions raised when making external HTTP calls | |
+| `ci_report_parser_duration_seconds` | Histogram | 13.9 | Time to parse CI/CD report artifacts | `parser` |
+| `pipeline_graph_link_calculation_duration_seconds` | Histogram | 13.9 | Total time spent calculating links, in seconds | |
+| `pipeline_graph_links_total` | Histogram | 13.9 | Number of links per graph | |
+| `pipeline_graph_links_per_job_ratio` | Histogram | 13.9 | Ratio of links to job per graph | |
## Metrics controlled by a feature flag
@@ -214,11 +221,18 @@ configuration option in `gitlab.yml`. These metrics are served from the
| `geo_snippet_repositories_synced` | Gauge | 13.4 | Number of syncable snippets synced on secondary | `url` |
| `geo_snippet_repositories_failed` | Gauge | 13.4 | Number of syncable snippets failed on secondary | `url` |
| `geo_snippet_repositories_registry` | Gauge | 13.4 | Number of syncable snippets in the registry | `url` |
+| `geo_group_wiki_repositories` | Gauge | 13.10 | Number of group wikis on primary | `url` |
+| `geo_group_wiki_repositories_checksummed` | Gauge | 13.10 | Number of group wikis checksummed on primary | `url` |
+| `geo_group_wiki_repositories_checksum_failed` | Gauge | 13.10 | Number of group wikis failed to calculate the checksum on primary | `url` |
+| `geo_group_wiki_repositories_synced` | Gauge | 13.10 | Number of syncable group wikis synced on secondary | `url` |
+| `geo_group_wiki_repositories_failed` | Gauge | 13.10 | Number of syncable group wikis failed on secondary | `url` |
+| `geo_group_wiki_repositories_registry` | Gauge | 13.10 | Number of syncable group wikis in the registry | `url` |
| `limited_capacity_worker_running_jobs` | Gauge | 13.5 | Number of running jobs | `worker` |
| `limited_capacity_worker_max_running_jobs` | Gauge | 13.5 | Maximum number of running jobs | `worker` |
| `limited_capacity_worker_remaining_work_count` | Gauge | 13.5 | Number of jobs waiting to be enqueued | `worker` |
| `destroyed_job_artifacts_count_total` | Counter | 13.6 | Number of destroyed expired job artifacts | |
| `destroyed_pipeline_artifacts_count_total` | Counter | 13.8 | Number of destroyed expired pipeline artifacts | |
+| `gitlab_optimistic_locking_retries` | Histogram | 13.10 | Number of retry attempts to execute optimistic retry lock | |
## Database load balancing metrics **(PREMIUM SELF)**
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index a7009b702ed..59b18f7a74a 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -365,21 +365,26 @@ You may be able to avoid timeouts and data loss using `actimeo=0` and `lookupcac
we expect the performance reduction will still be significant. As noted above, we strongly recommend upgrading to
[Gitaly Cluster](gitaly/praefect.md) as soon as possible.
-### Avoid using AWS's Elastic File System (EFS)
+### Avoid using cloud-based file systems
-GitLab strongly recommends against using AWS Elastic File System (EFS).
-Our support team will not be able to assist on performance issues related to
-file system access.
+GitLab strongly recommends against using cloud-based file systems such as:
-Customers and users have reported that AWS EFS does not perform well for the GitLab
-use-case. Workloads where many small files are written in a serialized manner, like `git`,
-are not well-suited for EFS. EBS with an NFS server on top will perform much better.
+- AWS Elastic File System (EFS).
+- Google Cloud Filestore.
+- Azure Files.
-If you do choose to use EFS, avoid storing GitLab log files (e.g. those in `/var/log/gitlab`)
+Our support team cannot assist with performance issues related to cloud-based file system access.
+
+Customers and users have reported that these file systems don't perform well for
+the file system access GitLab requires. Workloads where many small files are written in
+a serialized manner, like `git`, are not well suited to cloud-based file systems.
+
+If you do choose to use these, avoid storing GitLab log files (for example, those in `/var/log/gitlab`)
there because this will also affect performance. We recommend that the log files be
stored on a local volume.
-For more details on another person's experience with EFS, see this [Commit Brooklyn 2019 video](https://youtu.be/K6OS8WodRBQ?t=313).
+For more details on the experience of using a cloud-based file systems with GitLab,
+see this [Commit Brooklyn 2019 video](https://youtu.be/K6OS8WodRBQ?t=313).
### Avoid using CephFS and GlusterFS
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 3b43f53dc82..cbef752773b 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -405,8 +405,8 @@ Rackspace Cloud is supported only with the storage-specific form.
| `provider` | The provider name | `Rackspace` |
| `rackspace_username` | The username of the Rackspace account with access to the container | `joe.smith` |
| `rackspace_api_key` | The API key of the Rackspace account with access to the container | `ABC123DEF456ABC123DEF456ABC123DE` |
-| `rackspace_region` | The Rackspace storage region to use, a three letter code from the [list of service access endpoints](https://developer.rackspace.com/docs/cloud-files/v1/general-api-info/service-access/) | `iad` |
-| `rackspace_temp_url_key` | The private key you have set in the Rackspace API for [temporary URLs](https://developer.rackspace.com/docs/cloud-files/v1/use-cases/public-access-to-your-cloud-files-account/#tempurl). | `ABC123DEF456ABC123DEF456ABC123DE` |
+| `rackspace_region` | The Rackspace storage region to use, a three letter code from the [list of service access endpoints](https://docs.rackspace.com/docs/cloud-files/v1/general-api-info/service-access/) | `iad` |
+| `rackspace_temp_url_key` | The private key you have set in the Rackspace API for [temporary URLs](https://docs.rackspace.com/docs/cloud-files/v1/use-cases/public-access-to-your-cloud-files-account/#tempurl). | `ABC123DEF456ABC123DEF456ABC123DE` |
Regardless of whether the container has public access enabled or disabled, Fog
uses the TempURL method to grant access to LFS objects. If you see error
@@ -572,13 +572,15 @@ See the following additional guides:
## Warnings, limitations, and known issues
-### Separate buckets required when using Helm
+### Use separate buckets
-Generally, using the same bucket for your Object Storage is fine to do
-for convenience.
+Using separate buckets for each data type is the recommended approach for GitLab.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
-However, if you're using or planning to use Helm, separate buckets will
-be required as there is a [known limitation with restorations of Helm chart backups](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
+Helm-based installs require separate buckets to
+[handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
### S3 API compatibility issues
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index 330bd9a43da..ec5bf9d6379 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -6,9 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Fast lookup of authorized SSH keys in the database
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1631) in [GitLab Starter](https://about.gitlab.com/pricing/) 9.3.
-> - [Available in](https://gitlab.com/gitlab-org/gitlab/-/issues/3953) GitLab Community Edition 10.4.
-
NOTE:
This document describes a drop-in replacement for the
`authorized_keys` file. For normal (non-deploy key) users, consider using
@@ -219,8 +216,6 @@ the database. The following instructions can be used to build OpenSSH 7.5:
## SELinux support and limitations
-> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/2855) in GitLab 10.5.
-
GitLab supports `authorized_keys` database lookups with [SELinux](https://en.wikipedia.org/wiki/Security-Enhanced_Linux).
Because the SELinux policy is static, GitLab doesn't support the ability to change
diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md
index da3b3dbbc15..fc39d8e2074 100644
--- a/doc/administration/operations/moving_repositories.md
+++ b/doc/administration/operations/moving_repositories.md
@@ -20,7 +20,7 @@ The GitLab API is the recommended way to move Git repositories:
For more information, see:
-- [Configuring additional storage for Gitaly](../gitaly/index.md#network-architecture). This
+- [Configuring additional storage for Gitaly](../gitaly/configure_gitaly.md#network-architecture). This
example configures additional storage called `storage1` and `storage2`.
- [The API documentation](../../api/project_repository_storage_moves.md) details the endpoints for
querying and scheduling project repository moves.
diff --git a/doc/administration/operations/rails_console.md b/doc/administration/operations/rails_console.md
index b40560bf6e5..1fe1ea96bff 100644
--- a/doc/administration/operations/rails_console.md
+++ b/doc/administration/operations/rails_console.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# The Rails Console
+# Rails console **(FREE SELF)**
The [Rails console](https://guides.rubyonrails.org/command_line.html#rails-console).
provides a way to interact with your GitLab instance from the command line.
@@ -148,3 +148,23 @@ Traceback (most recent call last):
[traceback removed]
/opt/gitlab/..../runner_command.rb:42:in `load': cannot load such file -- /tmp/helloworld.rb (LoadError)
```
+
+In case you encouter a similar error to this:
+
+```plaintext
+[root ~]# sudo gitlab-rails runner helloworld.rb
+Please specify a valid ruby command or the path of a script to run.
+Run 'rails runner -h' for help.
+
+undefined local variable or method `helloworld' for main:Object
+```
+
+You can either move the file to the `/tmp` directory or create a new directory onwed by the user `git` and save the script in that directory as illustrated below:
+
+```shell
+sudo mkdir /scripts
+sudo mv /script_path/helloworld.rb /scripts
+sudo chown -R git:git /scripts
+sudo chmod 700 /scripts
+sudo gitlab-rails runner /scripts/helloworld.rb
+```
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 63bb969afce..2f6b6a2f629 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -71,7 +71,7 @@ Where:
| `enabled` | `true` or `false`. Enables the Registry in GitLab. By default this is `false`. |
| `host` | The host URL under which the Registry runs and users can use. |
| `port` | The port the external Registry domain listens on. |
-| `api_url` | The internal API URL under which the Registry is exposed. It defaults to `http://localhost:5000`. |
+| `api_url` | The internal API URL under which the Registry is exposed. It defaults to `http://localhost:5000`. Do not change this unless you are setting up an [external Docker registry](#use-an-external-container-registry-with-gitlab-as-an-auth-endpoint). |
| `key` | The private key location that is a pair of Registry's `rootcertbundle`. Read the [token auth configuration documentation](https://docs.docker.com/registry/configuration/#token). |
| `path` | This should be the same directory like specified in Registry's `rootdirectory`. Read the [storage configuration documentation](https://docs.docker.com/registry/configuration/#storage). This path needs to be readable by the GitLab user, the web-server user and the Registry user. Read more in [#configure-storage-for-the-container-registry](#configure-storage-for-the-container-registry). |
| `issuer` | This should be the same value as configured in Registry's `issuer`. Read the [token auth configuration documentation](https://docs.docker.com/registry/configuration/#token). |
@@ -630,18 +630,18 @@ You can use GitLab as an auth endpoint with an external container registry.
```ruby
gitlab_rails['registry_enabled'] = true
- gitlab_rails['registry_api_url'] = "http://localhost:5000"
+ gitlab_rails['registry_api_url'] = "https://<external_registry_host>:5000"
gitlab_rails['registry_issuer'] = "gitlab-issuer"
```
- `gitlab_rails['registry_enabled'] = true` is needed to enable GitLab
- Container Registry features and authentication endpoint. The GitLab bundled
- Container Registry service does not start, even with this enabled.
-
- `gitlab_rails['registry_api_url'] = "http://localhost:5000"` can
- carry a different hostname and port depending on where the external registry
- is hosted. It must also specify `https` if the external registry is
- configured to use TLS.
+ - `gitlab_rails['registry_enabled'] = true` is needed to enable GitLab
+ Container Registry features and authentication endpoint. The GitLab bundled
+ Container Registry service does not start, even with this enabled.
+ - `gitlab_rails['registry_api_url'] = "http://<external_registry_host>:5000"`
+ must be changed to match the host where Registry is installed.
+ It must also specify `https` if the external registry is
+ configured to use TLS. Read more on the
+ [Docker registry documentation](https://docs.docker.com/registry/deploying/).
1. A certificate-key pair is required for GitLab and the external container
registry to communicate securely. You need to create a certificate-key
@@ -688,12 +688,14 @@ You can use GitLab as an auth endpoint with an external container registry.
enabled: true
host: "registry.gitlab.example.com"
port: "5005"
- api_url: "http://localhost:5000"
- path: /var/opt/gitlab/gitlab-rails/shared/registry
- key: /var/opt/gitlab/gitlab-rails/certificate.key
+ api_url: "https://<external_registry_host>:5000"
+ path: /var/lib/registry
+ key: /path/to/keyfile
issuer: gitlab-issuer
```
+ [Read more](#enable-the-container-registry) about what these parameters mean.
+
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
## Configure Container Registry notifications
@@ -900,12 +902,12 @@ not directly accessible via `tag`:
sudo gitlab-ctl registry-garbage-collect -m
```
-Without the `-m` flag, the Container Registry only removes layers that are not referenced by any manifest, tagged or not.
-
Since this is a way more destructive operation, this behavior is disabled by default.
You are likely expecting this way of operation, but before doing that, ensure
that you have backed up all registry data.
+When the command is used without the `-m` flag, the Container Registry only removes layers that are not referenced by any manifest, tagged or not.
+
### Performing garbage collection without downtime
> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/764) in GitLab 8.8.
@@ -1063,6 +1065,70 @@ encounter this error.
Administrators can increase the token duration in **Admin area > Settings >
CI/CD > Container Registry > Authorization token duration (minutes)**.
+### Docker login attempt fails with: 'token signed by untrusted key'
+
+[Registry relies on GitLab to validate credentials](https://docs.gitlab.com/omnibus/architecture/registry/).
+If the registry fails to authenticate valid login attempts, you get the following error message:
+
+```shell
+# docker login gitlab.company.com:4567
+Username: user
+Password:
+Error response from daemon: login attempt to https://gitlab.company.com:4567/v2/ failed with status: 401 Unauthorized
+```
+
+And more specifically, this appears in the `/var/log/gitlab/registry/current` log file:
+
+```plaintext
+level=info msg="token signed by untrusted key with ID: "TOKE:NL6Q:7PW6:EXAM:PLET:OKEN:BG27:RCIB:D2S3:EXAM:PLET:OKEN""
+level=warning msg="error authorizing context: invalid token" go.version=go1.12.7 http.request.host="gitlab.company.com:4567" http.request.id=74613829-2655-4f96-8991-1c9fe33869b8 http.request.method=GET http.request.remoteaddr=10.72.11.20 http.request.uri="/v2/" http.request.useragent="docker/19.03.2 go/go1.12.8 git-commit/6a30dfc kernel/3.10.0-693.2.2.el7.x86_64 os/linux arch/amd64 UpstreamClient(Docker-Client/19.03.2 \(linux\))"
+```
+
+GitLab uses the contents of the certificate key pair's two sides to encrypt the authentication token
+for the Registry. This message means that those contents do not align.
+
+Check which files are in use:
+
+- `grep -A6 'auth:' /var/opt/gitlab/registry/config.yml`
+
+ ```yaml
+ ## Container Registry Certificate
+ auth:
+ token:
+ realm: https://gitlab.my.net/jwt/auth
+ service: container_registry
+ issuer: omnibus-gitlab-issuer
+ --> rootcertbundle: /var/opt/gitlab/registry/gitlab-registry.crt
+ autoredirect: false
+ ```
+
+- `grep -A9 'Container Registry' /var/opt/gitlab/gitlab-rails/etc/gitlab.yml`
+
+ ```yaml
+ ## Container Registry Key
+ registry:
+ enabled: true
+ host: gitlab.company.com
+ port: 4567
+ api_url: http://127.0.0.1:5000 # internal address to the registry, will be used by GitLab to directly communicate with API
+ path: /var/opt/gitlab/gitlab-rails/shared/registry
+ --> key: /var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key
+ issuer: omnibus-gitlab-issuer
+ notification_secret:
+ ```
+
+The output of these `openssl` commands should match, proving that the cert-key pair is a match:
+
+```shell
+openssl x509 -noout -modulus -in /var/opt/gitlab/registry/gitlab-registry.crt | openssl sha256
+openssl rsa -noout -modulus -in /var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key | openssl sha256
+```
+
+If the two pieces of the certificate do not align, remove the files and run `gitlab-ctl reconfigure`
+to regenerate the pair. If you have overridden the automatically generated self-signed pair with
+your own certificates and have made sure that their contents align, you can delete the 'registry'
+section in your `/etc/gitlab/gitlab-secrets.json` and run `gitlab-ctl reconfigure`.
+
### AWS S3 with the GitLab registry error when pushing large images
When using AWS S3 with the GitLab registry, an error may occur when pushing
@@ -1144,7 +1210,7 @@ project or branch name. Special characters can include:
- Trailing hyphen/dash
- Double hyphen/dash
-To get around this, you can [change the group path](../../user/group/index.md#changing-a-groups-path),
+To get around this, you can [change the group path](../../user/group/index.md#change-a-groups-path),
[change the project path](../../user/project/settings/index.md#renaming-a-repository) or change the
branch name. Another option is to create a [push rule](../../push_rules/push_rules.md) to prevent
this at the instance level.
diff --git a/doc/administration/packages/dependency_proxy.md b/doc/administration/packages/dependency_proxy.md
index 16cfdc8c784..720734bf344 100644
--- a/doc/administration/packages/dependency_proxy.md
+++ b/doc/administration/packages/dependency_proxy.md
@@ -47,6 +47,10 @@ To enable the dependency proxy feature:
Since Puma is already the default web server for installations from source as of GitLab 12.9,
no further changes are needed.
+**Multi-node GitLab installations**
+
+Follow the steps for **Omnibus GitLab installation** for each Web and Sidekiq nodes.
+
## Changing the storage path
By default, the dependency proxy files are stored locally, but you can change the default
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index b1d2a82e31a..012afd6a419 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -43,14 +43,14 @@ guides you through the process.
| CocoaPods | [#36890](https://gitlab.com/gitlab-org/gitlab/-/issues/36890) |
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
-| Debian | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44746) |
+| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
| RPM | [#5932](https://gitlab.com/gitlab-org/gitlab/-/issues/5932) |
| RubyGems | [#803](https://gitlab.com/gitlab-org/gitlab/-/issues/803) |
| SBT | [#36898](https://gitlab.com/gitlab-org/gitlab/-/issues/36898) |
-| Terraform | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
+| Terraform | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
| Vagrant | [#36899](https://gitlab.com/gitlab-org/gitlab/-/issues/36899) |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 655e35c3e60..058445f00be 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -178,15 +178,21 @@ outside world.
pages_external_url 'https://example.io'
pages_nginx['redirect_http_to_https'] = true
+ ```
+
+1. If you haven’t named your certificate and key `example.io.crt` and `example.io.key`
+then you'll need to also add the full paths as shown below:
+
+ ```ruby
pages_nginx['ssl_certificate'] = "/etc/gitlab/ssl/pages-nginx.crt"
pages_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/pages-nginx.key"
```
- where `pages-nginx.crt` and `pages-nginx.key` are the SSL cert and key,
- respectively.
-
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+WARNING:
+Multiple wildcards for one instance is not supported. Only one wildcard per instance can be assigned.
+
### Additional configuration for Docker container
The GitLab Pages daemon doesn't have permissions to bind mounts when it runs
@@ -214,56 +220,63 @@ and take effect after you [reconfigure GitLab](../restart_gitlab.md#omnibus-gitl
Most of these settings don't need to be configured manually unless you need more granular
control over how the Pages daemon runs and serves content in your environment.
-| Setting | Description |
-| ------- | ----------- |
-| `pages_external_url` | The URL where GitLab Pages is accessible, including protocol (HTTP / HTTPS). If `https://` is used, additional configuration is required. See [Wildcard domains with TLS support](#wildcard-domains-with-tls-support) and [Custom domains with TLS support](#custom-domains-with-tls-support) for details.
-| `gitlab_pages[]` | |
-| `access_control` | Whether to enable [access control](index.md#access-control).
-| `api_secret_key` | Full path to file with secret key used to authenticate with the GitLab API. Auto-generated when left unset.
-| `artifacts_server` | Enable viewing [artifacts](../job_artifacts.md) in GitLab Pages.
-| `artifacts_server_timeout` | Timeout (in seconds) for a proxied request to the artifacts server.
-| `artifacts_server_url` | API URL to proxy artifact requests to. Defaults to GitLab `external URL` + `/api/v4`, for example `https://gitlab.com/api/v4`. When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server), this URL must point to the main GitLab server's API.
-| `auth_redirect_uri` | Callback URL for authenticating with GitLab. Defaults to project's subdomain of `pages_external_url` + `/auth`.
-| `auth_secret` | Secret key for signing authentication requests. Leave blank to pull automatically from GitLab during OAuth registration.
-| `dir` | Working directory for configuration and secrets files.
-| `enable` | Enable or disable GitLab Pages on the current system.
-| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`.
-| `external_https` | Configure Pages to bind to one or more secondary IP addresses, serving HTTPS requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_https`.
-| `gitlab_client_http_timeout` | GitLab API HTTP client connection timeout in seconds (default: 10s).
-| `gitlab_client_jwt_expiry` | JWT Token expiry time in seconds (default: 30s).
-| `domain_config_source` | Domain configuration source (default: `auto`)
-| `gitlab_id` | The OAuth application public ID. Leave blank to automatically fill when Pages authenticates with GitLab.
-| `gitlab_secret` | The OAuth application secret. Leave blank to automatically fill when Pages authenticates with GitLab.
-| `auth_scope` | The OAuth application scope to use for authentication. Must match GitLab Pages OAuth application settings. Leave blank to use `api` scope by default.
-| `gitlab_server` | Server to use for authentication when access control is enabled; defaults to GitLab `external_url`.
-| `headers` | Specify any additional http headers that should be sent to the client with each response.
-| `inplace_chroot` | On [systems that don't support bind-mounts](index.md#additional-configuration-for-docker-container), this instructs GitLab Pages to `chroot` into its `pages_path` directory. Some caveats exist when using in-place `chroot`; refer to the GitLab Pages [README](https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md#caveats) for more information.
-| `insecure_ciphers` | Use default list of cipher suites, may contain insecure ones like 3DES and RC4.
-| `internal_gitlab_server` | Internal GitLab server address used exclusively for API requests. Useful if you want to send that traffic over an internal load balancer. Defaults to GitLab `external_url`.
-| `listen_proxy` | The addresses to listen on for reverse-proxy requests. Pages binds to these addresses' network sockets and receives incoming requests from them. Sets the value of `proxy_pass` in `$nginx-dir/conf/gitlab-pages.conf`.
-| `log_directory` | Absolute path to a log directory.
-| `log_format` | The log output format: `text` or `json`.
-| `log_verbose` | Verbose logging, true/false.
-| `max_connections` | Limit on the number of concurrent connections to the HTTP, HTTPS or proxy listeners.
-| `metrics_address` | The address to listen on for metrics requests.
-| `redirect_http` | Redirect pages from HTTP to HTTPS, true/false.
-| `sentry_dsn` | The address for sending Sentry crash reporting to.
-| `sentry_enabled` | Enable reporting and logging with Sentry, true/false.
-| `sentry_environment` | The environment for Sentry crash reporting.
-| `status_uri` | The URL path for a status page, for example, `/@status`.
-| `tls_max_version` | Specifies the maximum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2").
-| `tls_min_version` | Specifies the minimum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2").
-| `use_http2` | Enable HTTP2 support.
-| `gitlab_pages['env'][]` | |
-| `http_proxy` | Configure GitLab Pages to use an HTTP Proxy to mediate traffic between Pages and GitLab. Sets an environment variable `http_proxy` when starting Pages daemon.
-| `gitlab_rails[]` | |
-| `pages_domain_verification_cron_worker` | Schedule for verifying custom GitLab Pages domains.
-| `pages_domain_ssl_renewal_cron_worker` | Schedule for obtaining and renewing SSL certificates through Let's Encrypt for GitLab Pages domains.
-| `pages_domain_removal_cron_worker` | Schedule for removing unverified custom GitLab Pages domains.
-| `pages_path` | The directory on disk where pages are stored, defaults to `GITLAB-RAILS/shared/pages`.
-| `pages_nginx[]` | |
-| `enable` | Include a virtual host `server{}` block for Pages inside NGINX. Needed for NGINX to proxy traffic back to the Pages daemon. Set to `false` if the Pages daemon should directly receive all requests, for example, when using [custom domains](index.md#custom-domains).
-| `FF_ENABLE_REDIRECTS` | Feature flag to disable redirects (enabled by default). Read the [redirects documentation](../../user/project/pages/redirects.md#disable-redirects) for more information. |
+| Setting | Description |
+|-----------------------------------------|-------------|
+| `pages_external_url` | The URL where GitLab Pages is accessible, including protocol (HTTP / HTTPS). If `https://` is used, additional configuration is required. See [Wildcard domains with TLS support](#wildcard-domains-with-tls-support) and [Custom domains with TLS support](#custom-domains-with-tls-support) for details. |
+| **`gitlab_pages[]`** | |
+| `access_control` | Whether to enable [access control](index.md#access-control). |
+| `api_secret_key` | Full path to file with secret key used to authenticate with the GitLab API. Auto-generated when left unset. |
+| `artifacts_server` | Enable viewing [artifacts](../job_artifacts.md) in GitLab Pages. |
+| `artifacts_server_timeout` | Timeout (in seconds) for a proxied request to the artifacts server. |
+| `artifacts_server_url` | API URL to proxy artifact requests to. Defaults to GitLab `external URL` + `/api/v4`, for example `https://gitlab.com/api/v4`. When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server), this URL must point to the main GitLab server's API. |
+| `auth_redirect_uri` | Callback URL for authenticating with GitLab. Defaults to project's subdomain of `pages_external_url` + `/auth`. |
+| `auth_secret` | Secret key for signing authentication requests. Leave blank to pull automatically from GitLab during OAuth registration. |
+| `dir` | Working directory for configuration and secrets files. |
+| `enable` | Enable or disable GitLab Pages on the current system. |
+| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`. |
+| `external_https` | Configure Pages to bind to one or more secondary IP addresses, serving HTTPS requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_https`. |
+| `gitlab_client_http_timeout` | GitLab API HTTP client connection timeout in seconds (default: 10s). |
+| `gitlab_client_jwt_expiry` | JWT Token expiry time in seconds (default: 30s). |
+| `gitlab_cache_expiry` | The maximum time a domain's configuration is stored in the cache (default: 600s). |
+| `gitlab_cache_refresh` | The interval at which a domain's configuration is set to be due to refresh (default: 60s). |
+| `gitlab_cache_cleanup` | The interval at which expired items are removed from the cache (default: 60s). |
+| `gitlab_retrieval_timeout` | The maximum time to wait for a response from the GitLab API per request (default: 30s). |
+| `gitlab_retrieval_interval` | The interval to wait before retrying to resolve a domain's configuration via the GitLab API (default: 1s). |
+| `gitlab_retrieval_retries` | The maximum number of times to retry to resolve a domain's configuration via the API (default: 3). |
+| `domain_config_source` | Domain configuration source (default: `auto`) |
+| `gitlab_id` | The OAuth application public ID. Leave blank to automatically fill when Pages authenticates with GitLab. |
+| `gitlab_secret` | The OAuth application secret. Leave blank to automatically fill when Pages authenticates with GitLab. |
+| `auth_scope` | The OAuth application scope to use for authentication. Must match GitLab Pages OAuth application settings. Leave blank to use `api` scope by default. |
+| `gitlab_server` | Server to use for authentication when access control is enabled; defaults to GitLab `external_url`. |
+| `headers` | Specify any additional http headers that should be sent to the client with each response. Multiple headers can be given as an array, header and value as one string, for example `['my-header: myvalue', 'my-other-header: my-other-value']` |
+| `inplace_chroot` | On [systems that don't support bind-mounts](index.md#additional-configuration-for-docker-container), this instructs GitLab Pages to `chroot` into its `pages_path` directory. Some caveats exist when using in-place `chroot`; refer to the GitLab Pages [README](https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md#caveats) for more information. |
+| `insecure_ciphers` | Use default list of cipher suites, may contain insecure ones like 3DES and RC4. |
+| `internal_gitlab_server` | Internal GitLab server address used exclusively for API requests. Useful if you want to send that traffic over an internal load balancer. Defaults to GitLab `external_url`. |
+| `listen_proxy` | The addresses to listen on for reverse-proxy requests. Pages binds to these addresses' network sockets and receives incoming requests from them. Sets the value of `proxy_pass` in `$nginx-dir/conf/gitlab-pages.conf`. |
+| `log_directory` | Absolute path to a log directory. |
+| `log_format` | The log output format: `text` or `json`. |
+| `log_verbose` | Verbose logging, true/false. |
+| `propagate_correlation_id` | Set to true (false by default) to re-use existing Correlation ID from the incoming request header `X-Request-ID` if present. If a reverse proxy sets this header, the value will be propagated in the request chain. |
+| `max_connections` | Limit on the number of concurrent connections to the HTTP, HTTPS or proxy listeners. |
+| `metrics_address` | The address to listen on for metrics requests. |
+| `redirect_http` | Redirect pages from HTTP to HTTPS, true/false. |
+| `sentry_dsn` | The address for sending Sentry crash reporting to. |
+| `sentry_enabled` | Enable reporting and logging with Sentry, true/false. |
+| `sentry_environment` | The environment for Sentry crash reporting. |
+| `status_uri` | The URL path for a status page, for example, `/@status`. |
+| `tls_max_version` | Specifies the maximum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2"). |
+| `tls_min_version` | Specifies the minimum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2"). |
+| `use_http2` | Enable HTTP2 support. |
+| **`gitlab_pages['env'][]`** | |
+| `http_proxy` | Configure GitLab Pages to use an HTTP Proxy to mediate traffic between Pages and GitLab. Sets an environment variable `http_proxy` when starting Pages daemon. |
+| **`gitlab_rails[]`** | |
+| `pages_domain_verification_cron_worker` | Schedule for verifying custom GitLab Pages domains. |
+| `pages_domain_ssl_renewal_cron_worker` | Schedule for obtaining and renewing SSL certificates through Let's Encrypt for GitLab Pages domains. |
+| `pages_domain_removal_cron_worker` | Schedule for removing unverified custom GitLab Pages domains. |
+| `pages_path` | The directory on disk where pages are stored, defaults to `GITLAB-RAILS/shared/pages`. |
+| **`pages_nginx[]`** | |
+| `enable` | Include a virtual host `server{}` block for Pages inside NGINX. Needed for NGINX to proxy traffic back to the Pages daemon. Set to `false` if the Pages daemon should directly receive all requests, for example, when using [custom domains](index.md#custom-domains). |
+| `FF_ENABLE_REDIRECTS` | Feature flag to disable redirects (enabled by default). Read the [redirects documentation](../../user/project/pages/redirects.md#disable-redirects) for more information. |
---
@@ -347,7 +360,7 @@ When adding a custom domain, users are required to prove they own it by
adding a GitLab-controlled verification code to the DNS records for that domain.
If your user base is private or otherwise trusted, you can disable the
-verification requirement. Navigate to **Admin Area > Settings > Preferences** and
+verification requirement. Go to **Admin Area > Settings > Preferences** and
uncheck **Require users to prove ownership of custom domains** in the **Pages** section.
This setting is enabled by default.
@@ -362,7 +375,7 @@ sites served under a custom domain.
To enable it, you must:
1. Choose an email address on which you want to receive notifications about expiring domains.
-1. Navigate to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
+1. Go to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
1. Enter the email address for receiving notifications and accept Let's Encrypt's Terms of Service as shown below.
1. Click **Save changes**.
@@ -403,6 +416,8 @@ all the App nodes and Sidekiq nodes.
#### Using Pages with reduced authentication scope
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/423) in GitLab 13.10.
+
By default, the Pages daemon uses the `api` scope to authenticate. You can configure this. For
example, this reduces the scope to `read_api` in `/etc/gitlab/gitlab.rb`:
@@ -414,7 +429,7 @@ The scope to use for authentication must match the GitLab Pages OAuth applicatio
pre-existing applications must modify the GitLab Pages OAuth application. Follow these steps to do
this:
-1. Navigate to your instance's **Admin Area > Settings > Applications** and expand **GitLab Pages**
+1. Go to your instance's **Admin Area > Settings > Applications** and expand **GitLab Pages**
settings.
1. Clear the `api` scope's checkbox and select the desired scope's checkbox (for example,
`read_api`).
@@ -432,7 +447,7 @@ This can be useful to preserve information published with Pages websites to the
of your instance only.
To do that:
-1. Navigate to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
+1. Go to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
1. Check the **Disable public access to Pages sites** checkbox.
1. Click **Save changes**.
@@ -521,6 +536,25 @@ Follow the steps below to configure verbose logging of GitLab Pages daemon.
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+## Propagating the correlation ID
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/438) in GitLab 13.10.
+
+Setting the `propagate_correlation_id` to true will allow installations behind a reverse proxy generate
+and set a correlation ID to requests sent to GitLab Pages. When a reverse proxy sets the header value `X-Request-ID`,
+the value will be propagated in the request chain.
+Users [can find the correlation ID in the logs](../troubleshooting/tracing_correlation_id.md#identify-the-correlation-id-for-a-request).
+
+To enable the propagation of the correlation ID:
+
+1. Set the parameter to true in `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_pages['propagate_correlation_id'] = true
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
## Change storage path
Follow the steps below to change the default path where GitLab Pages' contents
@@ -599,13 +633,13 @@ The default is 100MB.
To override the global maximum pages size for a specific project:
-1. Navigate to your project's **Settings > Pages** page.
+1. Go to your project's **Settings > Pages** page.
1. Edit the **Maximum size of pages**.
1. Click **Save changes**.
To override the global maximum pages size for a specific group:
-1. Navigate to your group's **Settings > General** page and expand **Pages**.
+1. Go to your group's **Settings > General** page and expand **Pages**.
1. Edit the **Maximum size of pages**.
1. Click **Save changes**.
@@ -718,9 +752,11 @@ The default value for Omnibus installations is `nil`.
If left unchanged, GitLab Pages tries to use any available source (either `gitlab` or `disk`). The
preferred source is `gitlab`, which uses [API-based configuration](#gitlab-api-based-configuration).
+On large GitLab instances, using the API-based configuration will significantly improve the pages daemon startup time, as there is no need to load all custom domains configuration into memory.
+
For more details see this [blog post](https://about.gitlab.com/blog/2020/08/03/how-gitlab-pages-uses-the-gitlab-api-to-serve-content/).
-### Deprecated domain_config_source
+### Deprecated `domain_config_source`
WARNING:
The flag `gitlab_pages['domain_config_source']` is deprecated for use in [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/217913),
@@ -767,6 +803,44 @@ gitlab_pages['domain_config_source'] = "disk"
For other common issues, see the [troubleshooting section](#failed-to-connect-to-the-internal-gitlab-api)
or report an issue.
+### GitLab API cache configuration
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/520) in GitLab 13.10.
+
+API-based configuration uses a caching mechanism to improve performance and reliability of serving Pages.
+The cache behavior can be modified by changing the cache settings, however, the recommended values are set for you and should only be modified if needed.
+Incorrect configuration of these values may result in intermittent
+or persistent errors, or the Pages Daemon serving old content.
+
+NOTE:
+Expiry, interval and timeout flags use [Golang's duration formatting](https://golang.org/pkg/time/#ParseDuration).
+A duration string is a possibly signed sequence of decimal numbers,
+each with optional fraction and a unit suffix, such as "300ms", "1.5h" or "2h45m".
+Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
+
+Examples:
+
+- Increasing `gitlab_cache_expiry` will allow items to exist in the cache longer.
+This setting might be useful if the communication between GitLab Pages and GitLab Rails
+is not stable.
+
+- Increasing `gitlab_cache_refresh` will reduce the frequency at which GitLab Pages
+requests a domain's configuration from GitLab Rails. This setting might be useful
+GitLab Pages generates too many requests to GitLab API and content does not change frequently.
+
+- Decreasing `gitlab_cache_cleanup` will remove expired items from the cache more frequently,
+reducing the memory usage of your Pages node.
+
+- Decreasing `gitlab_retrieval_timeout` allows you to stop the request to GitLab Rails
+more quickly. Increasing it will allow more time to receive a response from the API,
+useful in slow networking environments.
+
+- Decreasing `gitlab_retrieval_interval` will make requests to the API more frequently,
+only when there is an error response from the API, for example a connection timeout.
+
+- Decreasing `gitlab_retrieval_retries` will reduce the number of times a domain's
+configuration is tried to be resolved automatically before reporting an error.
+
## Using object storage
> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5577) in GitLab 13.6.
@@ -837,7 +911,7 @@ In installations from source:
remote_directory: "pages" # The bucket name
connection:
provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACESS_KEY_ID
+ aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: eu-central-1
```
@@ -944,14 +1018,15 @@ to define the explicit address that the GitLab Pages daemon should listen on:
gitlab_pages['listen_proxy'] = '127.0.0.1:8090'
```
-### 404 error after transferring project to a different group or user
+### 404 error after transferring the project to a different group or user, or changing project path
If you encounter a `404 Not Found` error a Pages site after transferring a project to
-another group or user, you must trigger a domain configuration update for Pages. To do
-so, write something in the `.update` file. The Pages daemon monitors for changes to this
-file, and reloads the configuration when changes occur.
+another group or user, or changing project path, you must trigger a domain configuration
+update for Pages. To do so, write something in the `.update` file. The Pages daemon
+monitors for changes to this file, and reloads the configuration when changes occur.
-Use this example to fix a `404 Not Found` error after transferring a project with Pages:
+Use this example to fix a `404 Not Found` error after transferring a project or changing
+a project path with Pages:
```shell
date > /var/opt/gitlab/gitlab-rails/shared/pages/.update
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index e80e38fe5d1..a9a38ce1beb 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -900,7 +900,12 @@ You can switch an exiting database cluster to use Patroni instead of repmgr with
```
1. Repeat the last two steps for all replica nodes. `gitlab.rb` should look the same on all nodes.
-1. Optional: You can remove `gitlab_repmgr` database and role on the primary.
+1. If present, remove the `gitlab_repmgr` database and role on the primary. If you don't delete the `gitlab_repmgr`
+ database, upgrading PostgreSQL 11 to 12 will fail with:
+
+ ```plaintext
+ could not load library "$libdir/repmgr_funcs": ERROR: could not access file "$libdir/repmgr_funcs": No such file or directory
+ ```
### Upgrading PostgreSQL major version in a Patroni cluster
diff --git a/doc/administration/pseudonymizer.md b/doc/administration/pseudonymizer.md
index 5f1272b1f4a..4aa73212e43 100644
--- a/doc/administration/pseudonymizer.md
+++ b/doc/administration/pseudonymizer.md
@@ -24,7 +24,7 @@ be textually exported. This ensures that:
## Configuration
-To configure the pseudonymizer, you need to:
+To configure the Pseudonymizer, you need to:
- Provide a manifest file that describes which fields should be included or
pseudonymized ([example `manifest.yml` file](https://gitlab.com/gitlab-org/gitlab/tree/master/config/pseudonymizer.yml)).
@@ -87,7 +87,7 @@ To configure the pseudonymizer, you need to:
## Usage
-You can optionally run the pseudonymizer using the following environment variables:
+You can optionally run the Pseudonymizer using the following environment variables:
- `PSEUDONYMIZER_OUTPUT_DIR` - where to store the output CSV files (defaults to `/tmp`)
- `PSEUDONYMIZER_BATCH` - the batch size when querying the DB (defaults to `100000`)
diff --git a/doc/administration/raketasks/check.md b/doc/administration/raketasks/check.md
index 5ec268ac769..8d2ca103c82 100644
--- a/doc/administration/raketasks/check.md
+++ b/doc/administration/raketasks/check.md
@@ -245,3 +245,9 @@ Upload.find_each do |upload|
end
p "#{uploads_deleted} remote objects were destroyed."
```
+
+### Delete references to missing LFS objects
+
+If `gitlab-rake gitlab:lfs:check VERBOSE=1` detects LFS objects that exist in the database
+but not on disk, [follow the procedure in the LFS documentation](../../topics/git/lfs/index.md#missing-lfs-objects)
+to remove the database entries.
diff --git a/doc/administration/raketasks/github_import.md b/doc/administration/raketasks/github_import.md
index c29865be56c..0338732e886 100644
--- a/doc/administration/raketasks/github_import.md
+++ b/doc/administration/raketasks/github_import.md
@@ -19,8 +19,8 @@ before/after the brackets. Also, some shells (for example, `zsh`) can interpret
## Caveats
-If the GitHub [rate limit](https://docs.github.com/v3/#rate-limiting) is reached while importing,
-the importing process waits (`sleep()`) until it can continue importing.
+If the GitHub [rate limit](https://docs.github.com/en/rest/reference/rate-limit) is reached while
+importing, the importing process waits (`sleep()`) until it can continue importing.
## Importing multiple projects
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index 3494ceb701e..fa95f38f37c 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -110,7 +110,7 @@ The `gitlab:check` Rake task runs the following Rake tasks:
It checks that each component was set up according to the installation guide and suggest fixes
for issues found. This command must be run from your application server and doesn't work correctly on
-component servers like [Gitaly](../gitaly/index.md#run-gitaly-on-its-own-server).
+component servers like [Gitaly](../gitaly/configure_gitaly.md#run-gitaly-on-its-own-server).
You may also have a look at our troubleshooting guides for:
@@ -246,8 +246,9 @@ have been corrupted, you should reinstall the omnibus package.
## Check TCP connectivity to a remote site
Sometimes you need to know if your GitLab installation can connect to a TCP
-service on another machine - perhaps a PostgreSQL or HTTPS server. A Rake task
-is included to help you with this:
+service on another machine (for example a PostgreSQL or web server)
+in order to troubleshoot proxy issues.
+A Rake task is included to help you with this.
**Omnibus Installation**
diff --git a/doc/administration/read_only_gitlab.md b/doc/administration/read_only_gitlab.md
index cb7b621bf16..698da80a07c 100644
--- a/doc/administration/read_only_gitlab.md
+++ b/doc/administration/read_only_gitlab.md
@@ -6,10 +6,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Place GitLab into a read-only state **(FREE SELF)**
-WARNING:
-This document should be used as a temporary solution.
-There's work in progress to make this
-[possible with Geo](https://gitlab.com/groups/gitlab-org/-/epics/2149).
+NOTE:
+In GitLab 13.9 and later, the recommended method to
+place GitLab in a read-only state is to enable
+[maintenance mode](../administration/maintenance_mode/index.md).
In some cases, you might want to place GitLab under a read-only state.
The configuration for doing so depends on your desired outcome.
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index d4d522ab1b8..a51641f661f 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -26,14 +26,14 @@ full list of reference architectures, see
| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
-| Gitaly Cluster | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | m5.4xlarge | D16s v3 |
+| Gitaly | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | m5.4xlarge | D16s v3 |
| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
| GitLab Rails | 3 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | c5.9xlarge | F32s v2 |
| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
```plantuml
@startuml 10k
@@ -206,7 +206,7 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
## Configure the external load balancer
@@ -1508,7 +1508,7 @@ Praefect requires several secret tokens to secure communications across the Clus
Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
the details of each Gitaly node that makes up the cluster. Each storage is also given a name
-and this name is used in several areas of the config. In this guide, the name of the storage will be
+and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
@@ -1756,7 +1756,7 @@ Note the following:
necessary.
- The Internal Load Balancer will also access to the certificates and need to be configured
- to allow for TLS passthrough.
+ to allow for TLS pass-through.
Refer to the load balancers documentation on how to configure this.
To configure Praefect with TLS:
@@ -1927,7 +1927,7 @@ To configure the Sidekiq nodes, on each one:
node_exporter['listen_address'] = '0.0.0.0:9100'
# Rails Status for prometheus
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1940,13 +1940,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -2055,8 +2055,8 @@ On each node perform the following:
# Add the monitoring node's IP address to the monitoring whitelist and allow it to
# scrape the NGINX metrics
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
- nginx['status']['options']['allow'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
+ nginx['status']['options']['allow'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -2069,13 +2069,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -2192,7 +2192,7 @@ running [Prometheus](../monitoring/prometheus/index.md) and
The following IP will be used as an example:
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
To configure the Monitoring node:
@@ -2303,20 +2303,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -2324,7 +2313,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -2360,16 +2349,6 @@ as soon as possible.
</a>
</div>
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Cloud Native Deployment (optional)
Hybrid installations leverage the benefits of both cloud native and traditional
@@ -2422,3 +2401,9 @@ Webservice pods. Expand available resources using the ratio of 1 vCPU to 1.25 GB
_per each worker process_ for each additional Webservice pod.
For further information on resource usage, see the [Webservice resources](https://docs.gitlab.com/charts/charts/gitlab/webservice/#resources).
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 48c72bb930d..8cf9efe1d2c 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -12,100 +12,110 @@ full list of reference architectures, see
[Available reference architectures](index.md#available-reference-architectures).
> - **Supported users (approximate):** 25,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Test requests per second (RPS) rates:** API: 500 RPS, Web: 50 RPS, Git (Pull): 50 RPS, Git (Push): 10 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|-----------------------------------------|-------------|-------------------------|-----------------|-------------|----------|
-| External load balancing node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 8 vCPU, 30 GB memory | n1-standard-8 | `m5.2xlarge` | D8s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 4 vCPU, 3.6GB memory | n1-highcpu-4 | `c5.large` | F2s v2 |
-| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Gitaly | 2 (minimum) | 32 vCPU, 120 GB memory | n1-standard-32 | `m5.8xlarge` | D32s v3 |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| GitLab Rails | 5 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | `c5.9xlarge` | F32s v2 |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
+| External load balancing node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | m5.4xlarge | D16s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 4 vCPU, 3.6GB memory | n1-highcpu-4 | c5.large | F2s v2 |
+| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Gitaly | 3 | 32 vCPU, 120 GB memory | n1-standard-32 | m5.8xlarge | D32s v3 |
+| Praefect | 3 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| GitLab Rails | 5 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | c5.9xlarge | F32s v2 |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis_Cache
- ApplicationServer --> Redis_Queues
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- ApplicationServer --> Consul
-
- Consul --> Database
- Consul --> PgBouncer
- Redis_Cache --> Consul
- Redis_Queues --> Consul
- BackgroundJobs --> Consul
-
- state Consul {
- "Consul_1..3"
- }
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
-
- state Redis_Cache {
- "R_Cache_Primary_Node"
- "R_Cache_Replica_Node_1..2"
- "R_Cache_Sentinel_1..3"
- }
-
- state Redis_Queues {
- "R_Queues_Primary_Node"
- "R_Queues_Replica_Node_1..2"
- "R_Queues_Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..5"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 25k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x5" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -120,19 +130,25 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
+that to achieve full High Availability a third party PostgreSQL database solution will be required.
+We hope to offer a built in solutions for these restrictions in the future but in the meantime a non HA PostgreSQL server
+can be set up via Omnibus GitLab, which the above specs reflect. Refer to the following issues for more information: [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919) & [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 25,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the load balancing of GitLab application internal connections.
1. [Configure Consul](#configure-consul).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
1. [Configure Redis](#configure-redis).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -178,6 +194,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.83`: Sentinel - Queues 3
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.101`: Sidekiq 1
- `10.6.0.102`: Sidekiq 2
- `10.6.0.103`: Sidekiq 3
@@ -185,7 +206,9 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
-- `10.6.0.121`: Prometheus
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
+- `10.6.0.151`: Prometheus
## Configure the external load balancer
@@ -308,6 +331,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Consul
The following IPs will be used as an example:
@@ -662,52 +750,6 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
-
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
-
-The following IP will be used as an example:
-
-- `10.6.0.40`: Internal Load Balancer
-
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
-
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
-
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
-
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
-
- default_backend pgbouncer
-
-backend pgbouncer
- mode tcp
- option tcp-check
-
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
-
-Refer to your preferred Load Balancer's documentation for further guidance.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -1302,19 +1344,283 @@ To configure the Sentinel Queues server:
</a>
</div>
-## Configure Gitaly
+## Configure Gitaly Cluster
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+
+The recommended cluster setup includes the following components:
+
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
+
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
+
+### Configure Praefect PostgreSQL
+
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
+
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
+
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
+
+The following IPs will be used as an example:
+
+- `10.6.0.141`: Praefect PostgreSQL
+
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+#### Praefect HA PostgreSQL third-party solution
+
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
-[Gitaly](../gitaly/index.md) server node requirements are dependent on data,
-specifically the number of projects and those projects' sizes. It's recommended
-that a Gitaly server node stores no more than 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
+
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### Configure Gitaly
+
+The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
+requirements that are dependent on data, specifically the number of projects
+and those projects' sizes. It's recommended that a Gitaly Cluster stores
+no more than 5 TB of data on each node. Depending on your
+repository storage requirements, you may require additional Gitaly Clusters.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1325,36 +1631,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
+For configuring Gitaly you should note the following:
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
-
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
-
-- `10.6.0.91`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.92`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1364,21 +1655,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1407,36 +1686,42 @@ On each node:
# firewalls to restrict access to this address/port.
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
+
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
then replace the file of the same name on this server. If that file isn't on
@@ -1444,34 +1729,44 @@ On each node:
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-### Gitaly TLS support
+### Gitaly Cluster TLS support
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
+
+Note the following:
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-To configure Gitaly with TLS:
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
+
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
+
+To configure Praefect with TLS:
+
+1. Create certificates for Praefect servers.
+
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1480,27 +1775,34 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
- ```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
+
+ ```ruby
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
+ ```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1587,12 +1889,15 @@ To configure the Sidekiq nodes, on each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
@@ -1624,7 +1929,7 @@ To configure the Sidekiq nodes, on each one:
node_exporter['listen_address'] = '0.0.0.0:9100'
# Rails Status for prometheus
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1637,13 +1942,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -1671,6 +1976,8 @@ The following IPs will be used as an example:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
On each node perform the following:
@@ -1690,17 +1997,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1755,8 +2059,8 @@ On each node perform the following:
# Add the monitoring node's IP address to the monitoring whitelist and allow it to
# scrape the NGINX metrics
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
- nginx['status']['options']['allow'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
+ nginx['status']['options']['allow'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1769,24 +2073,25 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1891,7 +2196,7 @@ running [Prometheus](../monitoring/prometheus/index.md) and
The following IP will be used as an example:
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
To configure the Monitoring node:
@@ -2002,20 +2307,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -2023,7 +2317,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -2058,13 +2352,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 9ad6054104a..fc0afbff194 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -668,13 +668,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
## Uncomment and edit the following options if you have set up NFS
##
@@ -920,18 +920,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is
-separately configured. We have an [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-for improving this, which would allow for one bucket with separate folders.
-
-Using a single bucket when GitLab is deployed with the Helm chart causes
-restoring from a backup to
-[not function properly](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
-Although you may not be using a Helm deployment right now, if you migrate
-GitLab to a Helm deployment later, GitLab would still work, but you may not
-realize backups aren't working correctly until a critical requirement for
-functioning backups is encountered.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -975,13 +966,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index 175c4318d78..7f7777455c2 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -7,91 +7,121 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Reference architecture: up to 3,000 users **(PREMIUM SELF)**
-This page describes GitLab reference architecture for up to 3,000 users.
-It is designed to help your organization achieve a
-highly-available GitLab deployment. If you do not have the expertise or need to
-maintain a highly-available environment, you can have a simpler and less
-costly-to-operate environment by using the
-[2,000-user reference architecture](2k_users.md).
-If you have fewer than 3,000 users and still want a highly-available GitLab deployment,
-you should still use this reference architecture but scale down the node sizes.
+This GitLab reference architecture can help you deploy GitLab to up to 3,000
+users, and then maintain uptime and access for those users. You can also use
+this architecture to provide improved GitLab uptime and availability for fewer
+than 3,000 users. For fewer users, reduce the stated node sizes as needed.
+
+If maintining a high level of uptime for your GitLab environment isn't a
+requirement, or if you don't have the expertise to maintain this sort of
+environment, we recommend using the [2,000-user reference architecture](2k_users.md)
+for your GitLab installation.
For a full list of reference architectures, see
[Available reference architectures](index.md#available-reference-architectures).
> - **Supported users (approximate):** 3,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes, although [Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution
> - **Test requests per second (RPS) rates:** API: 60 RPS, Web: 6 RPS, Git (Pull): 6 RPS, Git (Push): 1 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|--------------------------------------------|-------------|-----------------------|----------------|-------------|---------|
-| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Gitaly | 2 (minimum) | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| GitLab Rails | 3 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | `c5.2xlarge` | F8s v2 |
-| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Gitaly | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| GitLab Rails | 3 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | c5.2xlarge | F8s v2 |
+| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->Redis
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
- state Redis {
- "R_Primary_Node"
- "R_Replica_Node_1..2"
- "R_Consul/Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..3"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 3k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x3" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -106,19 +136,30 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+[Praefect requires its own database server](../gitaly/praefect.md#postgresql),
+and a third-party PostgreSQL database solution is required to achieve full
+high availability. Although we hope to offer a built-in solution for these
+restrictions in the future, you can set up a non-HA PostgreSQL server by using
+Omnibus GitLab (which the previous specifications reflect). Refer to the
+following issues for more information:
+
+- [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919)
+- [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 3,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the load balancing of GitLab application internal connections.
1. [Configure Redis](#configure-redis).
1. [Configure Consul and Sentinel](#configure-consul-and-sentinel).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -155,6 +196,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.20`: Internal Load Balancer
- `10.6.0.51`: Gitaly 1
- `10.6.0.52`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.71`: Sidekiq 1
- `10.6.0.72`: Sidekiq 2
- `10.6.0.73`: Sidekiq 3
@@ -285,6 +331,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -925,45 +1036,96 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
+## Configure Gitaly Cluster
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
-The following IP will be used as an example:
+The recommended cluster setup includes the following components:
-- `10.6.0.20`: Internal Load Balancer
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
+### Configure Praefect PostgreSQL
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
- default_backend pgbouncer
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
-backend pgbouncer
- mode tcp
- option tcp-check
+The following IPs will be used as an example:
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
+- `10.6.0.141`: Praefect PostgreSQL
-Refer to your preferred Load Balancer's documentation for further guidance.
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -971,19 +1133,186 @@ Refer to your preferred Load Balancer's documentation for further guidance.
</a>
</div>
-## Configure Gitaly
+#### Praefect HA PostgreSQL third-party solution
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
+
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
-[Gitaly](../gitaly/index.md) server node requirements are dependent on data,
-specifically the number of projects and those projects' sizes. It's recommended
-that a Gitaly server node stores no more than 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### Configure Gitaly
+
+The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
+requirements that are dependent on data, specifically the number of projects
+and those projects' sizes. It's recommended that a Gitaly Cluster stores
+no more than 5 TB of data on each node. Depending on your
+repository storage requirements, you may require additional Gitaly Clusters.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -994,36 +1323,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
-
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
-
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
+For configuring Gitaly you should note the following:
-- `10.6.0.51`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.52`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1033,21 +1347,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1057,7 +1359,6 @@ On each node:
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
grafana['enable'] = false
- gitlab_exporter['enable'] = false
# If you run a separate monitoring node you can disable these services
alertmanager['enable'] = false
@@ -1078,101 +1379,86 @@ On each node:
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
- ## Enable service discovery for Prometheus
- consul['enable'] = true
- consul['monitoring_service_discovery'] = true
-
- # Set the network addresses that the exporters will listen on for monitoring
- gitaly['prometheus_listen_addr'] = "0.0.0.0:9236"
- node_exporter['listen_address'] = '0.0.0.0:9100'
- gitlab_rails['prometheus_address'] = '10.6.0.81:9090'
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
+
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Confirm that Gitaly can perform callbacks to the internal API:
- ```shell
- sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml
- ```
+### Gitaly Cluster TLS support
-1. Verify the GitLab services are running:
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
- ```shell
- sudo gitlab-ctl status
- ```
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
- The output should be similar to the following:
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
- ```plaintext
- run: consul: (pid 30339) 77006s; run: log: (pid 29878) 77020s
- run: gitaly: (pid 30351) 77005s; run: log: (pid 29660) 77040s
- run: logrotate: (pid 7760) 3213s; run: log: (pid 29782) 77032s
- run: node-exporter: (pid 30378) 77004s; run: log: (pid 29812) 77026s
- ```
+Note the following:
-### Gitaly TLS support
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+To configure Praefect with TLS:
-To configure Gitaly with TLS:
+1. Create certificates for Praefect servers.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1181,27 +1467,35 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
+ ```
+
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
<div align="right">
@@ -1272,17 +1566,20 @@ To configure the Sidekiq nodes, one each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
#######################################
- gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
+ gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP
gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql'
@@ -1322,13 +1619,14 @@ To configure the Sidekiq nodes, one each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
+
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1400,17 +1698,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Interal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1489,23 +1784,24 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1697,20 +1993,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -1718,7 +2003,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -1753,13 +2038,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index 0b22a2d3602..606701a4d83 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -12,100 +12,110 @@ full list of reference architectures, see
[Available reference architectures](index.md#available-reference-architectures).
> - **Supported users (approximate):** 50,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Test requests per second (RPS) rates:** API: 1000 RPS, Web: 100 RPS, Git (Pull): 100 RPS, Git (Push): 20 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|-----------------------------------------|-------------|-------------------------|-----------------|--------------|----------|
-| External load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | `c5.2xlarge` | F8s v2 |
-| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | `m5.4xlarge` | D16s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | `c5.2xlarge` | F8s v2 |
-| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Gitaly | 2 (minimum) | 64 vCPU, 240 GB memory | n1-standard-64 | `m5.16xlarge` | D64s v3 |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| GitLab Rails | 12 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | `c5.9xlarge` | F32s v2 |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
+| External load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | c5.2xlarge | F8s v2 |
+| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 32 vCPU, 120 GB memory | n1-standard-32 | m5.8xlarge | D32s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | c5.2xlarge | F8s v2 |
+| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Gitaly | 3 | 64 vCPU, 240 GB memory | n1-standard-64 | m5.16xlarge | D64s v3 |
+| Praefect | 3 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| GitLab Rails | 12 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | c5.9xlarge | F32s v2 |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis_Cache
- ApplicationServer --> Redis_Queues
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- ApplicationServer --> Consul
-
- Consul --> Database
- Consul --> PgBouncer
- Redis_Cache --> Consul
- Redis_Queues --> Consul
- BackgroundJobs --> Consul
-
- state Consul {
- "Consul_1..3"
- }
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
-
- state Redis_Cache {
- "R_Cache_Primary_Node"
- "R_Cache_Replica_Node_1..2"
- "R_Cache_Sentinel_1..3"
- }
-
- state Redis_Queues {
- "R_Queues_Primary_Node"
- "R_Queues_Replica_Node_1..2"
- "R_Queues_Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..12"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 50k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x12" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -120,19 +130,25 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
+that to achieve full High Availability a third party PostgreSQL database solution will be required.
+We hope to offer a built in solutions for these restrictions in the future but in the meantime a non HA PostgreSQL server
+can be set up via Omnibus GitLab, which the above specs reflect. Refer to the following issues for more information: [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919) & [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 50,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the loa
1. [Configure Consul](#configure-consul).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
1. [Configure Redis](#configure-redis).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -178,6 +194,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.83`: Sentinel - Queues 3
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.101`: Sidekiq 1
- `10.6.0.102`: Sidekiq 2
- `10.6.0.103`: Sidekiq 3
@@ -185,7 +206,16 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
-- `10.6.0.121`: Prometheus
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
+- `10.6.0.116`: GitLab application 6
+- `10.6.0.117`: GitLab application 7
+- `10.6.0.118`: GitLab application 8
+- `10.6.0.119`: GitLab application 9
+- `10.6.0.120`: GitLab application 10
+- `10.6.0.121`: GitLab application 11
+- `10.6.0.122`: GitLab application 12
+- `10.6.0.151`: Prometheus
## Configure the external load balancer
@@ -308,6 +338,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Consul
The following IPs will be used as an example:
@@ -662,52 +757,6 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
-
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
-
-The following IP will be used as an example:
-
-- `10.6.0.40`: Internal Load Balancer
-
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
-
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
-
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
-
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
-
- default_backend pgbouncer
-
-backend pgbouncer
- mode tcp
- option tcp-check
-
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
-
-Refer to your preferred Load Balancer's documentation for further guidance.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -1302,19 +1351,283 @@ To configure the Sentinel Queues server:
</a>
</div>
-## Configure Gitaly
+## Configure Gitaly Cluster
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+
+The recommended cluster setup includes the following components:
+
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
+
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
+
+### Configure Praefect PostgreSQL
+
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
+
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
+
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
+
+The following IPs will be used as an example:
+
+- `10.6.0.141`: Praefect PostgreSQL
+
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+#### Praefect HA PostgreSQL third-party solution
+
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
-[Gitaly](../gitaly/index.md) server node requirements are dependent on data,
-specifically the number of projects and those projects' sizes. It's recommended
-that a Gitaly server node stores no more than 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
+
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### Configure Gitaly
+
+The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
+requirements that are dependent on data, specifically the number of projects
+and those projects' sizes. It's recommended that a Gitaly Cluster stores
+no more than 5 TB of data on each node. Depending on your
+repository storage requirements, you may require additional Gitaly Clusters.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1325,36 +1638,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
+For configuring Gitaly you should note the following:
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
-
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
-
-- `10.6.0.91`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.92`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1364,21 +1662,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1407,36 +1693,42 @@ On each node:
# firewalls to restrict access to this address/port.
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
+
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
then replace the file of the same name on this server. If that file isn't on
@@ -1444,34 +1736,44 @@ On each node:
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-### Gitaly TLS support
+### Gitaly Cluster TLS support
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
+
+Note the following:
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-To configure Gitaly with TLS:
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
+
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
+
+To configure Praefect with TLS:
+
+1. Create certificates for Praefect servers.
+
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1480,27 +1782,34 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
- ```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
+
+ ```ruby
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
+ ```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1587,12 +1896,15 @@ To configure the Sidekiq nodes, on each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
@@ -1624,7 +1936,7 @@ To configure the Sidekiq nodes, on each one:
node_exporter['listen_address'] = '0.0.0.0:9100'
# Rails Status for prometheus
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1637,13 +1949,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -1671,6 +1983,15 @@ The following IPs will be used as an example:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
+- `10.6.0.116`: GitLab application 6
+- `10.6.0.117`: GitLab application 7
+- `10.6.0.118`: GitLab application 8
+- `10.6.0.119`: GitLab application 9
+- `10.6.0.120`: GitLab application 10
+- `10.6.0.121`: GitLab application 11
+- `10.6.0.122`: GitLab application 12
On each node perform the following:
@@ -1690,17 +2011,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Interal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1755,8 +2073,8 @@ On each node perform the following:
# Add the monitoring node's IP address to the monitoring whitelist and allow it to
# scrape the NGINX metrics
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
- nginx['status']['options']['allow'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
+ nginx['status']['options']['allow'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1769,24 +2087,25 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1891,7 +2210,7 @@ running [Prometheus](../monitoring/prometheus/index.md) and
The following IP will be used as an example:
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
To configure the Monitoring node:
@@ -2002,20 +2321,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -2023,7 +2331,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -2058,13 +2366,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index 37d35c299fa..0a236eac243 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -19,79 +19,107 @@ costly-to-operate environment by using the
[2,000-user reference architecture](2k_users.md).
> - **Supported users (approximate):** 5,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Test requests per second (RPS) rates:** API: 100 RPS, Web: 10 RPS, Git (Pull): 10 RPS, Git (Push): 2 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|--------------------------------------------|-------------|-------------------------|----------------|-------------|----------|
-| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Gitaly | 2 (minimum) | 8 vCPU, 30 GB memory | n1-standard-8 | `m5.2xlarge` | D8s v3 |
-| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| GitLab Rails | 3 | 16 vCPU, 14.4 GB memory | n1-highcpu-16 | `c5.4xlarge` | F16s v2 |
-| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Gitaly | 3 | 8 vCPU, 30 GB memory | n1-standard-8 | m5.2xlarge | D8s v3 |
+| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| GitLab Rails | 3 | 16 vCPU, 14.4 GB memory | n1-highcpu-16 | c5.4xlarge | F16s v2 |
+| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->Redis
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
-
- state Redis {
- "R_Primary_Node"
- "R_Replica_Node_1..2"
- "R_Consul/Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..3"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 5k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x3" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -106,19 +134,25 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
+that to achieve full High Availability a third party PostgreSQL database solution will be required.
+We hope to offer a built in solutions for these restrictions in the future but in the meantime a non HA PostgreSQL server
+can be set up via Omnibus GitLab, which the above specs reflect. Refer to the following issues for more information: [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919) & [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 5,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the load balancing of GitLab application internal connections.
1. [Configure Redis](#configure-redis).
1. [Configure Consul and Sentinel](#configure-consul-and-sentinel).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -155,6 +189,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.20`: Internal Load Balancer
- `10.6.0.51`: Gitaly 1
- `10.6.0.52`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.71`: Sidekiq 1
- `10.6.0.72`: Sidekiq 2
- `10.6.0.73`: Sidekiq 3
@@ -285,6 +324,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -924,45 +1028,96 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
+## Configure Gitaly Cluster
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
-The following IP will be used as an example:
+The recommended cluster setup includes the following components:
-- `10.6.0.20`: Internal Load Balancer
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
+### Configure Praefect PostgreSQL
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
- default_backend pgbouncer
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
-backend pgbouncer
- mode tcp
- option tcp-check
+The following IPs will be used as an example:
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
+- `10.6.0.141`: Praefect PostgreSQL
-Refer to your preferred Load Balancer's documentation for further guidance.
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -970,19 +1125,186 @@ Refer to your preferred Load Balancer's documentation for further guidance.
</a>
</div>
-## Configure Gitaly
+#### Praefect HA PostgreSQL third-party solution
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
-[Gitaly](../gitaly/index.md) server node requirements are dependent on data,
-specifically the number of projects and those projects' sizes. It's recommended
-that a Gitaly server node stores no more than 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## The IPs of the Consul server nodes
+ ## You can also use FQDNs and intermix them with IPs
+ consul['configuration'] = {
+ retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
+
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### Configure Gitaly
+
+The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
+requirements that are dependent on data, specifically the number of projects
+and those projects' sizes. It's recommended that a Gitaly Cluster stores
+no more than 5 TB of data on each node. Depending on your
+repository storage requirements, you may require additional Gitaly Clusters.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -993,36 +1315,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
-
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
-
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
+For configuring Gitaly you should note the following:
-- `10.6.0.51`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.52`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1032,21 +1339,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1056,7 +1351,6 @@ On each node:
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
grafana['enable'] = false
- gitlab_exporter['enable'] = false
# If you run a separate monitoring node you can disable these services
alertmanager['enable'] = false
@@ -1077,101 +1371,86 @@ On each node:
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
- ## Enable service discovery for Prometheus
- consul['enable'] = true
- consul['monitoring_service_discovery'] = true
-
- # Set the network addresses that the exporters will listen on for monitoring
- gitaly['prometheus_listen_addr'] = "0.0.0.0:9236"
- node_exporter['listen_address'] = '0.0.0.0:9100'
- gitlab_rails['prometheus_address'] = '10.6.0.81:9090'
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
+
+1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Confirm that Gitaly can perform callbacks to the internal API:
- ```shell
- sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml
- ```
+### Gitaly Cluster TLS support
-1. Verify the GitLab services are running:
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
- ```shell
- sudo gitlab-ctl status
- ```
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
- The output should be similar to the following:
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
- ```plaintext
- run: consul: (pid 30339) 77006s; run: log: (pid 29878) 77020s
- run: gitaly: (pid 30351) 77005s; run: log: (pid 29660) 77040s
- run: logrotate: (pid 7760) 3213s; run: log: (pid 29782) 77032s
- run: node-exporter: (pid 30378) 77004s; run: log: (pid 29812) 77026s
- ```
+Note the following:
-### Gitaly TLS support
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+To configure Praefect with TLS:
-To configure Gitaly with TLS:
+1. Create certificates for Praefect servers.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1180,27 +1459,35 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
+
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
+ ```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
<div align="right">
@@ -1269,17 +1556,20 @@ To configure the Sidekiq nodes, one each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
#######################################
- gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
+ gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP
gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql'
@@ -1319,13 +1609,13 @@ To configure the Sidekiq nodes, one each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1397,17 +1687,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Interal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1471,13 +1758,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
## Uncomment and edit the following options if you have set up NFS
##
@@ -1495,14 +1782,15 @@ On each node perform the following:
#registry['gid'] = 9002
```
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1694,20 +1982,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -1715,7 +1992,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -1750,13 +2027,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index b149cbc6e9d..d5d4f8ac0cb 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -5,7 +5,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Reference architectures
+# Reference architectures **(FREE SELF)**
You can set up GitLab on a single server or scale it up to serve many users.
This page details the recommended Reference Architectures that were built and
@@ -92,7 +92,7 @@ Also, not implementing extra servers for GitLab doesn't necessarily mean that yo
more downtime. Depending on your needs and experience level, single servers can
have more actual perceived uptime for your users.
-### Automated backups **(FREE SELF)**
+### Automated backups
> - Level of complexity: **Low**
> - Required domain knowledge: PostgreSQL, GitLab configurations, Git
diff --git a/doc/administration/reference_architectures/troubleshooting.md b/doc/administration/reference_architectures/troubleshooting.md
index cab45a99ee4..60a6ee0132f 100644
--- a/doc/administration/reference_architectures/troubleshooting.md
+++ b/doc/administration/reference_architectures/troubleshooting.md
@@ -257,7 +257,7 @@ sudo GRPC_TRACE=all GRPC_VERBOSITY=DEBUG gitlab-rake gitlab:gitaly:check
### Observing `gitaly-ruby` traffic
-[`gitaly-ruby`](../gitaly/index.md#gitaly-ruby) is an internal implementation detail of Gitaly,
+[`gitaly-ruby`](../gitaly/configure_gitaly.md#gitaly-ruby) is an internal implementation detail of Gitaly,
so, there's not that much visibility into what goes on inside
`gitaly-ruby` processes.
@@ -301,7 +301,7 @@ Confirm the following are all true:
- Creating a new project and [initializing it with a README](../../user/project/working_with_projects.md#blank-projects)
successfully creates the project but doesn't create the README.
- When [tailing the logs](https://docs.gitlab.com/omnibus/settings/logs.html#tail-logs-in-a-console-on-the-server) on an app node and reproducing the error, you get `401` errors
- when reaching the `/api/v4/internal/allowed` endpoint:
+ when reaching the [`/api/v4/internal/allowed`](../../development/internal_api.md) endpoint:
```shell
# api_json.log
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index 404a7bd77c1..d603e5d8c92 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -1,11 +1,11 @@
---
stage: Create
-group: Editor
+group: Gitaly
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
-# Repository checks
+# Repository checks **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3232) in GitLab 8.7.
@@ -44,3 +44,23 @@ in the [`repocheck.log` file](logs.md#repochecklog) on disk:
If the periodic repository check causes false alarms, you can clear all repository check states by
going to **Admin Area > Settings > Repository**
(`/admin/application_settings/repository`) and clicking **Clear all repository checks**.
+
+## Run a check manually
+
+[`git fsck`](https://git-scm.com/docs/git-fsck) is a read-only check that you can run
+manually against the repository on the [Gitaly server](gitaly/index.md).
+
+- For Omnibus GitLab installations, repositories are stored by default in
+ `/var/opt/gitlab/git-data/repositories`.
+- [Identify the subdirectory that contains the repository](repository_storage_types.md#from-project-name-to-hashed-path)
+ that you need to check.
+
+To run a check (for example):
+
+```shell
+sudo /opt/gitlab/embedded/bin/git -C /var/opt/gitlab/git-data/repositories/@hashed/0b/91/0b91...f9.git fsck
+```
+
+You can also run [Rake tasks](raketasks/check.md#repository-integrity) for checking Git
+repositories, which can be used to run `git fsck` against all repositories and generate
+repository checksums, as a way to compare repositories on different servers.
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index 5884a8b3283..e342ef8c04b 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -13,7 +13,9 @@ GitLab stores [repositories](../user/project/repository/index.md) on repository
storage is either:
- A `gitaly_address`, which points to a [Gitaly node](gitaly/index.md).
-- A `path`, which points directly a directory where the repository is stored.
+- A `path`, which points directly a directory where the repositories are stored. This method is
+ deprecated and [scheduled to be removed](https://gitlab.com/gitlab-org/gitaly/-/issues/1690) in
+ GitLab 14.0.
GitLab allows you to define multiple repository storages to distribute the storage load between
several mount points. For example:
@@ -23,7 +25,7 @@ several mount points. For example:
```ruby
git_data_dirs({
'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
})
```
@@ -31,18 +33,23 @@ several mount points. For example:
```plaintext
default:
- path: /mnt/git-storage-1
+ gitaly_address: tcp://gitaly1.example:8075
storage2:
- path: /mnt/git-storage-2
+ gitaly_address: tcp://gitaly2.example:8075
```
-For more information on
+For more information on:
- Configuring Gitaly, see [Configure Gitaly](gitaly/index.md#configure-gitaly).
- Configuring direct repository access, see the following section below.
## Configure repository storage paths
+WARNING:
+The following information is for configuring GitLab to directly access repositories. This
+configuration option is deprecated in favor of using [Gitaly](gitaly/index.md) and is scheduled to
+[be removed in GitLab 14.0](https://gitlab.com/gitlab-org/gitaly/-/issues/1690).
+
To configure repository storage paths:
1. Edit the necessary configuration files:
@@ -76,7 +83,7 @@ For [backups](../raketasks/backup_restore.md) to work correctly:
Omnibus GitLab takes care of these issues for you, but for source installations you should be extra
careful.
-While restoring a backup, the current contents of `/home/git/repositories` are moved to
+While restoring a backup, the current contents of `/home/git/repositories` are moved to
`/home/git/repositories.old`. If `/home/git/repositories` is a mount point, then `mv` would be
moving things between mount points, and problems can occur.
@@ -96,10 +103,6 @@ For compatibility reasons `gitlab.yml` has a different structure than Omnibus Gi
example. Then Omnibus GitLab creates a `repositories` directory under that path to use with
`gitlab.yml`.
-NOTE:
-This example uses NFS. We do not recommend using EFS for storage as it may impact GitLab performance.
-Read the [relevant documentation](nfs.md#avoid-using-awss-elastic-file-system-efs) for more details.
-
**For installations from source**
1. Edit `gitlab.yml` and add the storage paths:
@@ -111,10 +114,10 @@ Read the [relevant documentation](nfs.md#avoid-using-awss-elastic-file-system-ef
storages: # You must have at least a 'default' repository storage path.
default:
path: /home/git/repositories
- nfs_1:
- path: /mnt/nfs1/repositories
- nfs_2:
- path: /mnt/nfs2/repositories
+ storage1:
+ path: /mnt/storage1/repositories
+ storage2:
+ path: /mnt/storage2/repositories
```
1. [Restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
@@ -126,8 +129,8 @@ Edit `/etc/gitlab/gitlab.rb` by appending the rest of the paths to the default o
```ruby
git_data_dirs({
"default" => { "path" => "/var/opt/gitlab/git-data" },
- "nfs_1" => { "path" => "/mnt/nfs1/git-data" },
- "nfs_2" => { "path" => "/mnt/nfs2/git-data" }
+ "storage1" => { "path" => "/mnt/storage1/git-data" },
+ "storage2" => { "path" => "/mnt/storage2/git-data" }
})
```
@@ -153,6 +156,5 @@ often it is chosen. That is, `(storage weight) / (sum of all weights) * 100 = ch
## Move repositories
-To move a repository to a different repository path, use the
-[Project repository storage moves](../api/project_repository_storage_moves.md) API. Use
+To move a repository to a different repository path, use
the same process as [migrating existing repositories to Gitaly Cluster](gitaly/praefect.md#migrate-existing-repositories-to-gitaly-cluster).
diff --git a/doc/administration/repository_storage_types.md b/doc/administration/repository_storage_types.md
index a5c323be4ce..29e31fcb6ef 100644
--- a/doc/administration/repository_storage_types.md
+++ b/doc/administration/repository_storage_types.md
@@ -7,51 +7,53 @@ type: reference, howto
# Repository storage types **(FREE SELF)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/28283) in GitLab 10.0.
-> - Hashed storage became the default for new installations in GitLab 12.0
-> - Hashed storage is enabled by default for new and renamed projects in GitLab 13.0.
+GitLab can be configured to use one or multiple repository storages. These storages can be:
-GitLab can be configured to use one or multiple repository storage paths/shard
-locations that can be:
+- Accessed via [Gitaly](gitaly/index.md), optionally on
+ [its own server](gitaly/configure_gitaly.md#run-gitaly-on-its-own-server).
+- Mounted to the local disk. This [method](repository_storage_paths.md#configure-repository-storage-paths)
+ is deprecated and [scheduled to be removed](https://gitlab.com/groups/gitlab-org/-/epics/2320) in
+ GitLab 14.0.
+- Exposed as an NFS shared volume. This method is deprecated and
+ [scheduled to be removed](https://gitlab.com/groups/gitlab-org/-/epics/3371) in GitLab 14.0.
-- Mounted to the local disk
-- Exposed as an NFS shared volume
-- Accessed via [Gitaly](gitaly/index.md) on its own machine.
+In GitLab:
-In GitLab, this is configured in `/etc/gitlab/gitlab.rb` by the `git_data_dirs({})`
-configuration hash. The storage layouts discussed here apply to any shard
-defined in it.
+- Repository storages are configured in:
+ - `/etc/gitlab/gitlab.rb` by the `git_data_dirs({})` configuration hash for Omnibus GitLab
+ installations.
+ - `gitlab.yml` by the `repositories.storages` key for installations from source.
+- The `default` repository storage is available in any installations that haven't customized it. By
+ default, it points to a Gitaly node.
-The `default` repository shard that is available in any installations
-that haven't customized it, points to the local folder: `/var/opt/gitlab/git-data`.
-Anything discussed below is expected to be part of that folder.
+The repository storage types documented here apply to any repository storage defined in
+`git_data_dirs({})` or `repositories.storages`.
## Hashed storage
-NOTE:
-In GitLab 13.0, hashed storage is enabled by default and the legacy storage is
-deprecated. Support for legacy storage is scheduled to be removed in GitLab 14.0.
-If you haven't migrated yet, check the
-[migration instructions](raketasks/storage.md#migrate-to-hashed-storage).
-The option to choose between hashed and legacy storage in the admin area has
-been disabled.
-
-Hashed storage is the storage behavior we rolled out with 10.0. Instead
-of coupling project URL and the folder structure where the repository is
-stored on disk, we couple a hash based on the project's ID. This makes
-the folder structure immutable, and therefore eliminates any requirement to
-synchronize state from URLs to disk structure. This means that renaming a group,
-user, or project costs only the database transaction, and takes effect
-immediately.
-
-The hash also helps spread the repositories more evenly on the disk. The
-top-level directory contains fewer folders than the total number of top-level
-namespaces.
-
-The hash format is based on the hexadecimal representation of SHA256:
-`SHA256(project.id)`. The top-level folder uses the first 2 characters, followed
-by another folder with the next 2 characters. They are both stored in a special
-`@hashed` folder, to be able to co-exist with existing Legacy Storage projects:
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/28283) in GitLab 10.0.
+> - Made the default for new installations in GitLab 12.0.
+> - Enabled by default for new and renamed projects in GitLab 13.0.
+
+Hashed storage stores projects on disk in a location based on a hash of the project's ID. Hashed
+storage is different to [legacy storage](#legacy-storage) where a project is stored based on:
+
+- The project's URL.
+- The folder structure where the repository is stored on disk.
+
+This makes the folder structure immutable and eliminates the need to synchronize state from URLs to
+disk structure. This means that renaming a group, user, or project:
+
+- Costs only the database transaction.
+- Takes effect immediately.
+
+The hash also helps spread the repositories more evenly on the disk. The top-level directory
+contains fewer folders than the total number of top-level namespaces.
+
+The hash format is based on the hexadecimal representation of a SHA256, calculated with
+`SHA256(project.id)`. The top-level folder uses the first two characters, followed by another folder
+with the next two characters. They are both stored in a special `@hashed` folder so they can
+co-exist with existing legacy storage projects. For example:
```ruby
# Project's repository:
@@ -61,53 +63,59 @@ by another folder with the next 2 characters. They are both stored in a special
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
```
-### Translating hashed storage paths
+### Translate hashed storage paths
+
+Troubleshooting problems with the Git repositories, adding hooks, and other tasks requires you
+translate between the human-readable project name and the hashed storage path. You can translate:
-Troubleshooting problems with the Git repositories, adding hooks, and other
-tasks requires you translate between the human readable project name
-and the hashed storage path.
+- From a [project's name to its hashed path](#from-project-name-to-hashed-path).
+- From a [hashed path to a project's name](#from-hashed-path-to-project-name).
#### From project name to hashed path
-The hashed path is shown on the project's page in the [admin area](../user/admin_area/index.md#administering-projects).
+Administrators can look up a project's hashed path from its name or ID using:
+
+- The [Admin area](../user/admin_area/index.md#administering-projects).
+- A Rails console.
+
+To look up a project's hash path in the Admin Area:
-To access the Projects page, go to **Admin Area > Overview > Projects** and then
-open up the page for the project.
+1. Go to the **Admin Area** (**{admin}**).
+1. Go to **Overview > Projects** and select the project.
-The "Gitaly relative path" is shown there, for example:
+The **Gitaly relative path** is displayed there and looks similar to:
```plaintext
"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"
```
-This is the path under `/var/opt/gitlab/git-data/repositories/` on a
-default Omnibus installation.
+To look up a project's hash path using a Rails console:
-In a [Rails console](operations/rails_console.md#starting-a-rails-console-session),
-get this information using either the numeric project ID or the full path:
+1. Start a [Rails console](operations/rails_console.md#starting-a-rails-console-session).
+1. Run a command similar to this example (use either the project's ID or its name):
-```ruby
-Project.find(16).disk_path
-Project.find_by_full_path('group/project').disk_path
-```
+ ```ruby
+ Project.find(16).disk_path
+ Project.find_by_full_path('group/project').disk_path
+ ```
#### From hashed path to project name
-To translate from a hashed storage path to a project name:
+Administrators can look up a project's name from its hashed storage path using a Rails console. To
+look up a project's name from its hashed storage path:
1. Start a [Rails console](operations/rails_console.md#starting-a-rails-console-session).
-1. Run the following:
+1. Run a command similar to this example:
-```ruby
-ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
-```
+ ```ruby
+ ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
+ ```
-The quoted string in that command is the directory tree you can find on your
-GitLab server. For example, on a default Omnibus installation this would be
-`/var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git`
+The quoted string in that command is the directory tree you can find on your GitLab server. For
+example, on a default Omnibus installation this would be `/var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git`
with `.git` from the end of the directory name removed.
-The output includes the project ID and the project name:
+The output includes the project ID and the project name. For example:
```plaintext
=> #<Project id:16 it/supportteam/ticketsystem>
@@ -117,57 +125,61 @@ The output includes the project ID and the project name:
> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/1606) in GitLab 12.1.
-WARNING:
-Do not run `git prune` or `git gc` in pool repositories! This can
-cause data loss in "real" repositories that depend on the pool in
-question.
+Object pools are repositories used to deduplicate forks of public and internal projects and
+contain the objects from the source project. Using `objects/info/alternates`, the source project and
+forks use the object pool for shared objects. For more information, see
+[How Git object deduplication works in GitLab](../development/git_object_deduplication.md).
-Forks of public and internal projects are deduplicated by creating a third repository, the
-object pool, containing the objects from the source project. Using
-`objects/info/alternates`, the source project and forks use the object pool for
-shared objects. Objects are moved from the source project to the object pool
-when housekeeping is run on the source project.
+Objects are moved from the source project to the object pool when housekeeping is run on the source
+project. Object pool repositories are stored similarly to regular repositories:
```ruby
# object pool paths
"@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"
```
-### Hashed storage coverage migration
-
-Files stored in an S3-compatible endpoint do not have the downsides
-mentioned earlier, if they are not prefixed with `#{namespace}/#{project_name}`.
-This is true for CI Cache and LFS Objects.
-
-In the table below, you can find the coverage of the migration to the hashed storage.
-
-| Storable Object | Legacy storage | Hashed storage | S3 Compatible | GitLab Version |
-| --------------- | -------------- | -------------- | ------------- | -------------- |
-| Repository | Yes | Yes | - | 10.0 |
-| Attachments | Yes | Yes | - | 10.2 |
-| Avatars | Yes | No | - | - |
-| Pages | Yes | No | - | - |
-| Docker Registry | Yes | No | - | - |
-| CI Build Logs | No | No | - | - |
-| CI Artifacts | No | No | Yes | 9.4 / 10.6 |
-| CI Cache | No | No | Yes | - |
-| LFS Objects | Yes | Similar | Yes | 10.0 / 10.7 |
-| Repository pools| No | Yes | - | 11.6 |
+WARNING:
+Do not run `git prune` or `git gc` in object pool repositories. This can cause data loss in the
+regular repositories that depend on the object pool.
+
+### Object storage support
+
+This table shows which storable objects are storable in each storage type:
+
+| Storable object | Legacy storage | Hashed storage | S3 compatible | GitLab version |
+|:-----------------|:---------------|:---------------|:--------------|:---------------|
+| Repository | Yes | Yes | - | 10.0 |
+| Attachments | Yes | Yes | - | 10.2 |
+| Avatars | Yes | No | - | - |
+| Pages | Yes | No | - | - |
+| Docker Registry | Yes | No | - | - |
+| CI/CD job logs | No | No | - | - |
+| CI/CD artifacts | No | No | Yes | 9.4 / 10.6 |
+| CI/CD cache | No | No | Yes | - |
+| LFS objects | Yes | Similar | Yes | 10.0 / 10.7 |
+| Repository pools | No | Yes | - | 11.6 |
+
+Files stored in an S3-compatible endpoint can have the same advantages as
+[hashed storage](#hashed-storage), as long as they are not prefixed with
+`#{namespace}/#{project_name}`. This is true for CI/CD cache and LFS objects.
#### Avatars
-Each file is stored in a folder with its `id` from the database. The filename is always `avatar.png` for user avatars.
-When avatar is replaced, `Upload` model is destroyed and a new one takes place with different `id`.
+Each file is stored in a directory that matches the `id` assigned to it in the database. The
+filename is always `avatar.png` for user avatars. When an avatar is replaced, the `Upload` model is
+destroyed and a new one takes place with a different `id`.
+
+#### CI/CD artifacts
-#### CI artifacts
+CI/CD artifacts are:
-CI Artifacts are S3 compatible since **9.4** (GitLab Premium), and available in GitLab Free since
-**10.6**.
+- S3-compatible since GitLab 9.4, initially available in [GitLab Premium](https://about.gitlab.com/pricing/).
+- Available in [GitLab Free](https://about.gitlab.com/pricing/) since GitLab 10.6.
#### LFS objects
[LFS Objects in GitLab](../topics/git/lfs/index.md) implement a similar
-storage pattern using 2 chars, 2 level folders, following Git's own implementation:
+storage pattern using two characters and two-level folders, following Git's own implementation:
```ruby
"shared/lfs-objects/#{oid[0..1}/#{oid[2..3]}/#{oid[4..-1]}"
@@ -176,40 +188,32 @@ storage pattern using 2 chars, 2 level folders, following Git's own implementati
"shared/lfs-objects/89/09/029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c"
```
-LFS objects are also [S3 compatible](lfs/index.md#storing-lfs-objects-in-remote-object-storage).
+LFS objects are also [S3-compatible](lfs/index.md#storing-lfs-objects-in-remote-object-storage).
## Legacy storage
WARNING:
-In GitLab 13.0, hashed storage is enabled by default and the legacy storage is
-deprecated. If you haven't migrated yet, check the
-[migration instructions](raketasks/storage.md#migrate-to-hashed-storage).
-Support for legacy storage is scheduled to be removed in GitLab 14.0. If you're on GitLab
-13.0 and later, switching new projects to legacy storage is not possible.
-The option to choose between hashed and legacy storage in the admin area has
-been disabled.
-
-Legacy storage is the storage behavior prior to version 10.0. For historical
-reasons, GitLab replicated the same mapping structure from the projects URLs:
-
-- Project's repository: `#{namespace}/#{project_name}.git`
-- Project's wiki: `#{namespace}/#{project_name}.wiki.git`
-
-This structure enables you to migrate from existing solutions to GitLab, and
-for Administrators to find where the repository is stored.
-
-This approach also has some drawbacks:
-
-Storage location concentrates a huge number of top-level namespaces. The
-impact can be reduced by the introduction of
-[multiple storage paths](repository_storage_paths.md).
-
-Because backups are a snapshot of the same URL mapping, if you try to recover a
-very old backup, you need to verify whether any project has taken the place of
-an old removed or renamed project sharing the same URL. This means that
-`mygroup/myproject` from your backup may not be the same original project that
-is at that same URL today.
-
-Any change in the URL needs to be reflected on disk (when groups / users or
-projects are renamed). This can add a lot of load in big installations,
-especially if using any type of network based file system.
+In GitLab 13.0, legacy storage is deprecated. If you haven't migrated to hashed storage yet, check
+the [migration instructions](raketasks/storage.md#migrate-to-hashed-storage). Support for legacy
+storage is [scheduled to be removed](https://gitlab.com/gitlab-org/gitaly/-/issues/1690) in GitLab
+14.0. In GitLab 13.0 and later, switching new projects to legacy storage is not possible. The
+option to choose between hashed and legacy storage in the Admin Area is disabled.
+
+Legacy storage was the storage behavior prior to version GitLab 10.0. For historical reasons,
+GitLab replicated the same mapping structure from the projects URLs:
+
+- Project's repository: `#{namespace}/#{project_name}.git`.
+- Project's wiki: `#{namespace}/#{project_name}.wiki.git`.
+
+This structure enabled you to migrate from existing solutions to GitLab, and for Administrators to
+find where the repository was stored. This approach also had some drawbacks:
+
+- Storage location concentrated a large number of top-level namespaces. The impact could be
+ reduced by [multiple repository storage paths](repository_storage_paths.md).
+- Because backups were a snapshot of the same URL mapping, if you tried to recover a very old
+ backup, you needed to verify whether any project had taken the place of an old removed or renamed
+ project sharing the same URL. This meant that `mygroup/myproject` from your backup may not have
+ been the same original project that was at that same URL today.
+- Any change in the URL needed to be reflected on disk (when groups, users, or projects were
+ renamed. This could add a lot of load in big installations, especially if using any type of
+ network-based file system.
diff --git a/doc/administration/server_hooks.md b/doc/administration/server_hooks.md
index 93b899d5146..671da505e56 100644
--- a/doc/administration/server_hooks.md
+++ b/doc/administration/server_hooks.md
@@ -36,7 +36,7 @@ Note the following about server hooks:
- [Webhooks](../user/project/integrations/webhooks.md).
- [GitLab CI/CD](../ci/README.md).
- [Push Rules](../push_rules/push_rules.md), for a user-configurable Git hook
- interface. **(STARTER)**
+ interface.
- Server hooks aren't replicated to [Geo](geo/index.md) secondary nodes.
## Create a server hook for a repository
@@ -51,10 +51,10 @@ repository directory might not exactly match the instructions below. In that cas
Follow the steps below to set up a server-side hook for a repository:
-1. Navigate to **Admin area > Projects** and click on the project you want to add a server hook to.
+1. Go to **Admin area > Projects** and select the project you want to add a server hook to.
1. Locate the **Gitaly relative path** on the page that appears. This is where the server hook
must be implemented. For information on interpreting the relative path, see
- [Translating hashed storage paths](repository_storage_types.md#translating-hashed-storage-paths).
+ [Translate hashed storage paths](repository_storage_types.md#translate-hashed-storage-paths).
1. On the file system, create a new directory in this location called `custom_hooks`.
1. Inside the new `custom_hooks` directory, create a file with a name matching the hook type. For
example, for a pre-receive hook the filename should be `pre-receive` with no extension.
@@ -104,8 +104,6 @@ Now test the hook to check whether it is functioning properly.
## Chained hooks
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-shell/-/merge_requests/93) in GitLab Shell 4.1.0 and GitLab 8.15.
-
Server hooks set [per project](#create-a-server-hook-for-a-repository) or
[globally](#create-a-global-server-hook-for-all-repositories) can be executed in a chain.
@@ -128,7 +126,7 @@ Any other names are ignored.
Files in `.d` directories must be executable and not match the backup file pattern (`*~`).
-For `<project>.git` you need to [translate](repository_storage_types.md#translating-hashed-storage-paths)
+For `<project>.git` you need to [translate](repository_storage_types.md#translate-hashed-storage-paths)
your project name into the hashed storage format that GitLab uses.
## Environment Variables
@@ -158,8 +156,6 @@ them as they can change.
## Custom error messages
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5073) in GitLab 8.10.
-
To have custom error messages appear in the GitLab UI when a commit is declined or an error occurs
during the Git hook, your script should:
diff --git a/doc/administration/static_objects_external_storage.md b/doc/administration/static_objects_external_storage.md
index 0f3dab743e9..fcd2bbc035f 100644
--- a/doc/administration/static_objects_external_storage.md
+++ b/doc/administration/static_objects_external_storage.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Static objects external storage
+# Static objects external storage **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31025) in GitLab 12.3.
@@ -16,7 +16,7 @@ from an external storage, such as a Content Delivery Network (CDN).
To configure external storage for static objects:
-1. Navigate to **Admin Area > Settings > Repository**.
+1. Go to **Admin Area > Settings > Repository**.
1. Expand the **Repository static objects** section.
1. Enter the base URL and an arbitrary token. When you [set up external storage](#set-up-external-storage),
use a script that sets these values as `ORIGIN_HOSTNAME` and `STORAGE_TOKEN`.
diff --git a/doc/administration/terraform_state.md b/doc/administration/terraform_state.md
index 6e5d6b274b6..0f3fdf4bb93 100644
--- a/doc/administration/terraform_state.md
+++ b/doc/administration/terraform_state.md
@@ -20,6 +20,33 @@ These locations can be configured using the options described below.
Use [external object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer-terraform-state-dependency-proxy) configuration for [GitLab Helm chart](https://docs.gitlab.com/charts/) installations.
+## Disabling Terraform state
+
+To disable terraform state site-wide, follow the steps below.
+A GitLab administrator may want to disable Terraform state to reduce diskspace or if Terraform is not used in your instance.
+To do so, follow the steps below according to your installation's type.
+
+**In Omnibus installations:**
+
+1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
+
+ ```ruby
+ gitlab_rails['terraform_state_enabled'] = false
+ ```
+
+1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+
+**In installations from source:**
+
+1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines:
+
+ ```yaml
+ terraform_state:
+ enabled: false
+ ```
+
+1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
+
## Using local storage
The default configuration uses local storage. To change the location where
@@ -121,7 +148,7 @@ See [the available connection settings for different providers](object_storage.m
remote_directory: "terraform" # The bucket name
connection:
provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACESS_KEY_ID
+ aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: eu-central-1
```
diff --git a/doc/administration/troubleshooting/debug.md b/doc/administration/troubleshooting/debug.md
index a6073e34d58..5a8ee1c5c94 100644
--- a/doc/administration/troubleshooting/debug.md
+++ b/doc/administration/troubleshooting/debug.md
@@ -255,7 +255,7 @@ separate Rails process to debug the issue:
### GitLab: API is not accessible
This often occurs when GitLab Shell attempts to request authorization via the
-internal API (e.g., `http://localhost:8080/api/v4/internal/allowed`), and
+[internal API](../../development/internal_api.md) (e.g., `http://localhost:8080/api/v4/internal/allowed`), and
something in the check fails. There are many reasons why this may happen:
1. Timeout connecting to a database (e.g., PostgreSQL or Redis)
@@ -271,8 +271,8 @@ strace -ttTfyyy -s 1024 -p <PID of unicorn worker> -o /tmp/unicorn.txt
```
If you cannot isolate which Unicorn worker is the issue, try to run `strace`
-on all the Unicorn workers to see where the `/internal/allowed` endpoint gets
-stuck:
+on all the Unicorn workers to see where the
+[`/internal/allowed`](../../development/internal_api.md) endpoint gets stuck:
```shell
ps auwx | grep unicorn | awk '{ print " -p " $2}' | xargs strace -ttTfyyy -s 1024 -o /tmp/unicorn.txt
diff --git a/doc/administration/troubleshooting/elasticsearch.md b/doc/administration/troubleshooting/elasticsearch.md
index 0f60c43ef9e..606697b5247 100644
--- a/doc/administration/troubleshooting/elasticsearch.md
+++ b/doc/administration/troubleshooting/elasticsearch.md
@@ -36,7 +36,7 @@ The type of problem will determine what steps to take. The possible troubleshoot
- Indexing.
- Integration.
- Performance.
-- Background Migrations.
+- Advanced Search Migrations.
### Search Results workflow
@@ -148,7 +148,7 @@ graph TD;
F7(Escalate to<br>GitLab support.)
```
-### Background Migrations workflow
+### Advanced Search Migrations workflow
```mermaid
graph TD;
@@ -180,7 +180,7 @@ Most Elasticsearch troubleshooting can be broken down into 4 categories:
- [Troubleshooting indexing](#troubleshooting-indexing)
- [Troubleshooting integration](#troubleshooting-integration)
- [Troubleshooting performance](#troubleshooting-performance)
-- [Troubleshooting background migrations](#troubleshooting-background-migrations)
+- [Troubleshooting Advanced Search migrations](#troubleshooting-advanced-search-migrations)
Generally speaking, if it does not fall into those four categories, it is either:
@@ -294,7 +294,7 @@ Beyond that, you will want to review the error. If it is:
GitLab support.
- An OS issue, you will want to reach out to your systems administrator.
- A `Faraday::TimeoutError (execution expired)` error **and** you're using a proxy,
- [set a custom `gitlab_rails['env']` environment variable, called `no_proxy`](https://docs.gitlab.com/omnibus/settings/environment-variables.html)
+ [set a custom `gitlab_rails['env']` environment variable, called `no_proxy`](https://docs.gitlab.com/omnibus/settings/environment-variables.html)
with the IP address of your Elasticsearch host.
### Troubleshooting performance
@@ -356,15 +356,16 @@ dig further into these.
Feel free to reach out to GitLab support, but this is likely to be something a skilled
Elasticsearch administrator has more experience with.
-### Troubleshooting background migrations
+### Troubleshooting Advanced Search migrations
-Troubleshooting background migration failures can be difficult and may require contacting
-an Elasticsearch administrator or GitLab Support.
+Troubleshooting Advanced Search migration failures can be difficult and may
+require contacting an Elasticsearch administrator or GitLab Support.
-The best place to start while debugging issues with a background migration is the
-[`elasticsearch.log` file](../logs.md#elasticsearchlog). Migrations will
-print information while a migration is in progress and any errors encountered.
-Apply fixes for any errors found in the log and retry the migration.
+The best place to start while debugging issues with an Advanced Search
+migration is the [`elasticsearch.log` file](../logs.md#elasticsearchlog).
+Migrations will log information while a migration is in progress and any
+errors encountered. Apply fixes for any errors found in the log and retry
+the migration.
If you still encounter issues after retrying the migration, reach out to GitLab support.
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 55e707042ba..69eb639a8db 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -1045,6 +1045,67 @@ project = Project.find_by_full_path('<group/project>')
Geo::RepositorySyncService.new(project).execute
```
+### Blob types newer than uploads/artifacts/LFS
+
+- `Packages::PackageFile`
+- `Terraform::StateVersion`
+- `MergeRequestDiff`
+
+`Packages::PackageFile` is used in the following examples, but things generally work the same for the other Blob types.
+
+#### The Replicator
+
+The main kinds of classes are Registry, Model, and Replicator. If you have an instance of one of these classes, you can get the others. The Registry and Model mostly manage PostgreSQL DB state. The Replicator knows how to replicate/verify (or it can call a service to do it):
+
+```ruby
+model_record = Packages::PackageFile.last
+model_record.replicator.registry.replicator.model_record # just showing that these methods exist
+```
+
+#### Replicate a package file, synchronously, given an ID
+
+```ruby
+model_record = Packages::PackageFile.find(id)
+model_record.replicator.send(:download)
+```
+
+#### Replicate a package file, synchronously, given a registry ID
+
+```ruby
+registry = Geo::PackageFileRegistry.find(registry_id)
+registry.replicator.send(:download)
+```
+
+### Repository types newer than project/wiki repositories
+
+- `SnippetRepository`
+- `GroupWikiRepository`
+
+`SnippetRepository` is used in the examples below, but things generally work the same for the other Repository types.
+
+#### The Replicator
+
+The main kinds of classes are Registry, Model, and Replicator. If you have an instance of one of these classes, you can get the others. The Registry and Model mostly manage PostgreSQL DB state. The Replicator knows how to replicate/verify (or it can call a service to do it).
+
+```ruby
+model_record = SnippetRepository.last
+model_record.replicator.registry.replicator.model_record # just showing that these methods exist
+```
+
+#### Replicate a snippet repository, synchronously, given an ID
+
+```ruby
+model_record = SnippetRepository.find(id)
+model_record.replicator.send(:sync_repository)
+```
+
+#### Replicate a snippet repository, synchronously, given a registry ID
+
+```ruby
+registry = Geo::SnippetRepositoryRegistry.find(registry_id)
+registry.replicator.send(:sync_repository)
+```
+
### Generate usage ping
#### Generate or get the cached usage ping
diff --git a/doc/administration/troubleshooting/log_parsing.md b/doc/administration/troubleshooting/log_parsing.md
index 25300d036ed..2900ce58940 100644
--- a/doc/administration/troubleshooting/log_parsing.md
+++ b/doc/administration/troubleshooting/log_parsing.md
@@ -41,6 +41,20 @@ jq -cR 'fromjson?' file.json | jq <COMMAND>
By default `jq` will error out when it encounters a line that is not valid JSON.
This skips over all invalid lines and parses the rest.
+#### Print a JSON log's time range
+
+```shell
+cat log.json | (head -1; tail -1) | jq '.time'
+```
+
+Use `zcat` if the file has been rotated and compressed:
+
+```shell
+zcat @400000006026b71d1a7af804.s | (head -1; tail -1) | jq '.time'
+
+zcat some_json.log.25.gz | (head -1; tail -1) | jq '.time'
+```
+
### Parsing `production_json.log` and `api_json.log`
#### Find all requests with a 5XX status code
diff --git a/doc/administration/uploads.md b/doc/administration/uploads.md
index d3a9777775f..949687cfa0a 100644
--- a/doc/administration/uploads.md
+++ b/doc/administration/uploads.md
@@ -146,7 +146,7 @@ _The uploads are stored by default in
remote_directory: "uploads" # The bucket name
connection:
provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACESS_KEY_ID
+ aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: eu-central-1
```
diff --git a/doc/api/README.md b/doc/api/README.md
index d6119fbfa43..35eeb5ae99b 100644
--- a/doc/api/README.md
+++ b/doc/api/README.md
@@ -21,6 +21,10 @@ Contributions are welcome.
For a list of the available resources and their endpoints, see
[API resources](api_resources.md).
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an introduction and basic steps, see
+[How to make GitLab API calls](https://www.youtube.com/watch?v=0LsMC3ZiXkA).
+
## SCIM **(PREMIUM SAAS)**
GitLab provides an [SCIM API](scim.md) that both implements
@@ -200,17 +204,11 @@ With a few API endpoints you can use a [GitLab CI/CD job token](../user/project/
to authenticate with the API:
- Packages:
- - [Package Registry for Composer](../user/packages/composer_repository/index.md)
- - [Package Registry for Conan](../user/packages/conan_repository/index.md)
+ - [Package Registry](../user/packages/package_registry/index.md)
- [Container Registry](../user/packages/container_registry/index.md)
(`$CI_REGISTRY_PASSWORD` is `$CI_JOB_TOKEN`)
- - [Go Proxy](../user/packages/go_proxy/index.md)
- - [Package Registry for Maven](../user/packages/maven_repository/index.md#authenticate-with-a-ci-job-token-in-maven)
- - [Package Registry for npm](../user/packages/npm_registry/index.md#authenticate-with-a-ci-job-token)
- - [Package Registry for NuGet](../user/packages/nuget_repository/index.md)
- - [Package Registry for PyPI](../user/packages/pypi_repository/index.md#authenticate-with-a-ci-job-token)
- - [Package Registry for generic packages](../user/packages/generic_packages/index.md#publish-a-generic-package-by-using-cicd)
- [Get job artifacts](job_artifacts.md#get-job-artifacts)
+- [Get job token's job](jobs.md#get-job-tokens-job)
- [Pipeline triggers](pipeline_triggers.md) (using the `token=` parameter)
- [Release creation](releases/index.md#create-a-release)
- [Terraform plan](../user/infrastructure/index.md)
@@ -750,7 +748,7 @@ specifically used by GitLab.com, see
The GitLab API supports the `application/json` content type by default, though
some API endpoints also support `text/plain`.
-In [GitLab 13.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
+In [GitLab 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
API endpoints do not support `text/plain` by default, unless it's explicitly documented.
This change is deployed behind the `:api_always_use_application_json` [feature flag](../user/feature_flags.md),
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index ebe856715a6..b14d28d6ec0 100644
--- a/doc/api/api_resources.md
+++ b/doc/api/api_resources.md
@@ -146,6 +146,7 @@ The following API resources are available outside of project and group contexts
| [Instance clusters](instance_clusters.md) | `/admin/clusters` |
| [Issues](issues.md) | `/issues` (also available for groups and projects) |
| [Issues Statistics](issues_statistics.md) | `/issues_statistics` (also available for groups and projects) |
+| [Jobs](jobs.md) | `/job` |
| [Keys](keys.md) | `/keys` |
| [License](license.md) **(FREE SELF)** | `/license` |
| [Markdown](markdown.md) | `/markdown` |
@@ -154,6 +155,7 @@ The following API resources are available outside of project and group contexts
| [Namespaces](namespaces.md) | `/namespaces` |
| [Notification settings](notification_settings.md) | `/notification_settings` (also available for groups and projects) |
| [Pages domains](pages_domains.md) | `/pages/domains` (also available for projects) |
+| [Plan limits](plan_limits.md) | `/application/plan_limits` |
| [Personal access tokens](personal_access_tokens.md) | `/personal_access_tokens` |
| [Projects](projects.md) | `/users/:id/projects` (also available for projects) |
| [Project repository storage moves](project_repository_storage_moves.md) **(FREE SELF)** | `/project_repository_storage_moves` |
diff --git a/doc/api/audit_events.md b/doc/api/audit_events.md
index 78bf292a3d7..93fefe50d9e 100644
--- a/doc/api/audit_events.md
+++ b/doc/api/audit_events.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Audit Events API
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/121) in GitLab 12.4.
+
## Instance Audit Events **(PREMIUM SELF)**
The Audit Events API allows you to retrieve [instance audit events](../administration/audit_events.md#instance-events).
diff --git a/doc/api/avatar.md b/doc/api/avatar.md
index 14fdc5e8afd..5d50fac86f0 100644
--- a/doc/api/avatar.md
+++ b/doc/api/avatar.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Get a single avatar URL
-Get a single [avatar](../user/profile/index.md#user-settings) URL for a user with the given email address.
+Get a single [avatar](../user/profile/index.md#access-your-user-settings) URL for a user with the given email address.
If:
diff --git a/doc/api/branches.md b/doc/api/branches.md
index e9e27a358f0..2fb9997bdca 100644
--- a/doc/api/branches.md
+++ b/doc/api/branches.md
@@ -210,10 +210,10 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
## Delete merged branches
-Will delete all branches that are merged into the project's default branch.
+Deletes all branches that are merged into the project's default branch.
NOTE:
-[Protected branches](../user/project/protected_branches.md) will not be deleted as part of this operation.
+[Protected branches](../user/project/protected_branches.md) are not deleted as part of this operation.
```plaintext
DELETE /projects/:id/repository/merged_branches
diff --git a/doc/api/commits.md b/doc/api/commits.md
index f4896f75c93..117f949aba0 100644
--- a/doc/api/commits.md
+++ b/doc/api/commits.md
@@ -21,11 +21,11 @@ GET /projects/:id/repository/commits
| --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
| `ref_name` | string | no | The name of a repository branch, tag or revision range, or if not given the default branch |
-| `since` | string | no | Only commits after or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ |
-| `until` | string | no | Only commits before or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ |
+| `since` | string | no | Only commits after or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` |
+| `until` | string | no | Only commits before or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` |
| `path` | string | no | The file path |
| `all` | boolean | no | Retrieve every commit from the repository |
-| `with_stats` | boolean | no | Stats about each commit will be added to the response |
+| `with_stats` | boolean | no | Stats about each commit are added to the response |
| `first_parent` | boolean | no | Follow only the first parent commit upon seeing a merge commit |
| `order` | string | no | List commits in order. Possible values: `default`, [`topo`](https://git-scm.com/docs/git-log#Documentation/git-log.txt---topo-order). Defaults to `default`, the commits are shown in reverse chronological order. |
@@ -101,9 +101,9 @@ POST /projects/:id/repository/commits
| `action` | string | yes | The action to perform, `create`, `delete`, `move`, `update`, `chmod`|
| `file_path` | string | yes | Full path to the file. Ex. `lib/class.rb` |
| `previous_path` | string | no | Original full path to the file being moved. Ex. `lib/class1.rb`. Only considered for `move` action. |
-| `content` | string | no | File content, required for all except `delete`, `chmod`, and `move`. Move actions that do not specify `content` will preserve the existing file content, and any other value of `content` will overwrite the file content. |
+| `content` | string | no | File content, required for all except `delete`, `chmod`, and `move`. Move actions that do not specify `content` preserve the existing file content, and any other value of `content` overwrites the file content. |
| `encoding` | string | no | `text` or `base64`. `text` is default. |
-| `last_commit_id` | string | no | Last known file commit ID. Will be only considered in update, move, and delete actions. |
+| `last_commit_id` | string | no | Last known file commit ID. Only considered in update, move, and delete actions. |
| `execute_filemode` | boolean | no | When `true/false` enables/disables the execute flag on the file. Only considered for `chmod` action. |
```shell
@@ -333,7 +333,7 @@ Example response:
}
```
-In the event of a failed cherry-pick, the response will provide context about
+In the event of a failed cherry-pick, the response provides context about
why:
```json
@@ -348,9 +348,9 @@ indicates that the commit already exists in the target branch. The other
possible error code is `conflict`, which indicates that there was a merge
conflict.
-When `dry_run` is enabled, the server will attempt to apply the cherry-pick _but
+When `dry_run` is enabled, the server attempts to apply the cherry-pick _but
not actually commit any resulting changes_. If the cherry-pick applies cleanly,
-the API will respond with `200 OK`:
+the API responds with `200 OK`:
```json
{
@@ -358,7 +358,7 @@ the API will respond with `200 OK`:
}
```
-In the event of a failure, you'll see an error identical to a failure without
+In the event of a failure, an error displays that is identical to a failure without
dry run.
## Revert a commit
@@ -404,7 +404,7 @@ Example response:
}
```
-In the event of a failed revert, the response will provide context about why:
+In the event of a failed revert, the response provides context about why:
```json
{
@@ -417,9 +417,9 @@ In this case, the revert failed because the attempted revert generated a merge
conflict. The other possible error code is `empty`, which indicates that the
changeset was empty, likely due to the change having already been reverted.
-When `dry_run` is enabled, the server will attempt to apply the revert _but not
+When `dry_run` is enabled, the server attempts to apply the revert _but not
actually commit any resulting changes_. If the revert applies cleanly, the API
-will respond with `200 OK`:
+responds with `200 OK`:
```json
{
@@ -427,7 +427,7 @@ will respond with `200 OK`:
}
```
-In the event of a failure, you'll see an error identical to a failure without
+In the event of a failure, an error displays that is identical to a failure without
dry run.
## Get the diff of a commit
@@ -511,7 +511,7 @@ In order to post a comment in a particular line of a particular file, you must
specify the full commit SHA, the `path`, the `line` and `line_type` should be
`new`.
-The comment will be added at the end of the last commit if at least one of the
+The comment is added at the end of the last commit if at least one of the
cases below is valid:
- the `sha` is instead a branch or a tag and the `line` or `path` are invalid
diff --git a/doc/api/deployments.md b/doc/api/deployments.md
index b8865ecc614..32d3ab55f9f 100644
--- a/doc/api/deployments.md
+++ b/doc/api/deployments.md
@@ -22,7 +22,7 @@ GET /projects/:id/deployments
| `sort` | string | no | Return deployments sorted in `asc` or `desc` order. Default is `asc` |
| `updated_after` | datetime | no | Return deployments updated after the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `updated_before` | datetime | no | Return deployments updated before the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
-| `environment` | string | no | The [name of the environment](../ci/environments/index.md#defining-environments) to filter deployments by |
+| `environment` | string | no | The [name of the environment](../ci/environments/index.md) to filter deployments by |
| `status` | string | no | The status to filter deployments by |
The status attribute can be one of the following values:
@@ -281,7 +281,7 @@ POST /projects/:id/deployments
| Attribute | Type | Required | Description |
|---------------|----------------|----------|-----------------------------------------------------------------------------------------------------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
-| `environment` | string | yes | The [name of the environment](../ci/environments/index.md#defining-environments) to create the deployment for |
+| `environment` | string | yes | The [name of the environment](../ci/environments/index.md) to create the deployment for |
| `sha` | string | yes | The SHA of the commit that is deployed |
| `ref` | string | yes | The name of the branch or tag that is deployed |
| `tag` | boolean | yes | A boolean that indicates if the deployed ref is a tag (true) or not (false) |
diff --git a/doc/api/discussions.md b/doc/api/discussions.md
index d88d4780e65..6d0c5afa35d 100644
--- a/doc/api/discussions.md
+++ b/doc/api/discussions.md
@@ -15,7 +15,7 @@ Discussions are a set of related notes on:
- Merge requests
- Commits
-This includes system notes, which are notes about changes to the object (for example, when a milestone changes, there will be a corresponding system note). Label notes are not part of this API, but recorded as separate events in [resource label events](resource_label_events.md).
+This includes system notes, which are notes about changes to the object (for example, when a milestone changes, a corresponding system note is added). Label notes are not part of this API, but recorded as separate events in [resource label events](resource_label_events.md).
## Discussions pagination
@@ -839,7 +839,7 @@ a note but other comments (replies) can be added to it later.
POST /projects/:id/merge_requests/:merge_request_iid/discussions
```
-Parameters:
+Parameters for all comments:
| Attribute | Type | Required | Description |
| ---------------------------------------- | -------------- | -------- | ----------- |
@@ -852,27 +852,43 @@ Parameters:
| `position[base_sha]` | string | yes | Base commit SHA in the source branch |
| `position[start_sha]` | string | yes | SHA referencing commit in target branch |
| `position[head_sha]` | string | yes | SHA referencing HEAD of this merge request |
-| `position[position_type]` | string | yes | Type of the position reference', allowed values: 'text' or 'image' |
+| `position[position_type]` | string | yes | Type of the position reference', allowed values: `text` or `image` |
| `position[new_path]` | string | no | File path after change |
-| `position[new_line]` | integer | no | Line number after change (for 'text' diff notes) |
+| `position[new_line]` | integer | no | Line number after change (for `text` diff notes) |
| `position[old_path]` | string | no | File path before change |
-| `position[old_line]` | integer | no | Line number before change (for 'text' diff notes) |
+| `position[old_line]` | integer | no | Line number before change (for `text` diff notes) |
| `position[line_range]` | hash | no | Line range for a multi-line diff note |
-| `position[line_range][start]` | hash | no | Multiline note starting line |
-| `position[line_range][start][line_code]` | string | yes | Line code for the start line |
-| `position[line_range][start][type]` | string | yes | Line type for the start line |
-| `position[line_range][end]` | hash | no | Multiline note ending line |
-| `position[line_range][end][line_code]` | string | yes | Line code for the end line |
-| `position[line_range][end][type]` | string | yes | Line type for the end line |
-| `position[width]` | integer | no | Width of the image (for 'image' diff notes) |
-| `position[height]` | integer | no | Height of the image (for 'image' diff notes) |
-| `position[x]` | integer | no | X coordinate (for 'image' diff notes) |
-| `position[y]` | integer | no | Y coordinate (for 'image' diff notes) |
+| `position[width]` | integer | no | Width of the image (for `image` diff notes) |
+| `position[height]` | integer | no | Height of the image (for `image` diff notes) |
+| `position[x]` | integer | no | X coordinate (for `image` diff notes) |
+| `position[y]` | integer | no | Y coordinate (for `image` diff notes) |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/11/discussions?body=comment"
```
+Parameters for multiline comments only:
+
+| Attribute | Type | Required | Description |
+| ---------------------------------------- | -------------- | -------- | ----------- |
+| `position[line_range][start]` | hash | no | Multiline note starting line |
+| `position[line_range][start][line_code]` | string | yes | [Line code](#line-code) for the start line |
+| `position[line_range][start][type]` | string | yes | Use `new` for lines added by this commit, otherwise `old`. |
+| `position[line_range][end]` | hash | no | Multiline note ending line |
+| `position[line_range][end][line_code]` | string | yes | [Line code](#line-code) for the end line |
+| `position[line_range][end][type]` | string | yes | Use `new` for lines added by this commit, otherwise `old`. |
+
+#### Line code
+
+A line code is of the form `<SHA>_<old>_<new>`:
+
+- `<SHA>` is the SHA1 hash of the filename.
+- `<old>` is the line number before the change.
+- `<new>` is the line number after the change.
+
+For example, when commenting on an added line number 5, the line code
+looks like `adc83b19e793491b1c6ea0fd8b46cd9f32e292fc_5_5`.
+
### Resolve a merge request thread
Resolve/unresolve whole thread of a merge request.
@@ -1152,15 +1168,15 @@ Parameters:
| `position[base_sha]` | string | yes | Base commit SHA in the source branch |
| `position[start_sha]` | string | yes | SHA referencing commit in target branch |
| `position[head_sha]` | string | yes | SHA referencing HEAD of this commit |
-| `position[position_type]` | string | yes | Type of the position reference', allowed values: 'text' or 'image' |
+| `position[position_type]` | string | yes | Type of the position reference', allowed values: `text` or `image` |
| `position[new_path]` | string | no | File path after change |
| `position[new_line]` | integer | no | Line number after change |
| `position[old_path]` | string | no | File path before change |
| `position[old_line]` | integer | no | Line number before change |
-| `position[width]` | integer | no | Width of the image (for 'image' diff notes) |
-| `position[height]` | integer | no | Height of the image (for 'image' diff notes) |
-| `position[x]` | integer | no | X coordinate (for 'image' diff notes) |
-| `position[y]` | integer | no | Y coordinate (for 'image' diff notes) |
+| `position[width]` | integer | no | Width of the image (for `image` diff notes) |
+| `position[height]` | integer | no | Height of the image (for `image` diff notes) |
+| `position[x]` | integer | no | X coordinate (for `image` diff notes) |
+| `position[y]` | integer | no | Y coordinate (for `image` diff notes) |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/commits/11/discussions?body=comment"
diff --git a/doc/api/dora4_group_analytics.md b/doc/api/dora4_group_analytics.md
index 7a7260f40e8..7504d18a5de 100644
--- a/doc/api/dora4_group_analytics.md
+++ b/doc/api/dora4_group_analytics.md
@@ -5,13 +5,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, api
---
-# DORA4 Analytics Group API **(ULTIMATE ONLY)**
+# DORA4 Analytics Group API **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291747) in GitLab 13.9.
> - It's [deployed behind a feature flag](../user/feature_flags.md), disabled by default.
> - It's disabled on GitLab.com.
> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-dora4-analytics-group-api). **(ULTIMATE ONLY)**
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-dora4-analytics-group-api). **(ULTIMATE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -64,7 +64,7 @@ Example response:
]
```
-## Enable or disable DORA4 Analytics Group API **(ULTIMATE ONLY)**
+## Enable or disable DORA4 Analytics Group API **(ULTIMATE SELF)**
DORA4 Analytics Group API is under development and not ready for production use. It is
deployed behind a feature flag that is **disabled by default**.
diff --git a/doc/api/dora4_project_analytics.md b/doc/api/dora4_project_analytics.md
index a1becb056bf..43250d88701 100644
--- a/doc/api/dora4_project_analytics.md
+++ b/doc/api/dora4_project_analytics.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, api
---
-# DORA4 Analytics Project API **(ULTIMATE ONLY)**
+# DORA4 Analytics Project API **(ULTIMATE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/279039) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.7.
diff --git a/doc/api/feature_flags.md b/doc/api/feature_flags.md
index 77d30475555..59f20e66ae8 100644
--- a/doc/api/feature_flags.md
+++ b/doc/api/feature_flags.md
@@ -149,7 +149,7 @@ POST /projects/:id/feature_flags
| `description` | string | no | The description of the feature flag. |
| `active` | boolean | no | The active state of the flag. Defaults to true. [Supported](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38350) in GitLab 13.3 and later. |
| `strategies` | JSON | no | The feature flag [strategies](../operations/feature_flags.md#feature-flag-strategies). |
-| `strategies:name` | JSON | no | The strategy name. Can be `default`, `gradualRolloutUserId`, `userWithId`, or `gitlabUserList`. In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/36380) and later, can be [`flexibleRollout`](https://unleash.github.io/docs/activation_strategy#flexiblerollout). |
+| `strategies:name` | JSON | no | The strategy name. Can be `default`, `gradualRolloutUserId`, `userWithId`, or `gitlabUserList`. In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/36380) and later, can be [`flexibleRollout`](https://docs.getunleash.io/docs/activation_strategy#flexiblerollout). |
| `strategies:parameters` | JSON | no | The strategy parameters. |
| `strategies:scopes` | JSON | no | The scopes for the strategy. |
| `strategies:scopes:environment_scope` | string | no | The environment spec for the scope. |
diff --git a/doc/api/geo_nodes.md b/doc/api/geo_nodes.md
index a2417af5285..0401680b016 100644
--- a/doc/api/geo_nodes.md
+++ b/doc/api/geo_nodes.md
@@ -383,7 +383,12 @@ Example response:
"snippet_repositories_checksum_failed_count": 0,
"snippet_repositories_registry_count": 10,
"snippet_repositories_synced_count": 6,
- "snippet_repositories_failed_count": 3
+ "snippet_repositories_failed_count": 3,
+ "group_wiki_repositories_checksummed_count": 10,
+ "group_wiki_repositories_checksum_failed_count": 0,
+ "group_wiki_repositories_registry_count": 10,
+ "group_wiki_repositories_synced_count": 6,
+ "group_wiki_repositories_failed_count": 3
},
{
"geo_node_id": 2,
@@ -477,7 +482,12 @@ Example response:
"snippet_repositories_checksum_failed_count": 0,
"snippet_repositories_registry_count": 10,
"snippet_repositories_synced_count": 6,
- "snippet_repositories_failed_count": 3
+ "snippet_repositories_failed_count": 3,
+ "group_wiki_repositories_checksummed_count": 10,
+ "group_wiki_repositories_checksum_failed_count": 0,
+ "group_wiki_repositories_registry_count": 10,
+ "group_wiki_repositories_synced_count": 6,
+ "group_wiki_repositories_failed_count": 3
}
]
```
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 7a68b1cdf16..7bbc2029d96 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -65,27 +65,49 @@ There are no plans to deprecate the REST API. To reduce the technical burden of
supporting two APIs in parallel, they should share implementations as much as
possible.
-### Deprecation process
+## Breaking changes
-Fields marked for removal from the GitLab GraphQL API are first **deprecated** but still available
-for at least six releases, and then **removed entirely**.
-Removals occur at X.0 and X.6 releases.
+The GitLab GraphQL API is [versionless](https://graphql.org/learn/best-practices/#versioning) and
+changes are made to the API in a way that maintains backwards-compatibility.
-For example, a field can be marked as deprecated (but still usable) in %12.7, but can be used until its removal in %13.6.
-When marked as deprecated, an alternative should be provided if there is one.
-That gives consumers of the GraphQL API a minimum of six months to update their GraphQL queries.
+Occassionally GitLab needs to change the GraphQL API in a way that is not backwards-compatible.
+These changes include the removal or renaming of fields, arguments or other parts of the schema.
-The process is as follows:
+In these situations, GitLab follows a [Deprecation and removal process](#deprecation-and-removal-process)
+where the deprecated part of the schema is supported for a period of time before being removed.
-1. The field is listed as deprecated in [GraphQL API Reference](reference/index.md).
-1. Removals are announced at least one release prior in the Deprecation Warnings section of the
- release post (at or prior to X.11 and X.5 releases).
-1. Fields meeting criteria are removed in X.0 or X.6.
+Clients should familiarize themselves with the process to avoid breaking changes affecting their integrations.
NOTE:
Fields behind a feature flag and disabled by default are exempt from the deprecation process,
and can be removed at any time without notice.
+### Deprecation and Removal process
+
+Parts of the schema marked for removal from the GitLab GraphQL API are first **deprecated** but still available
+for at least six releases, and then **removed entirely**.
+Removals occur at `X.0` and `X.6` releases.
+
+The process is as follows:
+
+1. The item is marked as deprecated in the schema. It will be displayed as deprecated in the
+ [GraphQL API Reference](reference/index.md) and in introspection queries.
+1. Removals are announced at least one release prior in the [Deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations)
+ section of the release post (at or prior to `X.11` and `X.5` releases).
+ release post (at or prior to `X.11` and `X.5` releases).
+1. Items meeting criteria are removed in `X.0` or `X.6` and added to:
+
+ - The [Removals](https://about.gitlab.com/handbook/marketing/blog/release-posts/#removals) section of the Release Post.
+ - The [Removed items page](removed_items.md).
+
+This gives consumers of the GraphQL API a minimum of six months to update their GraphQL queries.
+
+When an item is deprecated or removed, an alternative is provided if available.
+
+**Example:**
+
+A field marked as deprecated in `12.7` can be used until its removal in `13.6`.
+
### List of removed items
View the [fields, enums, and other items we removed](removed_items.md) from the GraphQL API.
@@ -147,6 +169,7 @@ In general, each field in a query will add `1` to the complexity score, although
this can be higher or lower for particular fields. Sometimes the addition of
certain arguments may also increase the complexity of a query.
+NOTE:
The complexity limits may be revised in future, and additionally, the complexity
of a query may be altered.
@@ -160,11 +183,6 @@ The GitLab GraphQL reference [is available](reference/index.md).
It is automatically generated from the GitLab GraphQL schema and embedded in a Markdown file.
-Machine-readable versions are also available:
-
-- [JSON format](reference/gitlab_schema.json)
-- [IDL format](reference/gitlab_schema.graphql)
-
## Generate updates for documentation
If you've changed the GraphQL schema, you should set up an MR to gain approval of your changes.
diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql
deleted file mode 100644
index 4e89f663efc..00000000000
--- a/doc/api/graphql/reference/gitlab_schema.graphql
+++ /dev/null
@@ -1,29539 +0,0 @@
-"""
-Represents the access level of a relationship between a User and object that it is related to
-"""
-type AccessLevel {
- """
- Integer representation of access level.
- """
- integerValue: Int
-
- """
- String representation of access level.
- """
- stringValue: AccessLevelEnum
-}
-
-"""
-Access level to a resource
-"""
-enum AccessLevelEnum {
- DEVELOPER
- GUEST
- MAINTAINER
- NO_ACCESS
- OWNER
- REPORTER
-}
-
-"""
-Autogenerated input type of AddAwardEmoji
-"""
-input AddAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AddAwardEmoji
-"""
-type AddAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of AddProjectToSecurityDashboard
-"""
-input AddProjectToSecurityDashboardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the project to be added to Instance Security Dashboard.
- """
- id: ProjectID!
-}
-
-"""
-Autogenerated return type of AddProjectToSecurityDashboard
-"""
-type AddProjectToSecurityDashboardPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Project that was added to the Instance Security Dashboard.
- """
- project: Project
-}
-
-"""
-Autogenerated input type of AdminSidekiqQueuesDeleteJobs
-"""
-input AdminSidekiqQueuesDeleteJobsInput {
- """
- Delete jobs matching caller_id in the context metadata
- """
- callerId: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Delete jobs matching feature_category in the context metadata
- """
- featureCategory: String
-
- """
- Delete jobs matching project in the context metadata
- """
- project: String
-
- """
- The name of the queue to delete jobs from.
- """
- queueName: String!
-
- """
- Delete jobs matching related_class in the context metadata
- """
- relatedClass: String
-
- """
- Delete jobs matching remote_ip in the context metadata
- """
- remoteIp: String
-
- """
- Delete jobs matching root_namespace in the context metadata
- """
- rootNamespace: String
-
- """
- Delete jobs matching subscription_plan in the context metadata
- """
- subscriptionPlan: String
-
- """
- Delete jobs matching user in the context metadata
- """
- user: String
-}
-
-"""
-Autogenerated return type of AdminSidekiqQueuesDeleteJobs
-"""
-type AdminSidekiqQueuesDeleteJobsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Information about the status of the deletion request.
- """
- result: DeleteJobsResponse
-}
-
-"""
-Describes an alert from the project's Alert Management
-"""
-type AlertManagementAlert implements Noteable {
- """
- Assignees of the alert.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Timestamp the alert was created.
- """
- createdAt: Time
-
- """
- Description of the alert.
- """
- description: String
-
- """
- Alert details.
- """
- details: JSON
-
- """
- The URL of the alert detail page.
- """
- detailsUrl: String!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Timestamp the alert ended.
- """
- endedAt: Time
-
- """
- Environment for the alert.
- """
- environment: Environment
-
- """
- Number of events of this alert.
- """
- eventCount: Int
-
- """
- List of hosts the alert came from.
- """
- hosts: [String!]
-
- """
- Internal ID of the alert.
- """
- iid: ID!
-
- """
- Internal ID of the GitLab issue attached to the alert.
- """
- issueIid: ID
-
- """
- URL for metrics embed for the alert.
- """
- metricsDashboardUrl: String
-
- """
- Monitoring tool the alert came from.
- """
- monitoringTool: String
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The alert condition for Prometheus.
- """
- prometheusAlert: PrometheusAlert
-
- """
- Runbook for the alert as defined in alert details.
- """
- runbook: String
-
- """
- Service the alert came from.
- """
- service: String
-
- """
- Severity of the alert.
- """
- severity: AlertManagementSeverity
-
- """
- Timestamp the alert was raised.
- """
- startedAt: Time
-
- """
- Status of the alert.
- """
- status: AlertManagementStatus
-
- """
- Title of the alert.
- """
- title: String
-
- """
- To-do items of the current user for the alert.
- """
- todos(
- """
- The action to be filtered.
- """
- action: [TodoActionEnum!]
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: [ID!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The ID of a group.
- """
- groupId: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: [ID!]
-
- """
- The state of the todo.
- """
- state: [TodoStateEnum!]
-
- """
- The type of the todo.
- """
- type: [TodoTargetEnum!]
- ): TodoConnection
-
- """
- Timestamp the alert was last updated.
- """
- updatedAt: Time
-}
-
-"""
-The connection type for AlertManagementAlert.
-"""
-type AlertManagementAlertConnection {
- """
- A list of edges.
- """
- edges: [AlertManagementAlertEdge]
-
- """
- A list of nodes.
- """
- nodes: [AlertManagementAlert]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AlertManagementAlertEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AlertManagementAlert
-}
-
-"""
-Values for sorting alerts
-"""
-enum AlertManagementAlertSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Created time by ascending order
- """
- CREATED_TIME_ASC
-
- """
- Created time by descending order
- """
- CREATED_TIME_DESC
-
- """
- End time by ascending order
- """
- ENDED_AT_ASC
-
- """
- End time by descending order
- """
- ENDED_AT_DESC
-
- """
- Events count by ascending order
- """
- EVENT_COUNT_ASC
-
- """
- Events count by descending order
- """
- EVENT_COUNT_DESC
-
- """
- Severity from less critical to more critical
- """
- SEVERITY_ASC
-
- """
- Severity from more critical to less critical
- """
- SEVERITY_DESC
-
- """
- Start time by ascending order
- """
- STARTED_AT_ASC
-
- """
- Start time by descending order
- """
- STARTED_AT_DESC
-
- """
- Status by order: Ignored > Resolved > Acknowledged > Triggered
- """
- STATUS_ASC
-
- """
- Status by order: Triggered > Acknowledged > Resolved > Ignored
- """
- STATUS_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created time by ascending order
- """
- UPDATED_TIME_ASC
-
- """
- Created time by descending order
- """
- UPDATED_TIME_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-Represents total number of alerts for the represented categories
-"""
-type AlertManagementAlertStatusCountsType {
- """
- Number of alerts with status ACKNOWLEDGED for the project
- """
- acknowledged: Int
-
- """
- Total number of alerts for the project.
- """
- all: Int
-
- """
- Number of alerts with status IGNORED for the project
- """
- ignored: Int
-
- """
- Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project.
- """
- open: Int
-
- """
- Number of alerts with status RESOLVED for the project
- """
- resolved: Int
-
- """
- Number of alerts with status TRIGGERED for the project
- """
- triggered: Int
-}
-
-"""
-Filters the alerts based on given domain
-"""
-enum AlertManagementDomainFilter {
- """
- Alerts for operations domain
- """
- operations
-
- """
- Alerts for threat monitoring domain
- """
- threat_monitoring
-}
-
-"""
-An endpoint and credentials used to accept alerts for a project
-"""
-type AlertManagementHttpIntegration implements AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-Identifier of AlertManagement::HttpIntegration.
-"""
-scalar AlertManagementHttpIntegrationID
-
-interface AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-The connection type for AlertManagementIntegration.
-"""
-type AlertManagementIntegrationConnection {
- """
- A list of edges.
- """
- edges: [AlertManagementIntegrationEdge]
-
- """
- A list of nodes.
- """
- nodes: [AlertManagementIntegration]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AlertManagementIntegrationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AlertManagementIntegration
-}
-
-"""
-Values of types of integrations
-"""
-enum AlertManagementIntegrationType {
- """
- Integration with any monitoring tool
- """
- HTTP
-
- """
- Prometheus integration
- """
- PROMETHEUS
-}
-
-"""
-Parsed field from an alert used for custom mappings
-"""
-type AlertManagementPayloadAlertField {
- """
- Human-readable label of the payload path.
- """
- label: String
-
- """
- Path to value inside payload JSON.
- """
- path: [String!]
-
- """
- Type of the parsed value.
- """
- type: AlertManagementPayloadAlertFieldType
-}
-
-"""
-Field that are available while modifying the custom mapping attributes for an HTTP integration
-"""
-input AlertManagementPayloadAlertFieldInput {
- """
- A GitLab alert field name.
- """
- fieldName: AlertManagementPayloadAlertFieldName!
-
- """
- Human-readable label of the payload path.
- """
- label: String
-
- """
- Path to value inside payload JSON.
- """
- path: [String!]!
-
- """
- Type of the parsed value.
- """
- type: AlertManagementPayloadAlertFieldType!
-}
-
-"""
-Values for alert field names used in the custom mapping
-"""
-enum AlertManagementPayloadAlertFieldName {
- """
- A high-level summary of the problem.
- """
- DESCRIPTION
-
- """
- The resolved time of the incident.
- """
- END_TIME
-
- """
- The unique identifier of the alert. This can be used to group occurrences of the same alert.
- """
- FINGERPRINT
-
- """
- The name of the associated GitLab environment.
- """
- GITLAB_ENVIRONMENT_NAME
-
- """
- One or more hosts, as to where this incident occurred.
- """
- HOSTS
-
- """
- The name of the associated monitoring tool.
- """
- MONITORING_TOOL
-
- """
- The affected service.
- """
- SERVICE
-
- """
- The severity of the alert.
- """
- SEVERITY
-
- """
- The time of the incident.
- """
- START_TIME
-
- """
- The title of the incident.
- """
- TITLE
-}
-
-"""
-Values for alert field types used in the custom mapping
-"""
-enum AlertManagementPayloadAlertFieldType {
- """
- Array field type
- """
- ARRAY
-
- """
- DateTime field type
- """
- DATETIME
-
- """
- String field type
- """
- STRING
-}
-
-"""
-An endpoint and credentials used to accept Prometheus alerts for a project
-"""
-type AlertManagementPrometheusIntegration implements AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-Alert severity values
-"""
-enum AlertManagementSeverity {
- """
- Critical severity
- """
- CRITICAL
-
- """
- High severity
- """
- HIGH
-
- """
- Info severity
- """
- INFO
-
- """
- Low severity
- """
- LOW
-
- """
- Medium severity
- """
- MEDIUM
-
- """
- Unknown severity
- """
- UNKNOWN
-}
-
-"""
-Alert status values
-"""
-enum AlertManagementStatus {
- """
- Acknowledged status
- """
- ACKNOWLEDGED
-
- """
- Ignored status
- """
- IGNORED
-
- """
- Resolved status
- """
- RESOLVED
-
- """
- Triggered status
- """
- TRIGGERED
-}
-
-"""
-Autogenerated input type of AlertSetAssignees
-"""
-input AlertSetAssigneesInput {
- """
- The usernames to assign to the alert. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of AlertSetAssignees
-"""
-type AlertSetAssigneesPayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of AlertTodoCreate
-"""
-input AlertTodoCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of AlertTodoCreate
-"""
-type AlertTodoCreatePayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Identifier of Analytics::DevopsAdoption::Segment.
-"""
-scalar AnalyticsDevopsAdoptionSegmentID
-
-"""
-Data associated with configuring API fuzzing scans in GitLab CI
-"""
-type ApiFuzzingCiConfiguration {
- """
- All available scan modes.
- """
- scanModes: [ApiFuzzingScanMode!]
-
- """
- All default scan profiles.
- """
- scanProfiles: [ApiFuzzingScanProfile!]
-}
-
-"""
-Autogenerated input type of ApiFuzzingCiConfigurationCreate
-"""
-input ApiFuzzingCiConfigurationCreateInput {
- """
- File path or URL to the file that defines the API surface for scanning. Must
- be in the format specified by the `scanMode` argument.
- """
- apiSpecificationFile: String!
-
- """
- CI variable containing the password for authenticating with the target API.
- """
- authPassword: String
-
- """
- CI variable containing the username for authenticating with the target API.
- """
- authUsername: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the project.
- """
- projectPath: ID!
-
- """
- The mode for API fuzzing scans.
- """
- scanMode: ApiFuzzingScanMode!
-
- """
- Name of a default profile to use for scanning. Ex: Quick-10.
- """
- scanProfile: String
-
- """
- URL for the target of API fuzzing scans.
- """
- target: String!
-}
-
-"""
-Autogenerated return type of ApiFuzzingCiConfigurationCreate
-"""
-type ApiFuzzingCiConfigurationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans.
- """
- configurationYaml: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The location at which the project's `.gitlab-ci.yml` file can be edited in the browser.
- """
- gitlabCiYamlEditPath: String
-}
-
-"""
-All possible ways to specify the API surface for an API fuzzing scan
-"""
-enum ApiFuzzingScanMode {
- """
- The API surface is specified by a HAR file.
- """
- HAR
-
- """
- The API surface is specified by a OPENAPI file.
- """
- OPENAPI
-}
-
-"""
-An API Fuzzing scan profile.
-"""
-type ApiFuzzingScanProfile {
- """
- A short description of the profile.
- """
- description: String
-
- """
- The unique name of the profile.
- """
- name: String
-
- """
- A syntax highlit HTML representation of the YAML.
- """
- yaml: String
-}
-
-"""
-User availability status
-"""
-enum AvailabilityEnum {
- """
- Busy
- """
- BUSY
-
- """
- Not Set
- """
- NOT_SET
-}
-
-"""
-An emoji awarded by a user
-"""
-type AwardEmoji {
- """
- The emoji description.
- """
- description: String!
-
- """
- The emoji as an icon.
- """
- emoji: String!
-
- """
- The emoji name.
- """
- name: String!
-
- """
- The emoji in Unicode.
- """
- unicode: String!
-
- """
- The Unicode version for this emoji.
- """
- unicodeVersion: String!
-
- """
- The user who awarded the emoji.
- """
- user: User!
-}
-
-"""
-Autogenerated input type of AwardEmojiAdd
-"""
-input AwardEmojiAddInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiAdd
-"""
-type AwardEmojiAddPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-The connection type for AwardEmoji.
-"""
-type AwardEmojiConnection {
- """
- A list of edges.
- """
- edges: [AwardEmojiEdge]
-
- """
- A list of nodes.
- """
- nodes: [AwardEmoji]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AwardEmojiEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AwardEmoji
-}
-
-"""
-Autogenerated input type of AwardEmojiRemove
-"""
-input AwardEmojiRemoveInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiRemove
-"""
-type AwardEmojiRemovePayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of AwardEmojiToggle
-"""
-input AwardEmojiToggleInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiToggle
-"""
-type AwardEmojiTogglePayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.
- """
- toggledOn: Boolean!
-}
-
-"""
-Identifier of Awardable.
-"""
-scalar AwardableID
-
-type BaseService implements Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Class name of the service.
- """
- type: String
-}
-
-"""
-Represents non-fractional signed whole numeric values. Since the value may
-exceed the size of a 32-bit integer, it's encoded as a string.
-"""
-scalar BigInt
-
-type Blob implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- LFS ID of the blob.
- """
- lfsOid: String
-
- """
- Blob mode in numeric format.
- """
- mode: String
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web path of the blob.
- """
- webPath: String
-
- """
- Web URL of the blob.
- """
- webUrl: String
-}
-
-"""
-The connection type for Blob.
-"""
-type BlobConnection {
- """
- A list of edges.
- """
- edges: [BlobEdge]
-
- """
- A list of nodes.
- """
- nodes: [Blob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BlobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Blob
-}
-
-"""
-Types of blob viewers
-"""
-enum BlobViewersType {
- auxiliary
- rich
- simple
-}
-
-"""
-Represents a project or group board
-"""
-type Board {
- """
- The board assignee.
- """
- assignee: User
-
- """
- Epics associated with board issues.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters applied when selecting issues on the board.
- """
- issueFilters: BoardIssueInput
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardEpicConnection
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- ID (global ID) of the board.
- """
- id: ID!
-
- """
- The board iteration.
- """
- iteration: Iteration
-
- """
- Labels of the board.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Lists of the board.
- """
- lists(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a list by its global ID.
- """
- id: ListID
-
- """
- Filters applied when getting issue metadata in the board list.
- """
- issueFilters: BoardIssueInput
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardListConnection
-
- """
- The board milestone.
- """
- milestone: Milestone
-
- """
- Name of the board.
- """
- name: String
-
- """
- Web path of the board.
- """
- webPath: String!
-
- """
- Web URL of the board.
- """
- webUrl: String!
-
- """
- Weight of the board.
- """
- weight: Int
-}
-
-"""
-The connection type for Board.
-"""
-type BoardConnection {
- """
- A list of edges.
- """
- edges: [BoardEdge]
-
- """
- A list of nodes.
- """
- nodes: [Board]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BoardEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Board
-}
-
-"""
-Represents an epic on an issue board
-"""
-type BoardEpic implements CurrentUserTodos & Eventable & Noteable {
- """
- Author of the epic.
- """
- author: User!
-
- """
- A list of award emojis associated with the epic.
- """
- awardEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AwardEmojiConnection
-
- """
- Children (sub-epics) of the epic.
- """
- children(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Timestamp of when the epic was closed.
- """
- closedAt: Time
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of when the epic was created.
- """
- createdAt: Time
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Number of open and closed descendant epics and issues.
- """
- descendantCounts: EpicDescendantCount
-
- """
- Total weight of open and closed issues in the epic and its descendants.
- """
- descendantWeightSum: EpicDescendantWeights
-
- """
- Description of the epic.
- """
- description: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the epic has received.
- """
- downvotes: Int!
-
- """
- Due date of the epic.
- """
- dueDate: Time
-
- """
- Fixed due date of the epic.
- """
- dueDateFixed: Time
-
- """
- Inherited due date of the epic from milestones.
- """
- dueDateFromMilestones: Time
-
- """
- Indicates if the due date has been manually set.
- """
- dueDateIsFixed: Boolean
-
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-
- """
- Group to which the epic belongs.
- """
- group: Group!
-
- """
- Indicates if the epic has children.
- """
- hasChildren: Boolean!
-
- """
- Indicates if the epic has direct issues.
- """
- hasIssues: Boolean!
-
- """
- Indicates if the epic has a parent epic.
- """
- hasParent: Boolean!
-
- """
- Current health status of the epic.
- """
- healthStatus: EpicHealthStatus
-
- """
- ID of the epic.
- """
- id: ID!
-
- """
- Internal ID of the epic.
- """
- iid: ID!
-
- """
- A list of issues associated with the epic.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicIssueConnection
-
- """
- Labels assigned to the epic.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Parent epic of the epic.
- """
- parent: Epic
-
- """
- List of participants for the epic.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the epic. Returned in shortened format by default.
- """
- reference(
- """
- Indicates if the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relationship.
- """
- relationPath: String
-
- """
- The relative position of the epic in the epic tree.
- """
- relativePosition: Int
-
- """
- Start date of the epic.
- """
- startDate: Time
-
- """
- Fixed start date of the epic.
- """
- startDateFixed: Time
-
- """
- Inherited start date of the epic from milestones.
- """
- startDateFromMilestones: Time
-
- """
- Indicates if the start date has been manually set.
- """
- startDateIsFixed: Boolean
-
- """
- State of the epic.
- """
- state: EpicState!
-
- """
- Indicates the currently logged in user is subscribed to the epic.
- """
- subscribed: Boolean!
-
- """
- Title of the epic.
- """
- title: String
-
- """
- Timestamp of when the epic was updated.
- """
- updatedAt: Time
-
- """
- Number of upvotes the epic has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the epic.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the epic.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: EpicPermissions!
-
- """
- User preferences for the epic on the issue board.
- """
- userPreferences: BoardEpicUserPreferences
-
- """
- Web path of the epic.
- """
- webPath: String!
-
- """
- Web URL of the epic.
- """
- webUrl: String!
-}
-
-"""
-The connection type for BoardEpic.
-"""
-type BoardEpicConnection {
- """
- A list of edges.
- """
- edges: [BoardEpicEdge]
-
- """
- A list of nodes.
- """
- nodes: [BoardEpic]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BoardEpicEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: BoardEpic
-}
-
-"""
-Represents user preferences for a board epic
-"""
-type BoardEpicUserPreferences {
- """
- Indicates epic should be displayed as collapsed.
- """
- collapsed: Boolean!
-}
-
-"""
-Identifier of Board.
-"""
-scalar BoardID
-
-input BoardIssueInput {
- """
- Filter by assignee username.
- """
- assigneeUsername: [String]
-
- """
- Filter by author username.
- """
- authorUsername: String
-
- """
- Filter by epic ID. Incompatible with epicWildcardId.
- """
- epicId: EpicID
-
- """
- Filter by epic ID wildcard. Incompatible with epicId.
- """
- epicWildcardId: EpicWildcardId
-
- """
- Filter by iteration title.
- """
- iterationTitle: String
-
- """
- Filter by iteration ID wildcard.
- """
- iterationWildcardId: IterationWildcardId
-
- """
- Filter by label name.
- """
- labelName: [String]
-
- """
- Filter by milestone title.
- """
- milestoneTitle: String
-
- """
- Filter by reaction emoji.
- """
- myReactionEmoji: String
-
- """
- List of negated params. Warning: this argument is experimental and a subject to change in future.
- """
- not: NegatedBoardIssueInput
-
- """
- Filter by release tag.
- """
- releaseTag: String
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Filter by weight.
- """
- weight: String
-}
-
-"""
-Represents a list for an issue board
-"""
-type BoardList {
- """
- Assignee in the list.
- """
- assignee: User
-
- """
- Indicates if list is collapsed for this user.
- """
- collapsed: Boolean
-
- """
- ID (global ID) of the list.
- """
- id: ID!
-
- """
- Board issues.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters applied when selecting issues in the board list.
- """
- filters: BoardIssueInput
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IssueConnection
-
- """
- Count of issues in the list.
- """
- issuesCount: Int
-
- """
- Iteration of the list.
- """
- iteration: Iteration
-
- """
- Label of the list.
- """
- label: Label
-
- """
- The current limit metric for the list.
- """
- limitMetric: ListLimitMetric
-
- """
- Type of the list.
- """
- listType: String!
-
- """
- Maximum number of issues in the list.
- """
- maxIssueCount: Int
-
- """
- Maximum weight of issues in the list.
- """
- maxIssueWeight: Int
-
- """
- Milestone of the list.
- """
- milestone: Milestone
-
- """
- Position of list within the board.
- """
- position: Int
-
- """
- Title of the list.
- """
- title: String!
-
- """
- Total weight of all issues in the list.
- """
- totalWeight: Int
-}
-
-"""
-The connection type for BoardList.
-"""
-type BoardListConnection {
- """
- A list of edges.
- """
- edges: [BoardListEdge]
-
- """
- A list of nodes.
- """
- nodes: [BoardList]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of BoardListCreate
-"""
-input BoardListCreateInput {
- """
- Global ID of an existing user.
- """
- assigneeId: UserID
-
- """
- Create the backlog list.
- """
- backlog: Boolean
-
- """
- Global ID of the issue board to mutate.
- """
- boardId: BoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of an existing iteration.
- """
- iterationId: IterationID
-
- """
- Global ID of an existing label.
- """
- labelId: LabelID
-
- """
- Global ID of an existing milestone.
- """
- milestoneId: MilestoneID
-}
-
-"""
-Autogenerated return type of BoardListCreate
-"""
-type BoardListCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Issue list in the issue board.
- """
- list: BoardList
-}
-
-"""
-An edge in a connection.
-"""
-type BoardListEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: BoardList
-}
-
-"""
-Autogenerated input type of BoardListUpdateLimitMetrics
-"""
-input BoardListUpdateLimitMetricsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The new limit metric type for the list.
- """
- limitMetric: ListLimitMetric
-
- """
- The global ID of the list.
- """
- listId: ListID!
-
- """
- The new maximum issue count limit.
- """
- maxIssueCount: Int
-
- """
- The new maximum issue weight limit.
- """
- maxIssueWeight: Int
-}
-
-"""
-Autogenerated return type of BoardListUpdateLimitMetrics
-"""
-type BoardListUpdateLimitMetricsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The updated list.
- """
- list: BoardList
-}
-
-"""
-Identifier of Boards::EpicBoard.
-"""
-scalar BoardsEpicBoardID
-
-"""
-Identifier of Boards::EpicList.
-"""
-scalar BoardsEpicListID
-
-type Branch {
- """
- Commit for the branch.
- """
- commit: Commit
-
- """
- Name of the branch.
- """
- name: String!
-}
-
-"""
-Represents the total number of issues and their weights for a particular day
-"""
-type BurnupChartDailyTotals {
- """
- Number of closed issues as of this day.
- """
- completedCount: Int!
-
- """
- Total weight of closed issues as of this day.
- """
- completedWeight: Int!
-
- """
- Date for burnup totals.
- """
- date: ISO8601Date!
-
- """
- Number of issues as of this day.
- """
- scopeCount: Int!
-
- """
- Total weight of issues as of this day.
- """
- scopeWeight: Int!
-}
-
-type CiApplicationSettings {
- """
- Whether to keep the latest jobs artifacts.
- """
- keepLatestArtifact: Boolean
-}
-
-type CiBuildNeed {
- """
- Name of the job we need to complete.
- """
- name: String
-}
-
-"""
-The connection type for CiBuildNeed.
-"""
-type CiBuildNeedConnection {
- """
- A list of edges.
- """
- edges: [CiBuildNeedEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiBuildNeed]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiBuildNeedEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiBuildNeed
-}
-
-"""
-Autogenerated input type of CiCdSettingsUpdate
-"""
-input CiCdSettingsUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full Path of the project the settings belong to.
- """
- fullPath: ID!
-
- """
- Indicates if the latest artifact should be kept for this project.
- """
- keepLatestArtifact: Boolean
-}
-
-"""
-Autogenerated return type of CiCdSettingsUpdate
-"""
-type CiCdSettingsUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type CiConfig {
- """
- Linting errors.
- """
- errors: [String!]
-
- """
- Merged CI configuration YAML.
- """
- mergedYaml: String
-
- """
- Stages of the pipeline.
- """
- stages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigStageConnection
-
- """
- Status of linting, can be either valid or invalid.
- """
- status: CiConfigStatus
-}
-
-type CiConfigGroup {
- """
- Jobs in group.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigJobConnection
-
- """
- Name of the job group.
- """
- name: String
-
- """
- Size of the job group.
- """
- size: Int
-}
-
-"""
-The connection type for CiConfigGroup.
-"""
-type CiConfigGroupConnection {
- """
- A list of edges.
- """
- edges: [CiConfigGroupEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigGroup]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigGroupEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigGroup
-}
-
-type CiConfigJob {
- """
- Override a set of commands that are executed after the job.
- """
- afterScript: [String!]
-
- """
- Allow job to fail.
- """
- allowFailure: Boolean
-
- """
- Override a set of commands that are executed before the job.
- """
- beforeScript: [String!]
-
- """
- Name of an environment to which the job deploys.
- """
- environment: String
-
- """
- Limit when jobs are not created.
- """
- except: CiConfigJobRestriction
-
- """
- Name of the job group.
- """
- groupName: String
-
- """
- Name of the job.
- """
- name: String
-
- """
- Builds that must complete before the jobs run.
- """
- needs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigNeedConnection
-
- """
- Jobs are created when these conditions do not apply.
- """
- only: CiConfigJobRestriction
-
- """
- Shell script that is executed by a runner.
- """
- script: [String!]
-
- """
- Name of the job stage.
- """
- stage: String
-
- """
- List of tags that are used to select a runner.
- """
- tags: [String!]
-
- """
- When to run the job.
- """
- when: String
-}
-
-"""
-The connection type for CiConfigJob.
-"""
-type CiConfigJobConnection {
- """
- A list of edges.
- """
- edges: [CiConfigJobEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigJob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigJobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigJob
-}
-
-type CiConfigJobRestriction {
- """
- The Git refs the job restriction applies to.
- """
- refs: [String!]
-}
-
-type CiConfigNeed {
- """
- Name of the need.
- """
- name: String
-}
-
-"""
-The connection type for CiConfigNeed.
-"""
-type CiConfigNeedConnection {
- """
- A list of edges.
- """
- edges: [CiConfigNeedEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigNeed]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigNeedEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigNeed
-}
-
-type CiConfigStage {
- """
- Groups of jobs for the stage.
- """
- groups(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigGroupConnection
-
- """
- Name of the stage.
- """
- name: String
-}
-
-"""
-The connection type for CiConfigStage.
-"""
-type CiConfigStageConnection {
- """
- A list of edges.
- """
- edges: [CiConfigStageEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigStage]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigStageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigStage
-}
-
-"""
-Values for YAML processor result
-"""
-enum CiConfigStatus {
- """
- The configuration file is not valid
- """
- INVALID
-
- """
- The configuration file is valid
- """
- VALID
-}
-
-type CiGroup {
- """
- Detailed status of the group.
- """
- detailedStatus: DetailedStatus
-
- """
- Jobs in group.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiJobConnection
-
- """
- Name of the job group.
- """
- name: String
-
- """
- Size of the group.
- """
- size: Int
-}
-
-"""
-The connection type for CiGroup.
-"""
-type CiGroupConnection {
- """
- A list of edges.
- """
- edges: [CiGroupEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiGroup]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiGroupEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiGroup
-}
-
-type CiJob {
- """
- Artifacts generated by the job.
- """
- artifacts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiJobArtifactConnection
-
- """
- Detailed status of the job.
- """
- detailedStatus: DetailedStatus
-
- """
- Name of the job.
- """
- name: String
-
- """
- References to builds that must complete before the jobs run.
- """
- needs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiBuildNeedConnection
-
- """
- Pipeline the job belongs to.
- """
- pipeline: Pipeline
-
- """
- Schedule for the build.
- """
- scheduledAt: Time
-}
-
-type CiJobArtifact {
- """
- URL for downloading the artifact's file.
- """
- downloadPath: String
-
- """
- File type of the artifact.
- """
- fileType: JobArtifactFileType
-}
-
-"""
-The connection type for CiJobArtifact.
-"""
-type CiJobArtifactConnection {
- """
- A list of edges.
- """
- edges: [CiJobArtifactEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiJobArtifact]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiJobArtifactEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiJobArtifact
-}
-
-"""
-The connection type for CiJob.
-"""
-type CiJobConnection {
- """
- A list of edges.
- """
- edges: [CiJobEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiJob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiJobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiJob
-}
-
-"""
-Identifier of Ci::Pipeline.
-"""
-scalar CiPipelineID
-
-type CiStage {
- """
- Detailed status of the stage.
- """
- detailedStatus: DetailedStatus
-
- """
- Group of jobs for the stage.
- """
- groups(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiGroupConnection
-
- """
- Name of the stage.
- """
- name: String
-}
-
-"""
-The connection type for CiStage.
-"""
-type CiStageConnection {
- """
- A list of edges.
- """
- edges: [CiStageEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiStage]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiStageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiStage
-}
-
-type ClusterAgent {
- """
- Timestamp the cluster agent was created.
- """
- createdAt: Time
-
- """
- User object, containing information about the person who created the agent.
- """
- createdByUser: User
-
- """
- ID of the cluster agent.
- """
- id: ID!
-
- """
- Name of the cluster agent.
- """
- name: String
-
- """
- The project this cluster agent is associated with.
- """
- project: Project
-
- """
- Tokens associated with the cluster agent.
- """
- tokens(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ClusterAgentTokenConnection
-
- """
- Timestamp the cluster agent was updated.
- """
- updatedAt: Time
-}
-
-"""
-The connection type for ClusterAgent.
-"""
-type ClusterAgentConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ClusterAgentEdge]
-
- """
- A list of nodes.
- """
- nodes: [ClusterAgent]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ClusterAgentDelete
-"""
-input ClusterAgentDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent that will be deleted.
- """
- id: ClustersAgentID!
-}
-
-"""
-Autogenerated return type of ClusterAgentDelete
-"""
-type ClusterAgentDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type ClusterAgentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ClusterAgent
-}
-
-type ClusterAgentToken {
- """
- Cluster agent this token is associated with.
- """
- clusterAgent: ClusterAgent
-
- """
- Timestamp the token was created.
- """
- createdAt: Time
-
- """
- The user who created the token.
- """
- createdByUser: User
-
- """
- Global ID of the token.
- """
- id: ClustersAgentTokenID!
-}
-
-"""
-The connection type for ClusterAgentToken.
-"""
-type ClusterAgentTokenConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ClusterAgentTokenEdge]
-
- """
- A list of nodes.
- """
- nodes: [ClusterAgentToken]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ClusterAgentTokenCreate
-"""
-input ClusterAgentTokenCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent that will be associated with the new token.
- """
- clusterAgentId: ClustersAgentID!
-}
-
-"""
-Autogenerated return type of ClusterAgentTokenCreate
-"""
-type ClusterAgentTokenCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Token secret value. Make sure you save it - you won't be able to access it again.
- """
- secret: String
-
- """
- Token created after mutation.
- """
- token: ClusterAgentToken
-}
-
-"""
-Autogenerated input type of ClusterAgentTokenDelete
-"""
-input ClusterAgentTokenDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent token that will be deleted.
- """
- id: ClustersAgentTokenID!
-}
-
-"""
-Autogenerated return type of ClusterAgentTokenDelete
-"""
-type ClusterAgentTokenDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type ClusterAgentTokenEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ClusterAgentToken
-}
-
-"""
-Identifier of Clusters::Agent.
-"""
-scalar ClustersAgentID
-
-"""
-Identifier of Clusters::AgentToken.
-"""
-scalar ClustersAgentTokenID
-
-"""
-Identifier of Clusters::Cluster.
-"""
-scalar ClustersClusterID
-
-"""
-Represents the code coverage activity for a group
-"""
-type CodeCoverageActivity {
- """
- Average percentage of the different code coverage results available for the group.
- """
- averageCoverage: Float
-
- """
- Number of different code coverage results available for the group.
- """
- coverageCount: Int
-
- """
- Date when the code coverage was created.
- """
- date: Date!
-
- """
- Number of projects with code coverage results for the group.
- """
- projectCount: Int
-}
-
-"""
-The connection type for CodeCoverageActivity.
-"""
-type CodeCoverageActivityConnection {
- """
- A list of edges.
- """
- edges: [CodeCoverageActivityEdge]
-
- """
- A list of nodes.
- """
- nodes: [CodeCoverageActivity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CodeCoverageActivityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CodeCoverageActivity
-}
-
-"""
-Represents the code coverage summary for a project
-"""
-type CodeCoverageSummary {
- """
- Average percentage of the different code coverage results available for the project.
- """
- averageCoverage: Float
-
- """
- Number of different code coverage results available.
- """
- coverageCount: Int
-
- """
- Latest date when the code coverage was created for the project.
- """
- lastUpdatedOn: Date
-}
-
-type Commit {
- """
- Author of the commit.
- """
- author: User
-
- """
- Commit authors gravatar.
- """
- authorGravatar: String
-
- """
- Commit authors name.
- """
- authorName: String
-
- """
- Timestamp of when the commit was authored.
- """
- authoredDate: Time
-
- """
- Description of the commit message.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- ID (global ID) of the commit.
- """
- id: ID!
-
- """
- Raw commit message.
- """
- message: String
-
- """
- Pipelines of the commit ordered latest first.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- SHA1 ID of the commit.
- """
- sha: String!
-
- """
- Short SHA1 ID of the commit.
- """
- shortId: String!
-
- """
- Rendered HTML of the commit signature.
- """
- signatureHtml: String
-
- """
- Title of the commit message.
- """
- title: String
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Web path of the commit.
- """
- webPath: String!
-
- """
- Web URL of the commit.
- """
- webUrl: String!
-}
-
-input CommitAction {
- """
- The action to perform, create, delete, move, update, chmod.
- """
- action: CommitActionMode!
-
- """
- Content of the file.
- """
- content: String
-
- """
- Encoding of the file. Default is text.
- """
- encoding: CommitEncoding
-
- """
- Enables/disables the execute flag on the file.
- """
- executeFilemode: Boolean
-
- """
- Full path to the file.
- """
- filePath: String!
-
- """
- Last known file commit ID.
- """
- lastCommitId: String
-
- """
- Original full path to the file being moved.
- """
- previousPath: String
-}
-
-"""
-Mode of a commit action
-"""
-enum CommitActionMode {
- """
- Chmod command
- """
- CHMOD
-
- """
- Create command
- """
- CREATE
-
- """
- Delete command
- """
- DELETE
-
- """
- Move command
- """
- MOVE
-
- """
- Update command
- """
- UPDATE
-}
-
-"""
-The connection type for Commit.
-"""
-type CommitConnection {
- """
- A list of edges.
- """
- edges: [CommitEdge]
-
- """
- A list of nodes.
- """
- nodes: [Commit]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of CommitCreate
-"""
-input CommitCreateInput {
- """
- Array of action hashes to commit as a batch.
- """
- actions: [CommitAction!]!
-
- """
- Name of the branch to commit into, it can be a new branch.
- """
- branch: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Raw commit message.
- """
- message: String!
-
- """
- Project full path the branch is associated with.
- """
- projectPath: ID!
-
- """
- If on a new branch, name of the original branch.
- """
- startBranch: String
-}
-
-"""
-Autogenerated return type of CommitCreate
-"""
-type CommitCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The commit after mutation.
- """
- commit: Commit
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type CommitEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Commit
-}
-
-enum CommitEncoding {
- """
- Base64 encoding
- """
- BASE64
-
- """
- Text encoding
- """
- TEXT
-}
-
-"""
-Represents a ComplianceFramework associated with a Project
-"""
-type ComplianceFramework {
- """
- Hexadecimal representation of compliance framework's label color.
- """
- color: String!
-
- """
- Description of the compliance framework.
- """
- description: String!
-
- """
- Compliance framework ID.
- """
- id: ID!
-
- """
- Name of the compliance framework.
- """
- name: String!
-
- """
- Full path of the compliance pipeline configuration stored in a project
- repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.
- """
- pipelineConfigurationFullPath: String
-}
-
-"""
-The connection type for ComplianceFramework.
-"""
-type ComplianceFrameworkConnection {
- """
- A list of edges.
- """
- edges: [ComplianceFrameworkEdge]
-
- """
- A list of nodes.
- """
- nodes: [ComplianceFramework]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ComplianceFrameworkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ComplianceFramework
-}
-
-input ComplianceFrameworkInput {
- """
- New color representation of the compliance framework in hex format. e.g. #FCA121.
- """
- color: String
-
- """
- New description for the compliance framework.
- """
- description: String
-
- """
- New name for the compliance framework.
- """
- name: String
-
- """
- Full path of the compliance pipeline configuration stored in a project
- repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.
- """
- pipelineConfigurationFullPath: String
-}
-
-"""
-Identifier of ComplianceManagement::Framework.
-"""
-scalar ComplianceManagementFrameworkID
-
-"""
-Composer metadata
-"""
-type ComposerMetadata {
- """
- Data of the Composer JSON file.
- """
- composerJson: PackageComposerJsonType!
-
- """
- Target SHA of the package.
- """
- targetSha: String!
-}
-
-"""
-Autogenerated input type of ConfigureSast
-"""
-input ConfigureSastInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- SAST CI configuration for the project.
- """
- configuration: SastCiConfigurationInput!
-
- """
- Full path of the project.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of ConfigureSast
-"""
-type ConfigureSastPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Status of creating the commit for the supplied SAST CI configuration.
- """
- status: String!
-
- """
- Redirect path to use when the response is successful.
- """
- successPath: String
-}
-
-"""
-A tag expiration policy designed to keep only the images that matter most
-"""
-type ContainerExpirationPolicy {
- """
- This container expiration policy schedule.
- """
- cadence: ContainerExpirationPolicyCadenceEnum!
-
- """
- Timestamp of when the container expiration policy was created.
- """
- createdAt: Time!
-
- """
- Indicates whether this container expiration policy is enabled.
- """
- enabled: Boolean!
-
- """
- Number of tags to retain.
- """
- keepN: ContainerExpirationPolicyKeepEnum
-
- """
- Tags with names matching this regex pattern will expire.
- """
- nameRegex: UntrustedRegexp
-
- """
- Tags with names matching this regex pattern will be preserved.
- """
- nameRegexKeep: UntrustedRegexp
-
- """
- Next time that this container expiration policy will get executed.
- """
- nextRunAt: Time
-
- """
- Tags older that this will expire.
- """
- olderThan: ContainerExpirationPolicyOlderThanEnum
-
- """
- Timestamp of when the container expiration policy was updated.
- """
- updatedAt: Time!
-}
-
-enum ContainerExpirationPolicyCadenceEnum {
- """
- Every day
- """
- EVERY_DAY
-
- """
- Every month
- """
- EVERY_MONTH
-
- """
- Every three months
- """
- EVERY_THREE_MONTHS
-
- """
- Every two weeks
- """
- EVERY_TWO_WEEKS
-
- """
- Every week
- """
- EVERY_WEEK
-}
-
-enum ContainerExpirationPolicyKeepEnum {
- """
- 50 tags per image name
- """
- FIFTY_TAGS
-
- """
- 5 tags per image name
- """
- FIVE_TAGS
-
- """
- 100 tags per image name
- """
- ONE_HUNDRED_TAGS
-
- """
- 1 tag per image name
- """
- ONE_TAG
-
- """
- 10 tags per image name
- """
- TEN_TAGS
-
- """
- 25 tags per image name
- """
- TWENTY_FIVE_TAGS
-}
-
-enum ContainerExpirationPolicyOlderThanEnum {
- """
- 14 days until tags are automatically removed
- """
- FOURTEEN_DAYS
-
- """
- 90 days until tags are automatically removed
- """
- NINETY_DAYS
-
- """
- 7 days until tags are automatically removed
- """
- SEVEN_DAYS
-
- """
- 30 days until tags are automatically removed
- """
- THIRTY_DAYS
-}
-
-"""
-A container repository
-"""
-type ContainerRepository {
- """
- Can the current user delete the container repository.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the container repository was created.
- """
- createdAt: Time!
-
- """
- The tags cleanup status for the container repository.
- """
- expirationPolicyCleanupStatus: ContainerRepositoryCleanupStatus
-
- """
- Timestamp when the cleanup done by the expiration policy was started on the container repository.
- """
- expirationPolicyStartedAt: Time
-
- """
- ID of the container repository.
- """
- id: ID!
-
- """
- URL of the container repository.
- """
- location: String!
-
- """
- Name of the container repository.
- """
- name: String!
-
- """
- Path of the container repository.
- """
- path: String!
-
- """
- Project of the container registry.
- """
- project: Project!
-
- """
- Status of the container repository.
- """
- status: ContainerRepositoryStatus
-
- """
- Number of tags associated with this image.
- """
- tagsCount: Int!
-
- """
- Timestamp when the container repository was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Status of the tags cleanup of a container repository
-"""
-enum ContainerRepositoryCleanupStatus {
- """
- The tags cleanup is ongoing.
- """
- ONGOING
-
- """
- The tags cleanup is scheduled and is going to be executed shortly.
- """
- SCHEDULED
-
- """
- The tags cleanup has been partially executed. There are still remaining tags to delete.
- """
- UNFINISHED
-
- """
- The tags cleanup is not scheduled. This is the default state.
- """
- UNSCHEDULED
-}
-
-"""
-The connection type for ContainerRepository.
-"""
-type ContainerRepositoryConnection {
- """
- A list of edges.
- """
- edges: [ContainerRepositoryEdge]
-
- """
- A list of nodes.
- """
- nodes: [ContainerRepository]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Details of a container repository
-"""
-type ContainerRepositoryDetails {
- """
- Can the current user delete the container repository.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the container repository was created.
- """
- createdAt: Time!
-
- """
- The tags cleanup status for the container repository.
- """
- expirationPolicyCleanupStatus: ContainerRepositoryCleanupStatus
-
- """
- Timestamp when the cleanup done by the expiration policy was started on the container repository.
- """
- expirationPolicyStartedAt: Time
-
- """
- ID of the container repository.
- """
- id: ID!
-
- """
- URL of the container repository.
- """
- location: String!
-
- """
- Name of the container repository.
- """
- name: String!
-
- """
- Path of the container repository.
- """
- path: String!
-
- """
- Project of the container registry.
- """
- project: Project!
-
- """
- Status of the container repository.
- """
- status: ContainerRepositoryStatus
-
- """
- Tags of the container repository.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ContainerRepositoryTagConnection
-
- """
- Number of tags associated with this image.
- """
- tagsCount: Int!
-
- """
- Timestamp when the container repository was updated.
- """
- updatedAt: Time!
-}
-
-"""
-An edge in a connection.
-"""
-type ContainerRepositoryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ContainerRepository
-}
-
-"""
-Identifier of ContainerRepository.
-"""
-scalar ContainerRepositoryID
-
-"""
-Values for sorting container repositories
-"""
-enum ContainerRepositorySort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Name by ascending order
- """
- NAME_ASC
-
- """
- Name by descending order
- """
- NAME_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-Status of a container repository
-"""
-enum ContainerRepositoryStatus {
- """
- Delete Failed status.
- """
- DELETE_FAILED
-
- """
- Delete Scheduled status.
- """
- DELETE_SCHEDULED
-}
-
-"""
-A tag from a container repository
-"""
-type ContainerRepositoryTag {
- """
- Can the current user delete this tag.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the tag was created.
- """
- createdAt: Time
-
- """
- Digest of the tag.
- """
- digest: String
-
- """
- URL of the tag.
- """
- location: String!
-
- """
- Name of the tag.
- """
- name: String!
-
- """
- Path of the tag.
- """
- path: String!
-
- """
- Revision of the tag.
- """
- revision: String
-
- """
- Short revision of the tag.
- """
- shortRevision: String
-
- """
- The size of the tag.
- """
- totalSize: BigInt
-}
-
-"""
-The connection type for ContainerRepositoryTag.
-"""
-type ContainerRepositoryTagConnection {
- """
- A list of edges.
- """
- edges: [ContainerRepositoryTagEdge]
-
- """
- A list of nodes.
- """
- nodes: [ContainerRepositoryTag]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ContainerRepositoryTagEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ContainerRepositoryTag
-}
-
-"""
-Autogenerated input type of CreateAlertIssue
-"""
-input CreateAlertIssueInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of CreateAlertIssue
-"""
-type CreateAlertIssuePayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of CreateAnnotation
-"""
-input CreateAnnotationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the cluster to add an annotation to.
- """
- clusterId: ClustersClusterID
-
- """
- The path to a file defining the dashboard on which the annotation should be added.
- """
- dashboardPath: String!
-
- """
- The description of the annotation.
- """
- description: String!
-
- """
- Timestamp indicating ending moment to which the annotation relates.
- """
- endingAt: Time
-
- """
- The global ID of the environment to add an annotation to.
- """
- environmentId: EnvironmentID
-
- """
- Timestamp indicating starting moment to which the annotation relates.
- """
- startingAt: Time!
-}
-
-"""
-Autogenerated return type of CreateAnnotation
-"""
-type CreateAnnotationPayload {
- """
- The created annotation.
- """
- annotation: MetricsDashboardAnnotation
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateBoard
-"""
-input CreateBoardInput {
- """
- The ID of user to be assigned to the board.
- """
- assigneeId: UserID
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The ID of iteration to be assigned to the board.
- """
- iterationId: IterationID
-
- """
- The IDs of labels to be added to the board.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- The ID of milestone to be assigned to the board.
- """
- milestoneId: MilestoneID
-
- """
- The board name.
- """
- name: String
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- The weight value to be assigned to the board.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of CreateBoard
-"""
-type CreateBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateBranch
-"""
-input CreateBranchInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Name of the branch.
- """
- name: String!
-
- """
- Project full path the branch is associated with.
- """
- projectPath: ID!
-
- """
- Branch name or commit SHA to create branch from.
- """
- ref: String!
-}
-
-"""
-Autogenerated return type of CreateBranch
-"""
-type CreateBranchPayload {
- """
- Branch after mutation.
- """
- branch: Branch
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateClusterAgent
-"""
-input CreateClusterAgentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Name of the cluster agent.
- """
- name: String!
-
- """
- Full path of the associated project for this cluster agent.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of CreateClusterAgent
-"""
-type CreateClusterAgentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Cluster agent created after mutation.
- """
- clusterAgent: ClusterAgent
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateComplianceFramework
-"""
-input CreateComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the namespace to add the compliance framework to.
- """
- namespacePath: ID!
-
- """
- Parameters to update the compliance framework with.
- """
- params: ComplianceFrameworkInput!
-}
-
-"""
-Autogenerated return type of CreateComplianceFramework
-"""
-type CreateComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created compliance framework.
- """
- framework: ComplianceFramework
-}
-
-"""
-Autogenerated input type of CreateCustomEmoji
-"""
-input CreateCustomEmojiInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Namespace full path the emoji is associated with.
- """
- groupPath: ID!
-
- """
- Name of the emoji.
- """
- name: String!
-
- """
- Location of the emoji file.
- """
- url: String!
-}
-
-"""
-Autogenerated return type of CreateCustomEmoji
-"""
-type CreateCustomEmojiPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The new custom emoji.
- """
- customEmoji: CustomEmoji
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateDevopsAdoptionSegment
-"""
-input CreateDevopsAdoptionSegmentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Namespace ID to set for the segment.
- """
- namespaceId: NamespaceID!
-}
-
-"""
-Autogenerated return type of CreateDevopsAdoptionSegment
-"""
-type CreateDevopsAdoptionSegmentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The segment after mutation.
- """
- segment: DevopsAdoptionSegment
-}
-
-"""
-Autogenerated input type of CreateDiffNote
-"""
-input CreateDiffNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-
- """
- The position of this note on a diff.
- """
- position: DiffPositionInput!
-}
-
-"""
-Autogenerated return type of CreateDiffNote
-"""
-type CreateDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateEpic
-"""
-input CreateEpicInput {
- """
- The IDs of labels to be added to the epic.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- The description of the epic.
- """
- description: String
-
- """
- The end date of the epic.
- """
- dueDateFixed: String
-
- """
- Indicates end date should be sourced from due_date_fixed field not the issue milestones.
- """
- dueDateIsFixed: Boolean
-
- """
- The group the epic to mutate is in.
- """
- groupPath: ID!
-
- """
- The IDs of labels to be removed from the epic.
- """
- removeLabelIds: [ID!]
-
- """
- The start date of the epic.
- """
- startDateFixed: String
-
- """
- Indicates start date should be sourced from start_date_fixed field not the issue milestones.
- """
- startDateIsFixed: Boolean
-
- """
- The title of the epic.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateEpic
-"""
-type CreateEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created epic.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateImageDiffNote
-"""
-input CreateImageDiffNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-
- """
- The position of this note on a diff.
- """
- position: DiffImagePositionInput!
-}
-
-"""
-Autogenerated return type of CreateImageDiffNote
-"""
-type CreateImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateIssue
-"""
-input CreateIssueInput {
- """
- The array of user IDs to assign to the issue.
- """
- assigneeIds: [UserID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp when the issue was created. Available only for admins and project owners.
- """
- createdAt: Time
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.
- """
- discussionToResolve: String
-
- """
- Due date of the issue.
- """
- dueDate: ISO8601Date
-
- """
- The ID of an epic to associate the issue with.
- """
- epicId: EpicID
-
- """
- The desired health status.
- """
- healthStatus: HealthStatus
-
- """
- The IID (internal ID) of a project issue. Only admins and project owners can modify.
- """
- iid: Int
-
- """
- The IDs of labels to be added to the issue.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- Indicates discussion is locked on the issue.
- """
- locked: Boolean
-
- """
- The IID of a merge request for which to resolve discussions.
- """
- mergeRequestToResolveDiscussionsOf: MergeRequestID
-
- """
- The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.
- """
- milestoneId: MilestoneID
-
- """
- Project full path the issue is associated with.
- """
- projectPath: ID!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The weight of the issue.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of CreateIssue
-"""
-type CreateIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of CreateIteration
-"""
-input CreateIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the iteration.
- """
- description: String
-
- """
- The end date of the iteration.
- """
- dueDate: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- The start date of the iteration.
- """
- startDate: String
-
- """
- The title of the iteration.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateIteration
-"""
-type CreateIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created iteration.
- """
- iteration: Iteration
-}
-
-"""
-Autogenerated input type of CreateNote
-"""
-input CreateNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the discussion this note is in reply to.
- """
- discussionId: DiscussionID
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-}
-
-"""
-Autogenerated return type of CreateNote
-"""
-type CreateNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateRequirement
-"""
-input CreateRequirementInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- Full project path the requirement is associated with.
- """
- projectPath: ID!
-
- """
- Title of the requirement.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateRequirement
-"""
-type CreateRequirementPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Requirement after mutation.
- """
- requirement: Requirement
-}
-
-"""
-Autogenerated input type of CreateSnippet
-"""
-input CreateSnippetInput {
- """
- Actions to perform over the snippet repository and blobs.
- """
- blobActions: [SnippetBlobActionInputType!]
-
- """
- A valid CAPTCHA response value obtained by using the provided captchaSiteKey
- with a CAPTCHA API to present a challenge to be solved on the client. Required
- to resubmit if the previous operation returned "NeedsCaptchaResponse: true".
- """
- captchaResponse: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The project full path the snippet is associated with.
- """
- projectPath: ID
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- the operation to be completed. Required to resubmit if the previous operation
- returned "NeedsCaptchaResponse: true".
- """
- spamLogId: Int
-
- """
- Title of the snippet.
- """
- title: String!
-
- """
- The paths to files uploaded in the snippet description.
- """
- uploadedFiles: [String!]
-
- """
- The visibility level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum!
-}
-
-"""
-Autogenerated return type of CreateSnippet
-"""
-type CreateSnippetPayload {
- """
- The CAPTCHA site key which must be used to render a challenge for the user to
- solve to obtain a valid captchaResponse value. Included only when an operation
- was not completed because "NeedsCaptchaResponse" is true.
- """
- captchaSiteKey: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates whether the operation was detected as possible spam and not
- completed. If CAPTCHA is enabled, the request must be resubmitted with a valid
- CAPTCHA response and spam_log_id included for the operation to be completed.
- Included only when an operation was not completed because
- "NeedsCaptchaResponse" is true.
- """
- needsCaptchaResponse: Boolean
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-
- """
- Indicates whether the operation was detected as definite spam. There is no
- option to resubmit the request with a CAPTCHA response.
- """
- spam: Boolean
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- an operation to be completed. Included only when an operation was not
- completed because "NeedsCaptchaResponse" is true.
- """
- spamLogId: Int
-}
-
-"""
-Autogenerated input type of CreateTestCase
-"""
-input CreateTestCaseInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The test case description.
- """
- description: String
-
- """
- The IDs of labels to be added to the test case.
- """
- labelIds: [ID!]
-
- """
- The project full path to create the test case.
- """
- projectPath: ID!
-
- """
- The test case title.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of CreateTestCase
-"""
-type CreateTestCasePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The test case created.
- """
- testCase: Issue
-}
-
-interface CurrentUserTodos {
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-}
-
-"""
-A custom emoji uploaded by user
-"""
-type CustomEmoji {
- """
- Whether the emoji is an external link.
- """
- external: Boolean!
-
- """
- The ID of the emoji.
- """
- id: CustomEmojiID!
-
- """
- The name of the emoji.
- """
- name: String!
-
- """
- The link to file of the emoji.
- """
- url: String!
-}
-
-"""
-The connection type for CustomEmoji.
-"""
-type CustomEmojiConnection {
- """
- A list of edges.
- """
- edges: [CustomEmojiEdge]
-
- """
- A list of nodes.
- """
- nodes: [CustomEmoji]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CustomEmojiEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CustomEmoji
-}
-
-"""
-Identifier of CustomEmoji.
-"""
-scalar CustomEmojiID
-
-"""
-Autogenerated input type of DastOnDemandScanCreate
-"""
-input DastOnDemandScanCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be used for the scan.
- """
- dastScannerProfileId: DastScannerProfileID
-
- """
- ID of the site profile to be used for the scan.
- """
- dastSiteProfileId: DastSiteProfileID!
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-}
-
-"""
-Autogenerated return type of DastOnDemandScanCreate
-"""
-type DastOnDemandScanCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-"""
-Represents a DAST Profile
-"""
-type DastProfile {
- """
- The associated scanner profile.
- """
- dastScannerProfile: DastScannerProfile
-
- """
- The associated site profile.
- """
- dastSiteProfile: DastSiteProfile
-
- """
- The description of the scan.
- """
- description: String
-
- """
- Relative web path to the edit page of a profile.
- """
- editPath: String
-
- """
- ID of the profile.
- """
- id: DastProfileID!
-
- """
- The name of the profile.
- """
- name: String
-}
-
-"""
-The connection type for DastProfile.
-"""
-type DastProfileConnection {
- """
- A list of edges.
- """
- edges: [DastProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastProfileCreate
-"""
-input DastProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be associated.
- """
- dastScannerProfileId: DastScannerProfileID!
-
- """
- ID of the site profile to be associated.
- """
- dastSiteProfileId: DastSiteProfileID!
-
- """
- The description of the profile. Defaults to an empty string.
- """
- description: String = ""
-
- """
- The project the profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the profile.
- """
- name: String!
-
- """
- Run scan using profile after creation. Defaults to false.
- """
- runAfterCreate: Boolean = false
-}
-
-"""
-Autogenerated return type of DastProfileCreate
-"""
-type DastProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created profile.
- """
- dastProfile: DastProfile
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`.
- """
- pipelineUrl: String
-}
-
-"""
-Autogenerated input type of DastProfileDelete
-"""
-input DastProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the profile to be deleted.
- """
- id: DastProfileID!
-}
-
-"""
-Autogenerated return type of DastProfileDelete
-"""
-type DastProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastProfile
-}
-
-"""
-Identifier of Dast::Profile.
-"""
-scalar DastProfileID
-
-"""
-Autogenerated input type of DastProfileRun
-"""
-input DastProfileRunInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path for the project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the profile to be used for the scan.
- """
- id: DastProfileID!
-}
-
-"""
-Autogenerated return type of DastProfileRun
-"""
-type DastProfileRunPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-"""
-Autogenerated input type of DastProfileUpdate
-"""
-input DastProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be associated.
- """
- dastScannerProfileId: DastScannerProfileID
-
- """
- ID of the site profile to be associated.
- """
- dastSiteProfileId: DastSiteProfileID
-
- """
- The description of the profile. Defaults to an empty string.
- """
- description: String = ""
-
- """
- The project the profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the profile to be deleted.
- """
- id: DastProfileID!
-
- """
- The name of the profile.
- """
- name: String
-
- """
- Run scan using profile after update. Defaults to false.
- """
- runAfterUpdate: Boolean = false
-}
-
-"""
-Autogenerated return type of DastProfileUpdate
-"""
-type DastProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The updated profile.
- """
- dastProfile: DastProfile
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The URL of the pipeline that was created. Requires the input argument
- `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no
- pipeline will be created.
- """
- pipelineUrl: String
-}
-
-enum DastScanTypeEnum {
- """
- Active DAST scan. This scan will make active attacks against the target site.
- """
- ACTIVE
-
- """
- Passive DAST scan. This scan will not make active attacks against the target site.
- """
- PASSIVE
-}
-
-"""
-Represents a DAST scanner profile
-"""
-type DastScannerProfile {
- """
- Relative web path to the edit page of a scanner profile.
- """
- editPath: String
-
- """
- ID of the DAST scanner profile. Deprecated in 13.6: Use `id`.
- """
- globalId: DastScannerProfileID! @deprecated(reason: "Use `id`. Deprecated in 13.6.")
-
- """
- ID of the DAST scanner profile.
- """
- id: DastScannerProfileID!
-
- """
- Name of the DAST scanner profile.
- """
- profileName: String
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean!
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean!
-}
-
-"""
-The connection type for DastScannerProfile.
-"""
-type DastScannerProfileConnection {
- """
- A list of edges.
- """
- edges: [DastScannerProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastScannerProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastScannerProfileCreate
-"""
-input DastScannerProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the scanner profile.
- """
- profileName: String!
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum = PASSIVE
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean = false
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean = false
-}
-
-"""
-Autogenerated return type of DastScannerProfileCreate
-"""
-type DastScannerProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the scanner profile. Deprecated in 13.6: Use `id`.
- """
- globalId: DastScannerProfileID @deprecated(reason: "Use `id`. Deprecated in 13.6.")
-
- """
- ID of the scanner profile.
- """
- id: DastScannerProfileID
-}
-
-"""
-Autogenerated input type of DastScannerProfileDelete
-"""
-input DastScannerProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path for the project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the scanner profile to be deleted.
- """
- id: DastScannerProfileID!
-}
-
-"""
-Autogenerated return type of DastScannerProfileDelete
-"""
-type DastScannerProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastScannerProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastScannerProfile
-}
-
-"""
-Identifier of DastScannerProfile.
-"""
-scalar DastScannerProfileID
-
-"""
-Autogenerated input type of DastScannerProfileUpdate
-"""
-input DastScannerProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the scanner profile to be updated.
- """
- id: DastScannerProfileID!
-
- """
- The name of the scanner profile.
- """
- profileName: String!
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int!
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int!
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean
-}
-
-"""
-Autogenerated return type of DastScannerProfileUpdate
-"""
-type DastScannerProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the scanner profile.
- """
- id: DastScannerProfileID
-}
-
-"""
-Represents a DAST Site Profile
-"""
-type DastSiteProfile {
- """
- Relative web path to the edit page of a site profile.
- """
- editPath: String
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID!
-
- """
- Normalized URL of the target to be scanned.
- """
- normalizedTargetUrl: String
-
- """
- The name of the site profile.
- """
- profileName: String
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: DastSiteProfilePermissions!
-
- """
- The current validation status of the site profile.
- """
- validationStatus: DastSiteProfileValidationStatusEnum
-}
-
-"""
-The connection type for DastSiteProfile.
-"""
-type DastSiteProfileConnection {
- """
- A list of edges.
- """
- edges: [DastSiteProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastSiteProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastSiteProfileCreate
-"""
-input DastSiteProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the site profile.
- """
- profileName: String!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteProfileCreate
-"""
-type DastSiteProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID
-}
-
-"""
-Autogenerated input type of DastSiteProfileDelete
-"""
-input DastSiteProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the site profile to be deleted.
- """
- id: DastSiteProfileID!
-}
-
-"""
-Autogenerated return type of DastSiteProfileDelete
-"""
-type DastSiteProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastSiteProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastSiteProfile
-}
-
-"""
-Identifier of DastSiteProfile.
-"""
-scalar DastSiteProfileID
-
-"""
-Check permissions for the current user on site profile
-"""
-type DastSiteProfilePermissions {
- """
- Indicates the user can perform `create_on_demand_dast_scan` on this resource
- """
- createOnDemandDastScan: Boolean!
-}
-
-"""
-Autogenerated input type of DastSiteProfileUpdate
-"""
-input DastSiteProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the site profile to be updated.
- """
- id: DastSiteProfileID!
-
- """
- The name of the site profile.
- """
- profileName: String!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteProfileUpdate
-"""
-type DastSiteProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID
-}
-
-enum DastSiteProfileValidationStatusEnum {
- """
- Site validation process finished but failed
- """
- FAILED_VALIDATION
-
- """
- Site validation process is in progress
- """
- INPROGRESS_VALIDATION
-
- """
- No site validation exists
- """
- NONE
-
- """
- Site validation process finished successfully
- """
- PASSED_VALIDATION
-
- """
- Site validation process has not started
- """
- PENDING_VALIDATION
-}
-
-"""
-Autogenerated input type of DastSiteTokenCreate
-"""
-input DastSiteTokenCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site token belongs to.
- """
- fullPath: ID!
-
- """
- The URL of the target to be validated.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteTokenCreate
-"""
-type DastSiteTokenCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site token.
- """
- id: DastSiteTokenID
-
- """
- The current validation status of the target.
- """
- status: DastSiteProfileValidationStatusEnum
-
- """
- Token string.
- """
- token: String
-}
-
-"""
-Identifier of DastSiteToken.
-"""
-scalar DastSiteTokenID
-
-"""
-Represents a DAST Site Validation
-"""
-type DastSiteValidation {
- """
- Global ID of the site validation.
- """
- id: DastSiteValidationID!
-
- """
- Normalized URL of the target to be validated.
- """
- normalizedTargetUrl: String
-
- """
- Status of the site validation.
- """
- status: DastSiteProfileValidationStatusEnum!
-}
-
-"""
-The connection type for DastSiteValidation.
-"""
-type DastSiteValidationConnection {
- """
- A list of edges.
- """
- edges: [DastSiteValidationEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastSiteValidation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastSiteValidationCreate
-"""
-input DastSiteValidationCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the site token.
- """
- dastSiteTokenId: DastSiteTokenID!
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- The validation strategy to be used.
- """
- strategy: DastSiteValidationStrategyEnum
-
- """
- The path to be requested during validation.
- """
- validationPath: String!
-}
-
-"""
-Autogenerated return type of DastSiteValidationCreate
-"""
-type DastSiteValidationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site validation.
- """
- id: DastSiteValidationID
-
- """
- The current validation status.
- """
- status: DastSiteProfileValidationStatusEnum
-}
-
-"""
-An edge in a connection.
-"""
-type DastSiteValidationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastSiteValidation
-}
-
-"""
-Identifier of DastSiteValidation.
-"""
-scalar DastSiteValidationID
-
-"""
-Autogenerated input type of DastSiteValidationRevoke
-"""
-input DastSiteValidationRevokeInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site validation belongs to.
- """
- fullPath: ID!
-
- """
- Normalized URL of the target to be revoked.
- """
- normalizedTargetUrl: String!
-}
-
-"""
-Autogenerated return type of DastSiteValidationRevoke
-"""
-type DastSiteValidationRevokePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-enum DastSiteValidationStrategyEnum {
- """
- Header validation
- """
- HEADER
-
- """
- Text file validation
- """
- TEXT_FILE
-}
-
-"""
-Color of the data visualization palette
-"""
-enum DataVisualizationColorEnum {
- """
- Aqua color
- """
- AQUA
-
- """
- Blue color
- """
- BLUE
-
- """
- Green color
- """
- GREEN
-
- """
- Magenta color
- """
- MAGENTA
-
- """
- Orange color
- """
- ORANGE
-}
-
-"""
-Weight of the data visualization palette
-"""
-enum DataVisualizationWeightEnum {
- """
- 100 weight
- """
- WEIGHT_100
-
- """
- 200 weight
- """
- WEIGHT_200
-
- """
- 300 weight
- """
- WEIGHT_300
-
- """
- 400 weight
- """
- WEIGHT_400
-
- """
- 50 weight
- """
- WEIGHT_50
-
- """
- 500 weight
- """
- WEIGHT_500
-
- """
- 600 weight
- """
- WEIGHT_600
-
- """
- 700 weight
- """
- WEIGHT_700
-
- """
- 800 weight
- """
- WEIGHT_800
-
- """
- 900 weight
- """
- WEIGHT_900
-
- """
- 950 weight
- """
- WEIGHT_950
-}
-
-"""
-Date represented in ISO 8601
-"""
-scalar Date
-
-"""
-Autogenerated input type of DeleteAnnotation
-"""
-input DeleteAnnotationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the annotation to delete.
- """
- id: MetricsDashboardAnnotationID!
-}
-
-"""
-Autogenerated return type of DeleteAnnotation
-"""
-type DeleteAnnotationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DeleteDevopsAdoptionSegment
-"""
-input DeleteDevopsAdoptionSegmentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the segment.
- """
- id: AnalyticsDevopsAdoptionSegmentID!
-}
-
-"""
-Autogenerated return type of DeleteDevopsAdoptionSegment
-"""
-type DeleteDevopsAdoptionSegmentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-The response from the AdminSidekiqQueuesDeleteJobs mutation
-"""
-type DeleteJobsResponse {
- """
- Whether or not the entire queue was processed in time; if not, retrying the same request is safe.
- """
- completed: Boolean
-
- """
- The number of matching jobs deleted.
- """
- deletedJobs: Int
-
- """
- The queue size after processing.
- """
- queueSize: Int
-}
-
-"""
-A single design
-"""
-type Design implements CurrentUserTodos & DesignFields & Noteable {
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: 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
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-
- """
- All versions related to this design ordered newest first.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- The Global ID of the most recent acceptable version.
- """
- earlierOrEqualToId: DesignManagementVersionID
-
- """
- The SHA256 of the most recent acceptable version.
- """
- earlierOrEqualToSha: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignVersionConnection!
-}
-
-"""
-A design pinned to a specific version. The image field reflects the design as of the associated version
-"""
-type DesignAtVersion implements DesignFields {
- """
- The underlying design.
- """
- design: Design!
-
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: 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
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-
- """
- The version this design-at-versions is pinned to.
- """
- version: DesignVersion!
-}
-
-"""
-The connection type for DesignAtVersion.
-"""
-type DesignAtVersionConnection {
- """
- A list of edges.
- """
- edges: [DesignAtVersionEdge]
-
- """
- A list of nodes.
- """
- nodes: [DesignAtVersion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignAtVersionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DesignAtVersion
-}
-
-"""
-A collection of designs
-"""
-type DesignCollection {
- """
- Copy state of the design collection.
- """
- copyState: DesignCollectionCopyState
-
- """
- Find a specific design.
- """
- design(
- """
- Find a design by its filename.
- """
- filename: String
-
- """
- Find a design by its ID.
- """
- id: DesignManagementDesignID
- ): Design
-
- """
- Find a design as of a version.
- """
- designAtVersion(
- """
- The Global ID of the design at this version.
- """
- id: DesignManagementDesignAtVersionID!
- ): DesignAtVersion
-
- """
- All designs for the design collection.
- """
- designs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filters designs to only those that existed at the version. If argument is
- omitted or nil then all designs will reflect the latest version
- """
- atVersion: DesignManagementVersionID
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters designs by their filename.
- """
- filenames: [String!]
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters designs by their ID.
- """
- ids: [DesignManagementDesignID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignConnection!
-
- """
- Issue associated with the design collection.
- """
- issue: Issue!
-
- """
- Project associated with the design collection.
- """
- project: Project!
-
- """
- A specific version.
- """
- version(
- """
- The Global ID of the version.
- """
- id: DesignManagementVersionID
-
- """
- The SHA256 of a specific version.
- """
- sha: String
- ): DesignVersion
-
- """
- All versions related to all designs, ordered newest first.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- The Global ID of the most recent acceptable version.
- """
- earlierOrEqualToId: DesignManagementVersionID
-
- """
- The SHA256 of the most recent acceptable version.
- """
- earlierOrEqualToSha: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignVersionConnection!
-}
-
-"""
-Copy state of a DesignCollection
-"""
-enum DesignCollectionCopyState {
- """
- The DesignCollection encountered an error during a copy
- """
- ERROR
-
- """
- The DesignCollection is being copied
- """
- IN_PROGRESS
-
- """
- The DesignCollection has no copy in progress
- """
- READY
-}
-
-"""
-The connection type for Design.
-"""
-type DesignConnection {
- """
- A list of edges.
- """
- edges: [DesignEdge]
-
- """
- A list of nodes.
- """
- nodes: [Design]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Design
-}
-
-interface DesignFields {
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: 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
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-}
-
-type DesignManagement {
- """
- Find a design as of a version.
- """
- designAtVersion(
- """
- The Global ID of the design at this version.
- """
- id: DesignManagementDesignAtVersionID!
- ): DesignAtVersion
-
- """
- Find a version.
- """
- version(
- """
- The Global ID of the version.
- """
- id: DesignManagementVersionID!
- ): DesignVersion
-}
-
-"""
-Autogenerated input type of DesignManagementDelete
-"""
-input DesignManagementDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The filenames of the designs to delete.
- """
- filenames: [String!]!
-
- """
- The IID of the issue to modify designs for.
- """
- iid: ID!
-
- """
- The project where the issue is to upload designs for.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of DesignManagementDelete
-"""
-type DesignManagementDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The new version in which the designs are deleted.
- """
- version: DesignVersion
-}
-
-"""
-Identifier of DesignManagement::DesignAtVersion.
-"""
-scalar DesignManagementDesignAtVersionID
-
-"""
-Identifier of DesignManagement::Design.
-"""
-scalar DesignManagementDesignID
-
-"""
-Autogenerated input type of DesignManagementMove
-"""
-input DesignManagementMoveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the design to move.
- """
- id: DesignManagementDesignID!
-
- """
- ID of the immediately following design.
- """
- next: DesignManagementDesignID
-
- """
- ID of the immediately preceding design.
- """
- previous: DesignManagementDesignID
-}
-
-"""
-Autogenerated return type of DesignManagementMove
-"""
-type DesignManagementMovePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The current state of the collection.
- """
- designCollection: DesignCollection
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DesignManagementUpload
-"""
-input DesignManagementUploadInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The files to upload.
- """
- files: [Upload!]!
-
- """
- The IID of the issue to modify designs for.
- """
- iid: ID!
-
- """
- The project where the issue is to upload designs for.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of DesignManagementUpload
-"""
-type DesignManagementUploadPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The designs that were uploaded by the mutation.
- """
- designs: [Design!]!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Any designs that were skipped from the upload due to there being no change to their content since their last version
- """
- skippedDesigns: [Design!]!
-}
-
-"""
-Identifier of DesignManagement::Version.
-"""
-scalar DesignManagementVersionID
-
-"""
-A specific version in which designs were added, modified or deleted
-"""
-type DesignVersion {
- """
- A particular design as of this version, provided it is visible at this version.
- """
- designAtVersion(
- """
- The ID of a specific design.
- """
- designId: DesignManagementDesignID
-
- """
- The filename of a specific design.
- """
- filename: String
-
- """
- The ID of the DesignAtVersion.
- """
- id: DesignManagementDesignAtVersionID
- ): DesignAtVersion!
-
- """
- All designs that were changed in the version.
- """
- designs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignConnection!
-
- """
- All designs that are visible at this version, as of this version.
- """
- designsAtVersion(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters designs by their filename.
- """
- filenames: [String!]
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters designs by their ID.
- """
- ids: [DesignManagementDesignID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignAtVersionConnection!
-
- """
- ID of the design version.
- """
- id: ID!
-
- """
- SHA of the design version.
- """
- sha: ID!
-}
-
-"""
-The connection type for DesignVersion.
-"""
-type DesignVersionConnection {
- """
- A list of edges.
- """
- edges: [DesignVersionEdge]
-
- """
- A list of nodes.
- """
- nodes: [DesignVersion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignVersionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DesignVersion
-}
-
-"""
-Mutation event of a design within a version
-"""
-enum DesignVersionEvent {
- """
- A creation event
- """
- CREATION
-
- """
- A deletion event
- """
- DELETION
-
- """
- A modification event
- """
- MODIFICATION
-
- """
- No change
- """
- NONE
-}
-
-"""
-Autogenerated input type of DestroyBoard
-"""
-input DestroyBoardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the board to destroy.
- """
- id: BoardID!
-}
-
-"""
-Autogenerated input type of DestroyBoardList
-"""
-input DestroyBoardListInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the list to destroy. Only label lists are accepted.
- """
- listId: ListID!
-}
-
-"""
-Autogenerated return type of DestroyBoardList
-"""
-type DestroyBoardListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The list after mutation.
- """
- list: BoardList
-}
-
-"""
-Autogenerated return type of DestroyBoard
-"""
-type DestroyBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyComplianceFramework
-"""
-input DestroyComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the compliance framework to destroy.
- """
- id: ComplianceManagementFrameworkID!
-}
-
-"""
-Autogenerated return type of DestroyComplianceFramework
-"""
-type DestroyComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyContainerRepository
-"""
-input DestroyContainerRepositoryInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the container repository.
- """
- id: ContainerRepositoryID!
-}
-
-"""
-Autogenerated return type of DestroyContainerRepository
-"""
-type DestroyContainerRepositoryPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The container repository policy after scheduling the deletion.
- """
- containerRepository: ContainerRepository!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyContainerRepositoryTags
-"""
-input DestroyContainerRepositoryTagsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the container repository.
- """
- id: ContainerRepositoryID!
-
- """
- Container repository tag(s) to delete. Total number can't be greater than 20
- """
- tagNames: [String!]!
-}
-
-"""
-Autogenerated return type of DestroyContainerRepositoryTags
-"""
-type DestroyContainerRepositoryTagsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Deleted container repository tags.
- """
- deletedTagNames: [String!]!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyNote
-"""
-input DestroyNoteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the note to destroy.
- """
- id: NoteID!
-}
-
-"""
-Autogenerated return type of DestroyNote
-"""
-type DestroyNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of DestroySnippet
-"""
-input DestroySnippetInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the snippet to destroy.
- """
- id: SnippetID!
-}
-
-"""
-Autogenerated return type of DestroySnippet
-"""
-type DestroySnippetPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-}
-
-type DetailedStatus {
- """
- Action information for the status. This includes method, button title, icon, path, and title.
- """
- action: StatusAction
-
- """
- Path of the details for the status.
- """
- detailsPath: String
-
- """
- Favicon of the status.
- """
- favicon: String
-
- """
- Group of the status.
- """
- group: String
-
- """
- Indicates if the status has further details.
- """
- hasDetails: Boolean
-
- """
- Icon of the status.
- """
- icon: String
-
- """
- Label of the status.
- """
- label: String
-
- """
- Text of the status.
- """
- text: String
-
- """
- Tooltip associated with the status.
- """
- tooltip: String
-}
-
-"""
-Segment
-"""
-type DevopsAdoptionSegment {
- """
- ID of the segment.
- """
- id: ID!
-
- """
- The latest adoption metrics for the segment.
- """
- latestSnapshot: DevopsAdoptionSnapshot
-
- """
- Segment namespace.
- """
- namespace: Namespace
-}
-
-"""
-The connection type for DevopsAdoptionSegment.
-"""
-type DevopsAdoptionSegmentConnection {
- """
- A list of edges.
- """
- edges: [DevopsAdoptionSegmentEdge]
-
- """
- A list of nodes.
- """
- nodes: [DevopsAdoptionSegment]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DevopsAdoptionSegmentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DevopsAdoptionSegment
-}
-
-"""
-Snapshot
-"""
-type DevopsAdoptionSnapshot {
- """
- At least one deployment succeeded.
- """
- deploySucceeded: Boolean!
-
- """
- The end time for the snapshot where the data points were collected.
- """
- endTime: Time!
-
- """
- At least one issue was opened.
- """
- issueOpened: Boolean!
-
- """
- At least one merge request was approved.
- """
- mergeRequestApproved: Boolean!
-
- """
- At least one merge request was opened.
- """
- mergeRequestOpened: Boolean!
-
- """
- At least one pipeline succeeded.
- """
- pipelineSucceeded: Boolean!
-
- """
- The time the snapshot was recorded.
- """
- recordedAt: Time!
-
- """
- At least one runner was used.
- """
- runnerConfigured: Boolean!
-
- """
- At least one security scan succeeded.
- """
- securityScanSucceeded: Boolean!
-
- """
- The start time for the snapshot where the data points were collected.
- """
- startTime: Time!
-}
-
-input DiffImagePositionInput {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- Total height of the image.
- """
- height: Int!
-
- """
- The paths of the file that was changed. Both of the properties of this input
- are optional, but at least one of them is required
- """
- paths: DiffPathsInput!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-
- """
- Total width of the image.
- """
- width: Int!
-
- """
- X position of the note.
- """
- x: Int!
-
- """
- Y position of the note.
- """
- y: Int!
-}
-
-"""
-Identifier of DiffNote.
-"""
-scalar DiffNoteID
-
-input DiffPathsInput {
- """
- The path of the file on the head sha.
- """
- newPath: String
-
- """
- The path of the file on the start sha.
- """
- oldPath: String
-}
-
-type DiffPosition {
- """
- Information about the branch, HEAD, and base at the time of commenting.
- """
- diffRefs: DiffRefs!
-
- """
- Path of the file that was changed.
- """
- filePath: String!
-
- """
- Total height of the image.
- """
- height: Int
-
- """
- Line on HEAD SHA that was changed.
- """
- newLine: Int
-
- """
- Path of the file on the HEAD SHA.
- """
- newPath: String
-
- """
- Line on start SHA that was changed.
- """
- oldLine: Int
-
- """
- Path of the file on the start SHA.
- """
- oldPath: String
-
- """
- Type of file the position refers to.
- """
- positionType: DiffPositionType!
-
- """
- Total width of the image.
- """
- width: Int
-
- """
- X position of the note.
- """
- x: Int
-
- """
- Y position of the note.
- """
- y: Int
-}
-
-input DiffPositionInput {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- Line on HEAD SHA that was changed.
- """
- newLine: Int!
-
- """
- Line on start SHA that was changed.
- """
- oldLine: Int
-
- """
- The paths of the file that was changed. Both of the properties of this input
- are optional, but at least one of them is required
- """
- paths: DiffPathsInput!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-}
-
-"""
-Type of file the position refers to
-"""
-enum DiffPositionType {
- image
- text
-}
-
-type DiffRefs {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-}
-
-"""
-Changes to a single file
-"""
-type DiffStats {
- """
- Number of lines added to this file.
- """
- additions: Int!
-
- """
- Number of lines deleted from this file.
- """
- deletions: Int!
-
- """
- File path, relative to repository root.
- """
- path: String!
-}
-
-"""
-Aggregated summary of changes
-"""
-type DiffStatsSummary {
- """
- Number of lines added.
- """
- additions: Int!
-
- """
- Number of lines changed.
- """
- changes: Int!
-
- """
- Number of lines deleted.
- """
- deletions: Int!
-
- """
- Number of files changed.
- """
- fileCount: Int!
-}
-
-type Discussion implements ResolvableInterface {
- """
- Timestamp of the discussion's creation.
- """
- createdAt: Time!
-
- """
- ID of this discussion.
- """
- id: DiscussionID!
-
- """
- All notes in the discussion.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- ID used to reply to this discussion.
- """
- replyId: DiscussionID!
-
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-}
-
-"""
-The connection type for Discussion.
-"""
-type DiscussionConnection {
- """
- A list of edges.
- """
- edges: [DiscussionEdge]
-
- """
- A list of nodes.
- """
- nodes: [Discussion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DiscussionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Discussion
-}
-
-"""
-Identifier of Discussion.
-"""
-scalar DiscussionID
-
-"""
-Autogenerated input type of DiscussionToggleResolve
-"""
-input DiscussionToggleResolveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the discussion.
- """
- id: DiscussionID!
-
- """
- Will resolve the discussion when true, and unresolve the discussion when false.
- """
- resolve: Boolean!
-}
-
-"""
-Autogenerated return type of DiscussionToggleResolve
-"""
-type DiscussionToggleResolvePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The discussion after mutation.
- """
- discussion: Discussion
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DismissVulnerability
-"""
-input DismissVulnerabilityInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Comment why vulnerability should be dismissed.
- """
- comment: String
-
- """
- Reason why vulnerability should be dismissed.
- """
- dismissalReason: VulnerabilityDismissalReason
-
- """
- ID of the vulnerability to be dismissed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of DismissVulnerability
-"""
-type DismissVulnerabilityPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after dismissal.
- """
- vulnerability: Vulnerability
-}
-
-interface Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-}
-
-"""
-Type of a tree entry
-"""
-enum EntryType {
- blob
- commit
- tree
-}
-
-"""
-Describes where code is deployed for a project
-"""
-type Environment {
- """
- ID of the environment.
- """
- id: ID!
-
- """
- The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.
- """
- latestOpenedMostSevereAlert: AlertManagementAlert
-
- """
- Metrics dashboard schema for the environment.
- """
- metricsDashboard(
- """
- Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'.
- """
- path: String!
- ): MetricsDashboard
-
- """
- Human-readable name of the environment.
- """
- name: String!
-
- """
- The path to the environment.
- """
- path: String!
-
- """
- State of the environment, for example: available/stopped.
- """
- state: String!
-}
-
-"""
-The connection type for Environment.
-"""
-type EnvironmentConnection {
- """
- A list of edges.
- """
- edges: [EnvironmentEdge]
-
- """
- A list of nodes.
- """
- nodes: [Environment]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EnvironmentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Environment
-}
-
-"""
-Identifier of Environment.
-"""
-scalar EnvironmentID
-
-"""
-Autogenerated input type of EnvironmentsCanaryIngressUpdate
-"""
-input EnvironmentsCanaryIngressUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the environment to update.
- """
- id: EnvironmentID!
-
- """
- The weight of the Canary Ingress.
- """
- weight: Int!
-}
-
-"""
-Autogenerated return type of EnvironmentsCanaryIngressUpdate
-"""
-type EnvironmentsCanaryIngressUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an epic
-"""
-type Epic implements CurrentUserTodos & Eventable & Noteable {
- """
- Author of the epic.
- """
- author: User!
-
- """
- A list of award emojis associated with the epic.
- """
- awardEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AwardEmojiConnection
-
- """
- Children (sub-epics) of the epic.
- """
- children(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Timestamp of when the epic was closed.
- """
- closedAt: Time
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of when the epic was created.
- """
- createdAt: Time
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Number of open and closed descendant epics and issues.
- """
- descendantCounts: EpicDescendantCount
-
- """
- Total weight of open and closed issues in the epic and its descendants.
- """
- descendantWeightSum: EpicDescendantWeights
-
- """
- Description of the epic.
- """
- description: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the epic has received.
- """
- downvotes: Int!
-
- """
- Due date of the epic.
- """
- dueDate: Time
-
- """
- Fixed due date of the epic.
- """
- dueDateFixed: Time
-
- """
- Inherited due date of the epic from milestones.
- """
- dueDateFromMilestones: Time
-
- """
- Indicates if the due date has been manually set.
- """
- dueDateIsFixed: Boolean
-
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-
- """
- Group to which the epic belongs.
- """
- group: Group!
-
- """
- Indicates if the epic has children.
- """
- hasChildren: Boolean!
-
- """
- Indicates if the epic has direct issues.
- """
- hasIssues: Boolean!
-
- """
- Indicates if the epic has a parent epic.
- """
- hasParent: Boolean!
-
- """
- Current health status of the epic.
- """
- healthStatus: EpicHealthStatus
-
- """
- ID of the epic.
- """
- id: ID!
-
- """
- Internal ID of the epic.
- """
- iid: ID!
-
- """
- A list of issues associated with the epic.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicIssueConnection
-
- """
- Labels assigned to the epic.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Parent epic of the epic.
- """
- parent: Epic
-
- """
- List of participants for the epic.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the epic. Returned in shortened format by default.
- """
- reference(
- """
- Indicates if the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relationship.
- """
- relationPath: String
-
- """
- The relative position of the epic in the epic tree.
- """
- relativePosition: Int
-
- """
- Start date of the epic.
- """
- startDate: Time
-
- """
- Fixed start date of the epic.
- """
- startDateFixed: Time
-
- """
- Inherited start date of the epic from milestones.
- """
- startDateFromMilestones: Time
-
- """
- Indicates if the start date has been manually set.
- """
- startDateIsFixed: Boolean
-
- """
- State of the epic.
- """
- state: EpicState!
-
- """
- Indicates the currently logged in user is subscribed to the epic.
- """
- subscribed: Boolean!
-
- """
- Title of the epic.
- """
- title: String
-
- """
- Timestamp of when the epic was updated.
- """
- updatedAt: Time
-
- """
- Number of upvotes the epic has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the epic.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the epic.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: EpicPermissions!
-
- """
- Web path of the epic.
- """
- webPath: String!
-
- """
- Web URL of the epic.
- """
- webUrl: String!
-}
-
-"""
-Autogenerated input type of EpicAddIssue
-"""
-input EpicAddIssueInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the epic to mutate belongs to.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The IID of the issue to be added.
- """
- issueIid: String!
-
- """
- The full path of the project the issue belongs to.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of EpicAddIssue
-"""
-type EpicAddIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- The epic-issue relation.
- """
- epicIssue: EpicIssue
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an epic board
-"""
-type EpicBoard {
- """
- Global ID of the board.
- """
- id: BoardsEpicBoardID!
-
- """
- Epic board lists.
- """
- lists(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find an epic board list by ID.
- """
- id: BoardsEpicListID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicListConnection
-
- """
- Name of the board.
- """
- name: String
-}
-
-"""
-The connection type for EpicBoard.
-"""
-type EpicBoardConnection {
- """
- A list of edges.
- """
- edges: [EpicBoardEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicBoard]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of EpicBoardCreate
-"""
-input EpicBoardCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The board name.
- """
- name: String
-}
-
-"""
-Autogenerated return type of EpicBoardCreate
-"""
-type EpicBoardCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created epic board.
- """
- epicBoard: EpicBoard
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicBoardEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicBoard
-}
-
-"""
-Autogenerated input type of EpicBoardListCreate
-"""
-input EpicBoardListCreateInput {
- """
- Create the backlog list.
- """
- backlog: Boolean
-
- """
- Global ID of the issue board to mutate.
- """
- boardId: BoardsEpicBoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of an existing label.
- """
- labelId: LabelID
-}
-
-"""
-Autogenerated return type of EpicBoardListCreate
-"""
-type EpicBoardListCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Epic list in the epic board.
- """
- list: EpicList
-}
-
-"""
-The connection type for Epic.
-"""
-type EpicConnection {
- """
- A list of edges.
- """
- edges: [EpicEdge]
-
- """
- A list of nodes.
- """
- nodes: [Epic]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Counts of descendent epics
-"""
-type EpicDescendantCount {
- """
- Number of closed child epics.
- """
- closedEpics: Int
-
- """
- Number of closed epic issues.
- """
- closedIssues: Int
-
- """
- Number of opened child epics.
- """
- openedEpics: Int
-
- """
- Number of opened epic issues.
- """
- openedIssues: Int
-}
-
-"""
-Total weight of open and closed descendant issues
-"""
-type EpicDescendantWeights {
- """
- Total weight of completed (closed) issues in this epic, including epic descendants.
- """
- closedIssues: Int
-
- """
- Total weight of opened issues in this epic, including epic descendants.
- """
- openedIssues: Int
-}
-
-"""
-An edge in a connection.
-"""
-type EpicEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Epic
-}
-
-"""
-Health status of child issues
-"""
-type EpicHealthStatus {
- """
- Number of issues at risk.
- """
- issuesAtRisk: Int
-
- """
- Number of issues that need attention.
- """
- issuesNeedingAttention: Int
-
- """
- Number of issues on track.
- """
- issuesOnTrack: Int
-}
-
-"""
-Identifier of Epic.
-"""
-scalar EpicID
-
-"""
-Relationship between an epic and an issue
-"""
-type EpicIssue implements CurrentUserTodos & Noteable {
- """
- Alert associated to this issue.
- """
- alertManagementAlert: AlertManagementAlert
-
- """
- Assignees of the issue.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User that created the issue.
- """
- author: User!
-
- """
- Indicates the issue is blocked.
- """
- blocked: Boolean!
-
- """
- Count of issues blocking this issue.
- """
- blockedByCount: Int
-
- """
- Timestamp of when the issue was closed.
- """
- closedAt: Time
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean!
-
- """
- User specific email address for the issue.
- """
- createNoteEmail: String
-
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Collection of design images associated with this issue.
- """
- designCollection: DesignCollection
-
- """
- Indicates discussion is locked on the issue.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the issue has received.
- """
- downvotes: Int!
-
- """
- Due date of the issue.
- """
- dueDate: Time
-
- """
- Indicates if a project has email notifications disabled: `true` if email notifications are disabled.
- """
- emailsDisabled: Boolean!
-
- """
- Epic to which this issue belongs.
- """
- epic: Epic
-
- """
- ID of the epic-issue relation.
- """
- epicIssueId: ID!
-
- """
- Current health status.
- """
- healthStatus: HealthStatus
-
- """
- Human-readable time estimate of the issue.
- """
- humanTimeEstimate: String
-
- """
- Human-readable total time reported as spent on the issue.
- """
- humanTotalTimeSpent: String
-
- """
- Global ID of the epic-issue relation.
- """
- id: ID
-
- """
- Internal ID of the issue.
- """
- iid: ID!
-
- """
- Iteration of the issue.
- """
- iteration: Iteration
-
- """
- Labels of the issue.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Metric images associated to the issue.
- """
- metricImages: [MetricImage!]
-
- """
- Milestone of the issue.
- """
- milestone: Milestone
-
- """
- Indicates if issue got moved from other project.
- """
- moved: Boolean
-
- """
- Updated Issue after it got moved to another project.
- """
- movedTo: Issue
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- List of participants in the issue.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the issue. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relation.
- """
- relationPath: String
-
- """
- Relative position of the issue (used for positioning in epic tree and issue boards).
- """
- relativePosition: Int
-
- """
- Severity level of the incident.
- """
- severity: IssuableSeverity
-
- """
- Timestamp of when the issue SLA expires.
- """
- slaDueAt: Time
-
- """
- State of the issue.
- """
- state: IssueState!
-
- """
- Indicates whether an issue is published to the status page.
- """
- statusPagePublishedIncident: Boolean
-
- """
- Indicates the currently logged in user is subscribed to the issue.
- """
- subscribed: Boolean!
-
- """
- Task completion status of the issue.
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the issue.
- """
- timeEstimate: Int!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the issue.
- """
- totalTimeSpent: Int!
-
- """
- Type of the issue.
- """
- type: IssueType
-
- """
- Timestamp of when the issue was last updated.
- """
- updatedAt: Time!
-
- """
- User that last updated the issue.
- """
- updatedBy: User
-
- """
- Number of upvotes the issue has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the issue.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the issue.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: IssuePermissions!
-
- """
- Web path of the issue.
- """
- webPath: String!
-
- """
- Web URL of the issue.
- """
- webUrl: String!
-
- """
- Weight of the issue.
- """
- weight: Int
-}
-
-"""
-The connection type for EpicIssue.
-"""
-type EpicIssueConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [EpicIssueEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicIssue]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total weight of issues collection.
- """
- weight: Int!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicIssueEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicIssue
-}
-
-"""
-Represents an epic board list
-"""
-type EpicList {
- """
- List epics.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicConnection
-
- """
- Global ID of the board list.
- """
- id: BoardsEpicListID!
-
- """
- Label of the list.
- """
- label: Label
-
- """
- Type of the list.
- """
- listType: String!
-
- """
- Position of the list within the board.
- """
- position: Int
-
- """
- Title of the list.
- """
- title: String!
-}
-
-"""
-The connection type for EpicList.
-"""
-type EpicListConnection {
- """
- A list of edges.
- """
- edges: [EpicListEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicList]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicListEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicList
-}
-
-"""
-Check permissions for the current user on an epic
-"""
-type EpicPermissions {
- """
- Indicates the user can perform `admin_epic` on this resource
- """
- adminEpic: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_epic` on this resource
- """
- createEpic: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `destroy_epic` on this resource
- """
- destroyEpic: Boolean!
-
- """
- Indicates the user can perform `read_epic` on this resource
- """
- readEpic: Boolean!
-
- """
- Indicates the user can perform `read_epic_iid` on this resource
- """
- readEpicIid: Boolean!
-
- """
- Indicates the user can perform `update_epic` on this resource
- """
- updateEpic: Boolean!
-}
-
-"""
-Autogenerated input type of EpicSetSubscription
-"""
-input EpicSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the epic to mutate belongs to.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of EpicSetSubscription
-"""
-type EpicSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Roadmap sort values
-"""
-enum EpicSort {
- """
- End date at ascending order
- """
- end_date_asc
-
- """
- End date at descending order
- """
- end_date_desc
-
- """
- Start date at ascending order
- """
- start_date_asc
-
- """
- Start date at descending order
- """
- start_date_desc
-}
-
-"""
-State of an epic
-"""
-enum EpicState {
- all
- closed
- opened
-}
-
-"""
-State event of an epic
-"""
-enum EpicStateEvent {
- """
- Close the epic
- """
- CLOSE
-
- """
- Reopen the epic
- """
- REOPEN
-}
-
-"""
-A node of an epic tree.
-"""
-input EpicTreeNodeFieldsInputType {
- """
- The ID of the epic_issue or issue that the actual epic or issue is switched with.
- """
- adjacentReferenceId: EpicTreeSortingID
-
- """
- The ID of the epic_issue or epic that is being moved.
- """
- id: EpicTreeSortingID!
-
- """
- ID of the new parent epic.
- """
- newParentId: EpicID
-
- """
- The type of the switch, after or before allowed.
- """
- relativePosition: MoveType
-}
-
-"""
-Autogenerated input type of EpicTreeReorder
-"""
-input EpicTreeReorderInput {
- """
- The ID of the base epic of the tree.
- """
- baseEpicId: EpicID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Parameters for updating the tree positions.
- """
- moved: EpicTreeNodeFieldsInputType!
-}
-
-"""
-Autogenerated return type of EpicTreeReorder
-"""
-type EpicTreeReorderPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Identifier of EpicTreeSorting.
-"""
-scalar EpicTreeSortingID
-
-"""
-Epic ID wildcard values
-"""
-enum EpicWildcardId {
- """
- Any epic is assigned
- """
- ANY
-
- """
- No epic is assigned
- """
- NONE
-}
-
-"""
-Representing an event
-"""
-type Event {
- """
- Action of the event.
- """
- action: EventAction!
-
- """
- Author of this event.
- """
- author: User!
-
- """
- When this event was created.
- """
- createdAt: Time!
-
- """
- ID of the event.
- """
- id: ID!
-
- """
- When this event was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Event action
-"""
-enum EventAction {
- """
- Approved action
- """
- APPROVED
-
- """
- Archived action
- """
- ARCHIVED
-
- """
- Closed action
- """
- CLOSED
-
- """
- Commented action
- """
- COMMENTED
-
- """
- Created action
- """
- CREATED
-
- """
- Destroyed action
- """
- DESTROYED
-
- """
- Expired action
- """
- EXPIRED
-
- """
- Joined action
- """
- JOINED
-
- """
- Left action
- """
- LEFT
-
- """
- Merged action
- """
- MERGED
-
- """
- Pushed action
- """
- PUSHED
-
- """
- Reopened action
- """
- REOPENED
-
- """
- Updated action
- """
- UPDATED
-}
-
-"""
-The connection type for Event.
-"""
-type EventConnection {
- """
- A list of edges.
- """
- edges: [EventEdge]
-
- """
- A list of nodes.
- """
- nodes: [Event]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EventEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Event
-}
-
-interface Eventable {
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-}
-
-"""
-Autogenerated input type of ExportRequirements
-"""
-input ExportRequirementsInput {
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full project path the requirements are associated with.
- """
- projectPath: ID!
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List of selected requirements fields to be exported.
- """
- selectedFields: [String!]
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
-}
-
-"""
-Autogenerated return type of ExportRequirements
-"""
-type ExportRequirementsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an external issue
-"""
-type ExternalIssue {
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time
-
- """
- Type of external tracker.
- """
- externalTracker: String
-
- """
- Relative reference of the issue in the external tracker.
- """
- relativeReference: String
-
- """
- Status of the issue in the external tracker.
- """
- status: String
-
- """
- Title of the issue in the external tracker.
- """
- title: String
-
- """
- Timestamp of when the issue was updated.
- """
- updatedAt: Time
-
- """
- URL to the issue in the external tracker.
- """
- webUrl: String
-}
-
-type GeoNode {
- """
- The maximum concurrency of container repository sync for this secondary node.
- """
- containerRepositoriesMaxCapacity: Int
-
- """
- Indicates whether this Geo node is enabled.
- """
- enabled: Boolean
-
- """
- The maximum concurrency of LFS/attachment backfill for this secondary node.
- """
- filesMaxCapacity: Int
-
- """
- ID of this GeoNode.
- """
- id: ID!
-
- """
- The URL defined on the primary node that secondary nodes should use to contact it.
- """
- internalUrl: String
-
- """
- Find merge request diff registries on this Geo node.
- """
- mergeRequestDiffRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): MergeRequestDiffRegistryConnection
-
- """
- The interval (in days) in which the repository verification is valid. Once expired, it will be reverified.
- """
- minimumReverificationInterval: Int
-
- """
- The unique identifier for this Geo node.
- """
- name: String
-
- """
- Package file registries of the GeoNode.
- """
- packageFileRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageFileRegistryConnection
-
- """
- Indicates whether this Geo node is the primary.
- """
- primary: Boolean
-
- """
- The maximum concurrency of repository backfill for this secondary node.
- """
- reposMaxCapacity: Int
-
- """
- The namespaces that should be synced, if `selective_sync_type` == `namespaces`.
- """
- selectiveSyncNamespaces(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NamespaceConnection
-
- """
- The repository storages whose projects should be synced, if `selective_sync_type` == `shards`.
- """
- selectiveSyncShards: [String!]
-
- """
- Indicates if syncing is limited to only specific groups, or shards.
- """
- selectiveSyncType: String
-
- """
- Find snippet repository registries on this Geo node.
- """
- snippetRepositoryRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SnippetRepositoryRegistryConnection
-
- """
- Indicates if this secondary node will replicate blobs in Object Storage.
- """
- syncObjectStorage: Boolean
-
- """
- Find terraform state version registries on this Geo node.
- """
- terraformStateVersionRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TerraformStateVersionRegistryConnection
-
- """
- The user-facing URL for this Geo node.
- """
- url: String
-
- """
- The maximum concurrency of repository verification for this secondary node.
- """
- verificationMaxCapacity: Int
-}
-
-"""
-Identifier of Gitlab::ErrorTracking::DetailedError.
-"""
-scalar GitlabErrorTrackingDetailedErrorID
-
-"""
-Autogenerated input type of GitlabSubscriptionActivate
-"""
-input GitlabSubscriptionActivateInput {
- """
- Activation code received after purchasing a GitLab subscription.
- """
- activationCode: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-}
-
-"""
-Autogenerated return type of GitlabSubscriptionActivate
-"""
-type GitlabSubscriptionActivatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type GrafanaIntegration {
- """
- Timestamp of the issue's creation.
- """
- createdAt: Time!
-
- """
- Indicates whether Grafana integration is enabled.
- """
- enabled: Boolean!
-
- """
- URL for the Grafana host for the Grafana integration.
- """
- grafanaUrl: String!
-
- """
- Internal ID of the Grafana integration.
- """
- id: ID!
-
- """
- Timestamp of the issue's last activity.
- """
- updatedAt: Time!
-}
-
-type Group {
- """
- Size limit for repositories in the namespace in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- Additional storage purchased for the root namespace in bytes.
- """
- additionalPurchasedStorageSize: Float
-
- """
- Indicates whether Auto DevOps is enabled for all projects within this group.
- """
- autoDevopsEnabled: Boolean
-
- """
- Avatar URL of the group.
- """
- avatarUrl: String
-
- """
- A single board of the group.
- """
- board(
- """
- The board's ID.
- """
- id: BoardID!
- ): Board
-
- """
- Boards of the group.
- """
- boards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a board by its ID.
- """
- id: BoardID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardConnection
-
- """
- Represents the code coverage activity for this group.
- """
- codeCoverageActivities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch code coverage activity (maximum time window is set to 90 days).
- """
- startDate: Date!
- ): CodeCoverageActivityConnection
-
- """
- Compliance frameworks available to projects in this namespace. Available only
- when feature flag `ff_custom_compliance_frameworks` is enabled.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of a specific compliance framework to return.
- """
- id: ComplianceManagementFrameworkID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- Container repositories of the group.
- """
- containerRepositories(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter the container repositories by their name.
- """
- name: String
-
- """
- Sort container repositories by this criteria.
- """
- sort: ContainerRepositorySort = created_desc
- ): ContainerRepositoryConnection
-
- """
- Number of container repositories in the group.
- """
- containerRepositoriesCount: Int!
-
- """
- Includes at least one project where the repository size exceeds the limit.
- """
- containsLockedProjects: Boolean!
-
- """
- Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled.
- """
- customEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CustomEmojiConnection
-
- """
- Description of the namespace.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Indicates if a group has email notifications disabled.
- """
- emailsDisabled: Boolean
-
- """
- Find a single epic.
- """
- epic(
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): Epic
-
- """
- Find a single epic board.
- """
- epicBoard(
- """
- Find an epic board by ID.
- """
- id: BoardsEpicBoardID!
- ): EpicBoard
-
- """
- Find epic boards.
- """
- epicBoards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicBoardConnection
-
- """
- Find epics.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Indicates if Epics are enabled for namespace
- """
- epicsEnabled: Boolean
-
- """
- Full name of the namespace.
- """
- fullName: String!
-
- """
- Full path of the namespace.
- """
- fullPath: ID!
-
- """
- A membership of a user within this group.
- """
- groupMembers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter members by the given member relations.
- """
- relations: [GroupMemberRelation!] = [DIRECT, INHERITED]
-
- """
- Search query.
- """
- search: String
- ): GroupMemberConnection
-
- """
- Indicates if Group timelogs are enabled for namespace
- """
- groupTimelogsEnabled: Boolean
-
- """
- ID of the namespace.
- """
- id: ID!
-
- """
- Status of the temporary storage increase.
- """
- isTemporaryStorageIncreaseEnabled: Boolean!
-
- """
- Issues for projects in this group.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Include issues belonging to subgroups
- """
- includeSubgroups: Boolean = false
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueConnection
-
- """
- Find iterations.
- """
- iterations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of the Iteration to look up.
- """
- id: ID
-
- """
- Internal ID of the Iteration to look up.
- """
- iid: ID
-
- """
- Whether to include ancestor iterations. Defaults to true.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter iterations by state.
- """
- state: IterationState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- Fuzzy search by title.
- """
- title: String
- ): IterationConnection
-
- """
- A label available on this group.
- """
- label(
- """
- Title of the label.
- """
- title: String!
- ): Label
-
- """
- Labels available on this group.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Include labels from ancestor groups.
- """
- includeAncestorGroups: Boolean = false
-
- """
- Include labels from descendant groups.
- """
- includeDescendantGroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Include only group level labels.
- """
- onlyGroupLabels: Boolean = false
-
- """
- A search term to find labels with.
- """
- searchTerm: String
- ): LabelConnection
-
- """
- Indicates if Large File Storage (LFS) is enabled for namespace.
- """
- lfsEnabled: Boolean
-
- """
- Indicates if a group is disabled from getting mentioned.
- """
- mentionsDisabled: Boolean
-
- """
- Merge requests for projects in this group.
- """
- mergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Include merge requests belonging to subgroups
- """
- includeSubgroups: Boolean = false
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Milestones of the group.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- A date that the milestone contains.
- """
- containingDate: Time
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global milestone IDs, e.g., "gid://gitlab/Milestone/1".
- """
- ids: [ID!]
-
- """
- Also return milestones in all subgroups and subprojects.
- """
- includeDescendants: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search string for the title.
- """
- searchTitle: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter milestones by state.
- """
- state: MilestoneStateEnum
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- The title of the milestone.
- """
- title: String
- ): MilestoneConnection
-
- """
- Name of the namespace.
- """
- name: String!
-
- """
- The package settings for the namespace.
- """
- packageSettings: PackageSettings
-
- """
- Parent group.
- """
- parent: Group
-
- """
- Path of the namespace.
- """
- path: String!
-
- """
- The permission level required to create projects in the group.
- """
- projectCreationLevel: String
-
- """
- Projects within this namespace.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the projects which have vulnerabilities.
- """
- hasVulnerabilities: Boolean = false
-
- """
- Include also subgroup projects.
- """
- includeSubgroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search project with most similar names or paths.
- """
- search: String = null
-
- """
- Sort projects by this criteria.
- """
- sort: NamespaceProjectSort = null
- ): ProjectConnection!
-
- """
- Number of projects in the root namespace where the repository size exceeds the limit.
- """
- repositorySizeExcessProjectCount: Int!
-
- """
- Indicates if users can request access to namespace.
- """
- requestAccessEnabled: Boolean
-
- """
- Indicates if all users in this group are required to set up two-factor authentication.
- """
- requireTwoFactorAuthentication: Boolean
-
- """
- Aggregated storage statistics of the namespace. Only available for root namespaces.
- """
- rootStorageStatistics: RootStorageStatistics
-
- """
- Indicates if sharing a project with another group within this group is prevented.
- """
- shareWithGroupLock: Boolean
-
- """
- Group statistics.
- """
- stats: GroupStats
-
- """
- Total storage limit of the root namespace in bytes.
- """
- storageSizeLimit: Float
-
- """
- The permission level required to create subgroups within the group.
- """
- subgroupCreationLevel: String
-
- """
- Date until the temporary storage increase is active.
- """
- temporaryStorageIncreaseEndsOn: Time
-
- """
- Time logged in issues by group members.
- """
- timelogs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List time logs within a date range where the logged date is equal to or before endDate.
- """
- endDate: Time
-
- """
- List time-logs within a time range where the logged time is equal to or before endTime.
- """
- endTime: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List time logs within a date range where the logged date is equal to or after startDate.
- """
- startDate: Time
-
- """
- List time-logs within a time range where the logged time is equal to or after startTime.
- """
- startTime: Time
- ): TimelogConnection!
-
- """
- Total repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySize: Float
-
- """
- Total excess repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySizeExcess: Float
-
- """
- Time before two-factor authentication is enforced.
- """
- twoFactorGracePeriod: Int
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: GroupPermissions!
-
- """
- Visibility of the namespace.
- """
- visibility: String
-
- """
- Vulnerabilities reported on the projects in the group and its subgroups.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the projects in the group and its subgroups.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Number of vulnerabilities per severity level, per day, for the projects in the
- group and its subgroups. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.
- """
- vulnerabilitiesCountByDayAndSeverity(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayAndSeverityConnection @deprecated(reason: "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3.")
-
- """
- Represents vulnerable project counts for each grade.
- """
- vulnerabilityGrades(
- """
- Include grades belonging to subgroups.
- """
- includeSubgroups: Boolean = false
- ): [VulnerableProjectsByGrade!]!
-
- """
- Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity in the group and its subgroups.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-
- """
- Web URL of the group.
- """
- webUrl: String!
-}
-
-"""
-Identifier of Group.
-"""
-scalar GroupID
-
-"""
-Represents a Group Membership
-"""
-type GroupMember implements MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- Group that a User is a member of.
- """
- group: Group
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: GroupPermissions!
-}
-
-"""
-The connection type for GroupMember.
-"""
-type GroupMemberConnection {
- """
- A list of edges.
- """
- edges: [GroupMemberEdge]
-
- """
- A list of nodes.
- """
- nodes: [GroupMember]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type GroupMemberEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: GroupMember
-}
-
-"""
-Group member relation
-"""
-enum GroupMemberRelation {
- """
- Descendants members
- """
- DESCENDANTS
-
- """
- Direct members
- """
- DIRECT
-
- """
- Inherited members
- """
- INHERITED
-}
-
-type GroupPermissions {
- """
- Indicates the user can perform `read_group` on this resource
- """
- readGroup: Boolean!
-}
-
-"""
-Contains release-related statistics about a group
-"""
-type GroupReleaseStats {
- """
- Total number of releases in all descendant projects of the group. Will always
- return `null` if `group_level_release_statistics` feature flag is disabled
- """
- releasesCount: Int
-
- """
- Percentage of the group's descendant projects that have at least one release.
- Will always return `null` if `group_level_release_statistics` feature flag is disabled
- """
- releasesPercentage: Int
-}
-
-"""
-Contains statistics about a group
-"""
-type GroupStats {
- """
- Statistics related to releases within the group.
- """
- releaseStats: GroupReleaseStats
-}
-
-"""
-Health status of an issue or epic
-"""
-enum HealthStatus {
- atRisk
- needsAttention
- onTrack
-}
-
-"""
-Autogenerated input type of HttpIntegrationCreate
-"""
-input HttpIntegrationCreateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The name of the integration.
- """
- name: String!
-
- """
- The custom mapping of GitLab alert attributes to fields from the payload_example.
- """
- payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
-
- """
- The example of an alert payload.
- """
- payloadExample: JsonString
-
- """
- The project to create the integration in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationCreate
-"""
-type HttpIntegrationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationDestroy
-"""
-input HttpIntegrationDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to remove.
- """
- id: AlertManagementHttpIntegrationID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationDestroy
-"""
-type HttpIntegrationDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationResetToken
-"""
-input HttpIntegrationResetTokenInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: AlertManagementHttpIntegrationID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationResetToken
-"""
-type HttpIntegrationResetTokenPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationUpdate
-"""
-input HttpIntegrationUpdateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: AlertManagementHttpIntegrationID!
-
- """
- The name of the integration.
- """
- name: String
-
- """
- The custom mapping of GitLab alert attributes to fields from the payload_example.
- """
- payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
-
- """
- The example of an alert payload.
- """
- payloadExample: JsonString
-}
-
-"""
-Autogenerated return type of HttpIntegrationUpdate
-"""
-type HttpIntegrationUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-An ISO 8601-encoded date
-"""
-scalar ISO8601Date
-
-"""
-Identifier of IncidentManagement::OncallParticipant.
-"""
-scalar IncidentManagementOncallParticipantID
-
-"""
-Describes an incident management on-call rotation
-"""
-type IncidentManagementOncallRotation {
- """
- ID of the on-call rotation.
- """
- id: IncidentManagementOncallRotationID!
-
- """
- Length of the on-call schedule, in the units specified by lengthUnit.
- """
- length: Int
-
- """
- Unit of the on-call rotation length.
- """
- lengthUnit: OncallRotationUnitEnum
-
- """
- Name of the on-call rotation.
- """
- name: String!
-
- """
- Participants of the on-call rotation.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): OncallParticipantTypeConnection
-
- """
- Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month.
- """
- shifts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- End of timeframe to include shifts for. Cannot exceed one month after start.
- """
- endTime: Time!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Start of timeframe to include shifts for.
- """
- startTime: Time!
- ): IncidentManagementOncallShiftConnection
-
- """
- Start date of the on-call rotation.
- """
- startsAt: Time
-}
-
-"""
-The connection type for IncidentManagementOncallRotation.
-"""
-type IncidentManagementOncallRotationConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallRotationEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallRotation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallRotationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallRotation
-}
-
-"""
-Identifier of IncidentManagement::OncallRotation.
-"""
-scalar IncidentManagementOncallRotationID
-
-"""
-Describes an incident management on-call schedule
-"""
-type IncidentManagementOncallSchedule {
- """
- Description of the on-call schedule.
- """
- description: String
-
- """
- Internal ID of the on-call schedule.
- """
- iid: ID!
-
- """
- Name of the on-call schedule.
- """
- name: String!
-
- """
- On-call rotations for the on-call schedule.
- """
- rotations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IncidentManagementOncallRotationConnection!
-
- """
- Time zone of the on-call schedule.
- """
- timezone: String!
-}
-
-"""
-The connection type for IncidentManagementOncallSchedule.
-"""
-type IncidentManagementOncallScheduleConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallScheduleEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallSchedule]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallScheduleEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallSchedule
-}
-
-"""
-A block of time for which a participant is on-call.
-"""
-type IncidentManagementOncallShift {
- """
- End time of the on-call shift.
- """
- endsAt: Time
-
- """
- Participant assigned to the on-call shift.
- """
- participant: OncallParticipantType
-
- """
- Start time of the on-call shift.
- """
- startsAt: Time
-}
-
-"""
-The connection type for IncidentManagementOncallShift.
-"""
-type IncidentManagementOncallShiftConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallShiftEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallShift]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallShiftEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallShift
-}
-
-type InstanceSecurityDashboard {
- """
- Projects selected in Instance Security Dashboard.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectConnection!
-
- """
- Represents vulnerable project counts for each grade.
- """
- vulnerabilityGrades: [VulnerableProjectsByGrade!]!
-
- """
- Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity from projects selected in Instance Security Dashboard.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-}
-
-"""
-Represents a recorded measurement (object count) for the Admins
-"""
-type InstanceStatisticsMeasurement {
- """
- Object count.
- """
- count: Int!
-
- """
- The type of objects being measured.
- """
- identifier: MeasurementIdentifier!
-
- """
- The time the measurement was recorded.
- """
- recordedAt: Time
-}
-
-"""
-The connection type for InstanceStatisticsMeasurement.
-"""
-type InstanceStatisticsMeasurementConnection {
- """
- A list of edges.
- """
- edges: [InstanceStatisticsMeasurementEdge]
-
- """
- A list of nodes.
- """
- nodes: [InstanceStatisticsMeasurement]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type InstanceStatisticsMeasurementEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: InstanceStatisticsMeasurement
-}
-
-"""
-Incident severity
-"""
-enum IssuableSeverity {
- """
- Critical severity
- """
- CRITICAL
-
- """
- High severity
- """
- HIGH
-
- """
- Low severity
- """
- LOW
-
- """
- Medium severity
- """
- MEDIUM
-
- """
- Unknown severity
- """
- UNKNOWN
-}
-
-"""
-State of a GitLab issue or merge request
-"""
-enum IssuableState {
- all
- closed
- locked
- opened
-}
-
-type Issue implements CurrentUserTodos & Noteable {
- """
- Alert associated to this issue.
- """
- alertManagementAlert: AlertManagementAlert
-
- """
- Assignees of the issue.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User that created the issue.
- """
- author: User!
-
- """
- Indicates the issue is blocked.
- """
- blocked: Boolean!
-
- """
- Count of issues blocking this issue.
- """
- blockedByCount: Int
-
- """
- Timestamp of when the issue was closed.
- """
- closedAt: Time
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean!
-
- """
- User specific email address for the issue.
- """
- createNoteEmail: String
-
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Collection of design images associated with this issue.
- """
- designCollection: DesignCollection
-
- """
- Indicates discussion is locked on the issue.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the issue has received.
- """
- downvotes: Int!
-
- """
- Due date of the issue.
- """
- dueDate: Time
-
- """
- Indicates if a project has email notifications disabled: `true` if email notifications are disabled.
- """
- emailsDisabled: Boolean!
-
- """
- Epic to which this issue belongs.
- """
- epic: Epic
-
- """
- Current health status.
- """
- healthStatus: HealthStatus
-
- """
- Human-readable time estimate of the issue.
- """
- humanTimeEstimate: String
-
- """
- Human-readable total time reported as spent on the issue.
- """
- humanTotalTimeSpent: String
-
- """
- ID of the issue.
- """
- id: ID!
-
- """
- Internal ID of the issue.
- """
- iid: ID!
-
- """
- Iteration of the issue.
- """
- iteration: Iteration
-
- """
- Labels of the issue.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Metric images associated to the issue.
- """
- metricImages: [MetricImage!]
-
- """
- Milestone of the issue.
- """
- milestone: Milestone
-
- """
- Indicates if issue got moved from other project.
- """
- moved: Boolean
-
- """
- Updated Issue after it got moved to another project.
- """
- movedTo: Issue
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- List of participants in the issue.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the issue. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- Relative position of the issue (used for positioning in epic tree and issue boards).
- """
- relativePosition: Int
-
- """
- Severity level of the incident.
- """
- severity: IssuableSeverity
-
- """
- Timestamp of when the issue SLA expires.
- """
- slaDueAt: Time
-
- """
- State of the issue.
- """
- state: IssueState!
-
- """
- Indicates whether an issue is published to the status page.
- """
- statusPagePublishedIncident: Boolean
-
- """
- Indicates the currently logged in user is subscribed to the issue.
- """
- subscribed: Boolean!
-
- """
- Task completion status of the issue.
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the issue.
- """
- timeEstimate: Int!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the issue.
- """
- totalTimeSpent: Int!
-
- """
- Type of the issue.
- """
- type: IssueType
-
- """
- Timestamp of when the issue was last updated.
- """
- updatedAt: Time!
-
- """
- User that last updated the issue.
- """
- updatedBy: User
-
- """
- Number of upvotes the issue has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the issue.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the issue.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: IssuePermissions!
-
- """
- Web path of the issue.
- """
- webPath: String!
-
- """
- Web URL of the issue.
- """
- webUrl: String!
-
- """
- Weight of the issue.
- """
- weight: Int
-}
-
-"""
-The connection type for Issue.
-"""
-type IssueConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [IssueEdge]
-
- """
- A list of nodes.
- """
- nodes: [Issue]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total weight of issues collection.
- """
- weight: Int!
-}
-
-"""
-An edge in a connection.
-"""
-type IssueEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Issue
-}
-
-"""
-Identifier of Issue.
-"""
-scalar IssueID
-
-"""
-Autogenerated input type of IssueMove
-"""
-input IssueMoveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The project to move the issue to.
- """
- targetProjectPath: ID!
-}
-
-"""
-Autogenerated input type of IssueMoveList
-"""
-input IssueMoveListInput {
- """
- Global ID of the board that the issue is in.
- """
- boardId: ID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the parent epic. NULL when removing the association.
- """
- epicId: EpicID
-
- """
- ID of the board list that the issue will be moved from.
- """
- fromListId: ID
-
- """
- IID of the issue to mutate.
- """
- iid: String!
-
- """
- ID of issue that should be placed after the current issue.
- """
- moveAfterId: ID
-
- """
- ID of issue that should be placed before the current issue.
- """
- moveBeforeId: ID
-
- """
- Project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- ID of the board list that the issue will be moved to.
- """
- toListId: ID
-}
-
-"""
-Autogenerated return type of IssueMoveList
-"""
-type IssueMoveListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated return type of IssueMove
-"""
-type IssueMovePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Check permissions for the current user on a issue
-"""
-type IssuePermissions {
- """
- Indicates the user can perform `admin_issue` on this resource
- """
- adminIssue: Boolean!
-
- """
- Indicates the user can perform `create_design` on this resource
- """
- createDesign: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `destroy_design` on this resource
- """
- destroyDesign: Boolean!
-
- """
- Indicates the user can perform `read_design` on this resource
- """
- readDesign: Boolean!
-
- """
- Indicates the user can perform `read_issue` on this resource
- """
- readIssue: Boolean!
-
- """
- Indicates the user can perform `reopen_issue` on this resource
- """
- reopenIssue: Boolean!
-
- """
- Indicates the user can perform `update_issue` on this resource
- """
- updateIssue: Boolean!
-}
-
-"""
-Autogenerated input type of IssueSetAssignees
-"""
-input IssueSetAssigneesInput {
- """
- The usernames to assign to the resource. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetAssignees
-"""
-type IssueSetAssigneesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetConfidential
-"""
-input IssueSetConfidentialInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether or not to set the issue as a confidential.
- """
- confidential: Boolean!
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetConfidential
-"""
-type IssueSetConfidentialPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetDueDate
-"""
-input IssueSetDueDateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The desired due date for the issue.
- """
- dueDate: Time!
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetDueDate
-"""
-type IssueSetDueDatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetEpic
-"""
-input IssueSetEpicInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the epic to be assigned to the issue, epic will be removed if absent or set to null
- """
- epicId: EpicID
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetEpic
-"""
-type IssueSetEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetIteration
-"""
-input IssueSetIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The iteration to assign to the issue.
- """
- iterationId: IterationID
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetIteration
-"""
-type IssueSetIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetLocked
-"""
-input IssueSetLockedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- Whether or not to lock discussion on the issue.
- """
- locked: Boolean!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetLocked
-"""
-type IssueSetLockedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetSeverity
-"""
-input IssueSetSeverityInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- Set the incident severity level.
- """
- severity: IssuableSeverity!
-}
-
-"""
-Autogenerated return type of IssueSetSeverity
-"""
-type IssueSetSeverityPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetSubscription
-"""
-input IssueSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of IssueSetSubscription
-"""
-type IssueSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetWeight
-"""
-input IssueSetWeightInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired weight for the issue.
- """
- weight: Int!
-}
-
-"""
-Autogenerated return type of IssueSetWeight
-"""
-type IssueSetWeightPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Values for sorting issues
-"""
-enum IssueSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Due date by ascending order
- """
- DUE_DATE_ASC
-
- """
- Due date by descending order
- """
- DUE_DATE_DESC
-
- """
- Label priority by ascending order
- """
- LABEL_PRIORITY_ASC
-
- """
- Label priority by descending order
- """
- LABEL_PRIORITY_DESC
-
- """
- Milestone due date by ascending order
- """
- MILESTONE_DUE_ASC
-
- """
- Milestone due date by descending order
- """
- MILESTONE_DUE_DESC
-
- """
- Priority by ascending order
- """
- PRIORITY_ASC
-
- """
- Priority by descending order
- """
- PRIORITY_DESC
-
- """
- Published issues shown last
- """
- PUBLISHED_ASC
-
- """
- Published issues shown first
- """
- PUBLISHED_DESC
-
- """
- Relative position by ascending order
- """
- RELATIVE_POSITION_ASC
-
- """
- Severity from less critical to more critical
- """
- SEVERITY_ASC
-
- """
- Severity from more critical to less critical
- """
- SEVERITY_DESC
-
- """
- Issues with earliest SLA due time shown first
- """
- SLA_DUE_AT_ASC
-
- """
- Issues with latest SLA due time shown first
- """
- SLA_DUE_AT_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Weight by ascending order
- """
- WEIGHT_ASC
-
- """
- Weight by descending order
- """
- WEIGHT_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-State of a GitLab issue
-"""
-enum IssueState {
- all
- closed
- locked
- opened
-}
-
-"""
-Values for issue state events
-"""
-enum IssueStateEvent {
- """
- Closes the issue
- """
- CLOSE
-
- """
- Reopens the issue
- """
- REOPEN
-}
-
-"""
-Represents total number of issues for the represented statuses
-"""
-type IssueStatusCountsType {
- """
- Number of issues with status ALL for the project
- """
- all: Int
-
- """
- Number of issues with status CLOSED for the project
- """
- closed: Int
-
- """
- Number of issues with status OPENED for the project
- """
- opened: Int
-}
-
-"""
-Issue type
-"""
-enum IssueType {
- """
- Incident issue type
- """
- INCIDENT
-
- """
- Issue issue type
- """
- ISSUE
-
- """
- Test Case issue type
- """
- TEST_CASE
-}
-
-"""
-Represents an iteration object
-"""
-type Iteration implements TimeboxReportInterface {
- """
- Timestamp of iteration creation.
- """
- createdAt: Time!
-
- """
- Description of the iteration.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Timestamp of the iteration due date.
- """
- dueDate: Time
-
- """
- ID of the iteration.
- """
- id: ID!
-
- """
- Internal ID of the iteration.
- """
- iid: ID!
-
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-
- """
- Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.
- """
- scopedPath: String
-
- """
- Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.
- """
- scopedUrl: String
-
- """
- Timestamp of the iteration start date.
- """
- startDate: Time
-
- """
- State of the iteration.
- """
- state: IterationState!
-
- """
- Title of the iteration.
- """
- title: String!
-
- """
- Timestamp of last iteration update.
- """
- updatedAt: Time!
-
- """
- Web path of the iteration.
- """
- webPath: String!
-
- """
- Web URL of the iteration.
- """
- webUrl: String!
-}
-
-"""
-The connection type for Iteration.
-"""
-type IterationConnection {
- """
- A list of edges.
- """
- edges: [IterationEdge]
-
- """
- A list of nodes.
- """
- nodes: [Iteration]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IterationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Iteration
-}
-
-"""
-Identifier of Iteration.
-"""
-scalar IterationID
-
-"""
-State of a GitLab iteration
-"""
-enum IterationState {
- all
- closed
- opened
- started
- upcoming
-}
-
-"""
-Iteration ID wildcard values
-"""
-enum IterationWildcardId {
- """
- An iteration is assigned
- """
- ANY
-
- """
- Current iteration
- """
- CURRENT
-
- """
- No iteration is assigned
- """
- NONE
-}
-
-"""
-Represents untyped JSON
-"""
-scalar JSON
-
-type JiraImport {
- """
- Timestamp of when the Jira import was created.
- """
- createdAt: Time
-
- """
- Count of issues that failed to import.
- """
- failedToImportCount: Int!
-
- """
- Count of issues that were successfully imported.
- """
- importedIssuesCount: Int!
-
- """
- Project key for the imported Jira project.
- """
- jiraProjectKey: String!
-
- """
- Timestamp of when the Jira import was scheduled.
- """
- scheduledAt: Time
-
- """
- User that started the Jira import.
- """
- scheduledBy: User
-
- """
- Total count of issues that were attempted to import.
- """
- totalIssueCount: Int!
-}
-
-"""
-The connection type for JiraImport.
-"""
-type JiraImportConnection {
- """
- A list of edges.
- """
- edges: [JiraImportEdge]
-
- """
- A list of nodes.
- """
- nodes: [JiraImport]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type JiraImportEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: JiraImport
-}
-
-"""
-Autogenerated input type of JiraImportStart
-"""
-input JiraImportStartInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Project key of the importer Jira project.
- """
- jiraProjectKey: String!
-
- """
- Project name of the importer Jira project.
- """
- jiraProjectName: String
-
- """
- The project to import the Jira project into.
- """
- projectPath: ID!
-
- """
- The mapping of Jira to GitLab users.
- """
- usersMapping: [JiraUsersMappingInputType!]
-}
-
-"""
-Autogenerated return type of JiraImportStart
-"""
-type JiraImportStartPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The Jira import data after mutation.
- """
- jiraImport: JiraImport
-}
-
-"""
-Autogenerated input type of JiraImportUsers
-"""
-input JiraImportUsersInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project to import the Jira users into.
- """
- projectPath: ID!
-
- """
- The index of the record the import should started at, default 0 (50 records returned).
- """
- startAt: Int
-}
-
-"""
-Autogenerated return type of JiraImportUsers
-"""
-type JiraImportUsersPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Users returned from Jira, matched by email and name if possible.
- """
- jiraUsers: [JiraUser!]
-}
-
-type JiraProject {
- """
- Key of the Jira project.
- """
- key: String!
-
- """
- Name of the Jira project.
- """
- name: String
-
- """
- ID of the Jira project.
- """
- projectId: Int!
-}
-
-"""
-The connection type for JiraProject.
-"""
-type JiraProjectConnection {
- """
- A list of edges.
- """
- edges: [JiraProjectEdge]
-
- """
- A list of nodes.
- """
- nodes: [JiraProject]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type JiraProjectEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: JiraProject
-}
-
-type JiraService implements Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- List of all Jira projects fetched through Jira REST API.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Project name or key.
- """
- name: String
- ): JiraProjectConnection
-
- """
- Class name of the service.
- """
- type: String
-}
-
-type JiraUser {
- """
- ID of the matched GitLab user.
- """
- gitlabId: Int
-
- """
- Name of the matched GitLab user.
- """
- gitlabName: String
-
- """
- Username of the matched GitLab user.
- """
- gitlabUsername: String
-
- """
- Account ID of the Jira user.
- """
- jiraAccountId: String!
-
- """
- Display name of the Jira user.
- """
- jiraDisplayName: String!
-
- """
- Email of the Jira user, returned only for users with public emails.
- """
- jiraEmail: String
-}
-
-input JiraUsersMappingInputType {
- """
- Id of the GitLab user.
- """
- gitlabId: Int
-
- """
- Jira account ID of the user.
- """
- jiraAccountId: String!
-}
-
-enum JobArtifactFileType {
- ACCESSIBILITY
- API_FUZZING
- ARCHIVE
- BROWSER_PERFORMANCE
- CLUSTER_APPLICATIONS
- COBERTURA
- CODEQUALITY
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- DOTENV
- JUNIT
- LICENSE_MANAGEMENT
- LICENSE_SCANNING
- LOAD_PERFORMANCE
- LSIF
- METADATA
- METRICS
- METRICS_REFEREE
- NETWORK_REFEREE
- PERFORMANCE
- REQUIREMENTS
- SAST
- SECRET_DETECTION
- TERRAFORM
- TRACE
-}
-
-"""
-JSON object as raw string
-"""
-scalar JsonString
-
-type Label {
- """
- Background color of the label.
- """
- color: String!
-
- """
- Description of the label (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Label ID.
- """
- id: ID!
-
- """
- Text color of the label.
- """
- textColor: String!
-
- """
- Content of the label.
- """
- title: String!
-}
-
-"""
-The connection type for Label.
-"""
-type LabelConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [LabelEdge]
-
- """
- A list of nodes.
- """
- nodes: [Label]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of LabelCreate
-"""
-input LabelCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The color of the label given in 6-digit hex notation with leading '#' sign
- (e.g. #FFAABB) or one of the CSS color names in
- https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords.
- """
- color: String = "#6699cc"
-
- """
- Description of the label.
- """
- description: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- Title of the label.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of LabelCreate
-"""
-type LabelCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The label after mutation.
- """
- label: Label
-}
-
-"""
-An edge in a connection.
-"""
-type LabelEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Label
-}
-
-"""
-Identifier of Label.
-"""
-scalar LabelID
-
-"""
-Identifier of List.
-"""
-scalar ListID
-
-"""
-List limit metric setting
-"""
-enum ListLimitMetric {
- all_metrics
- issue_count
- issue_weights
-}
-
-"""
-Autogenerated input type of MarkAsSpamSnippet
-"""
-input MarkAsSpamSnippetInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the snippet to update.
- """
- id: SnippetID!
-}
-
-"""
-Autogenerated return type of MarkAsSpamSnippet
-"""
-type MarkAsSpamSnippetPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-}
-
-"""
-Possible identifier types for a measurement
-"""
-enum MeasurementIdentifier {
- """
- Group count
- """
- GROUPS
-
- """
- Issue count
- """
- ISSUES
-
- """
- Merge request count
- """
- MERGE_REQUESTS
-
- """
- Pipeline count
- """
- PIPELINES
-
- """
- Pipeline count with canceled status
- """
- PIPELINES_CANCELED
-
- """
- Pipeline count with failed status
- """
- PIPELINES_FAILED
-
- """
- Pipeline count with skipped status
- """
- PIPELINES_SKIPPED
-
- """
- Pipeline count with success status
- """
- PIPELINES_SUCCEEDED
-
- """
- Project count
- """
- PROJECTS
-
- """
- User count
- """
- USERS
-}
-
-interface MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-}
-
-"""
-The connection type for MemberInterface.
-"""
-type MemberInterfaceConnection {
- """
- A list of edges.
- """
- edges: [MemberInterfaceEdge]
-
- """
- A list of nodes.
- """
- nodes: [MemberInterface]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MemberInterfaceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MemberInterface
-}
-
-type MergeRequest implements CurrentUserTodos & Noteable {
- """
- Indicates if members of the target project can push to the fork.
- """
- allowCollaboration: Boolean
-
- """
- Number of approvals left.
- """
- approvalsLeft: Int
-
- """
- Number of approvals required.
- """
- approvalsRequired: Int
-
- """
- Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured.
- """
- approved: Boolean!
-
- """
- Users who approved the merge request.
- """
- approvedBy(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Assignees of the merge request.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User who created this merge request.
- """
- author: User
-
- """
- Indicates if auto merge is enabled for the merge request.
- """
- autoMergeEnabled: Boolean!
-
- """
- Selected auto merge strategy.
- """
- autoMergeStrategy: String
-
- """
- Array of available auto merge strategies.
- """
- availableAutoMergeStrategies: [String!]
-
- """
- Number of commits in the merge request.
- """
- commitCount: Int
-
- """
- Merge request commits excluding merge commits.
- """
- commitsWithoutMergeCommits(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CommitConnection
-
- """
- Indicates if the merge request has conflicts.
- """
- conflicts: Boolean!
-
- """
- Timestamp of when the merge request was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Default merge commit message of the merge request.
- """
- defaultMergeCommitMessage: String
-
- """
- Default merge commit message of the merge request with description.
- """
- defaultMergeCommitMessageWithDescription: String
-
- """
- Default squash commit message of the merge request.
- """
- defaultSquashCommitMessage: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Diff head SHA of the merge request.
- """
- diffHeadSha: String
-
- """
- References of the base SHA, the head SHA, and the start SHA for this merge request.
- """
- diffRefs: DiffRefs
-
- """
- Details about which files were changed in this merge request.
- """
- diffStats(
- """
- A specific file-path.
- """
- path: String
- ): [DiffStats!]
-
- """
- Summary of which files were changed in this merge request.
- """
- diffStatsSummary: DiffStatsSummary
-
- """
- Indicates if comments on the merge request are locked to members only.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes for the merge request.
- """
- downvotes: Int!
-
- """
- Indicates if the project settings will lead to source branch deletion after merge.
- """
- forceRemoveSourceBranch: Boolean
-
- """
- Indicates if the merge request has CI.
- """
- hasCi: Boolean!
-
- """
- Indicates if the source branch has any security reports.
- """
- hasSecurityReports: Boolean!
-
- """
- The pipeline running on the branch HEAD of the merge request.
- """
- headPipeline: Pipeline
-
- """
- ID of the merge request.
- """
- id: ID!
-
- """
- Internal ID of the merge request.
- """
- iid: String!
-
- """
- Commit SHA of the merge request if merge is in progress.
- """
- inProgressMergeCommitSha: String
-
- """
- Labels of the merge request.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- SHA of the merge request commit (set once merged).
- """
- mergeCommitSha: String
-
- """
- Error message due to a merge error.
- """
- mergeError: String
-
- """
- Indicates if a merge is currently occurring.
- """
- mergeOngoing: Boolean!
-
- """
- Status of the merge request.
- """
- mergeStatus: String
-
- """
- Number of merge requests in the merge train.
- """
- mergeTrainsCount: Int
-
- """
- User who merged this merge request.
- """
- mergeUser: User
-
- """
- Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).
- """
- mergeWhenPipelineSucceeds: Boolean
-
- """
- Indicates if the merge request is mergeable.
- """
- mergeable: Boolean!
-
- """
- Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.
- """
- mergeableDiscussionsState: Boolean
-
- """
- Timestamp of when the merge request was merged, null if not merged.
- """
- mergedAt: Time
-
- """
- The milestone of the merge request.
- """
- milestone: Milestone
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Pipelines for the merge request. Note: for performance reasons, no more than
- the most recent 500 pipelines will be returned.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- Alias for target_project.
- """
- project: Project!
-
- """
- ID of the merge request project.
- """
- projectId: Int!
-
- """
- Rebase commit SHA of the merge request.
- """
- rebaseCommitSha: String
-
- """
- Indicates if there is a rebase currently in progress for the merge request.
- """
- rebaseInProgress: Boolean!
-
- """
- Internal reference of the merge request. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- Users from whom a review has been requested.
- """
- reviewers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Indicates if the merge request is created by @GitLab-Security-Bot.
- """
- securityAutoFix: Boolean
-
- """
- Indicates if the merge request will be rebased.
- """
- shouldBeRebased: Boolean!
-
- """
- Indicates if the source branch of the merge request will be deleted after merge.
- """
- shouldRemoveSourceBranch: Boolean
-
- """
- Source branch of the merge request.
- """
- sourceBranch: String!
-
- """
- Indicates if the source branch of the merge request exists.
- """
- sourceBranchExists: Boolean!
-
- """
- Indicates if the source branch is protected.
- """
- sourceBranchProtected: Boolean!
-
- """
- Source project of the merge request.
- """
- sourceProject: Project
-
- """
- ID of the merge request source project.
- """
- sourceProjectId: Int
-
- """
- Indicates if squash on merge is enabled.
- """
- squash: Boolean!
-
- """
- Indicates if squash on merge is enabled.
- """
- squashOnMerge: Boolean!
-
- """
- State of the merge request.
- """
- state: MergeRequestState!
-
- """
- Indicates if the currently logged in user is subscribed to this merge request.
- """
- subscribed: Boolean!
-
- """
- Target branch of the merge request.
- """
- targetBranch: String!
-
- """
- Indicates if the target branch of the merge request exists.
- """
- targetBranchExists: Boolean!
-
- """
- Target project of the merge request.
- """
- targetProject: Project!
-
- """
- ID of the merge request target project.
- """
- targetProjectId: Int!
-
- """
- Completion status of tasks
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the merge request.
- """
- timeEstimate: Int!
-
- """
- Title of the merge request.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the merge request.
- """
- totalTimeSpent: Int!
-
- """
- Timestamp of when the merge request was last updated.
- """
- updatedAt: Time!
-
- """
- Number of upvotes for the merge request.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the merge request.
- """
- userDiscussionsCount: Int
-
- """
- User notes count of the merge request.
- """
- userNotesCount: Int
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: MergeRequestPermissions!
-
- """
- Web URL of the merge request.
- """
- webUrl: String
-
- """
- Indicates if the merge request is a work in progress (WIP).
- """
- workInProgress: Boolean!
-}
-
-"""
-The connection type for MergeRequest.
-"""
-type MergeRequestConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [MergeRequestEdge]
-
- """
- A list of nodes.
- """
- nodes: [MergeRequest]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total sum of time to merge, in seconds, for the collection of merge requests.
- """
- totalTimeToMerge: Float
-}
-
-"""
-Autogenerated input type of MergeRequestCreate
-"""
-input MergeRequestCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- Labels of the merge request.
- """
- labels: [String!]
-
- """
- Project full path the merge request is associated with.
- """
- projectPath: ID!
-
- """
- Source branch of the merge request.
- """
- sourceBranch: String!
-
- """
- Target branch of the merge request.
- """
- targetBranch: String!
-
- """
- Title of the merge request.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of MergeRequestCreate
-"""
-type MergeRequestCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Represents the Geo sync and verification state of a Merge Request diff
-"""
-type MergeRequestDiffRegistry {
- """
- Timestamp when the MergeRequestDiffRegistry was created
- """
- createdAt: Time
-
- """
- ID of the MergeRequestDiffRegistry
- """
- id: ID!
-
- """
- Error message during sync of the MergeRequestDiffRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the MergeRequestDiffRegistry
- """
- lastSyncedAt: Time
-
- """
- ID of the Merge Request diff.
- """
- mergeRequestDiffId: ID!
-
- """
- Timestamp after which the MergeRequestDiffRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the MergeRequestDiffRegistry
- """
- retryCount: Int
-
- """
- Sync state of the MergeRequestDiffRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for MergeRequestDiffRegistry.
-"""
-type MergeRequestDiffRegistryConnection {
- """
- A list of edges.
- """
- edges: [MergeRequestDiffRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [MergeRequestDiffRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MergeRequestDiffRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MergeRequestDiffRegistry
-}
-
-"""
-An edge in a connection.
-"""
-type MergeRequestEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MergeRequest
-}
-
-"""
-Identifier of MergeRequest.
-"""
-scalar MergeRequestID
-
-"""
-New state to apply to a merge request.
-"""
-enum MergeRequestNewState {
- """
- Close the merge request if it is open.
- """
- CLOSED
-
- """
- Open the merge request if it is closed.
- """
- OPEN
-}
-
-"""
-Check permissions for the current user on a merge request
-"""
-type MergeRequestPermissions {
- """
- Indicates the user can perform `admin_merge_request` on this resource
- """
- adminMergeRequest: Boolean!
-
- """
- Indicates the user can perform `can_merge` on this resource
- """
- canMerge: Boolean!
-
- """
- Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource
- """
- cherryPickOnCurrentMergeRequest: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `push_to_source_branch` on this resource
- """
- pushToSourceBranch: Boolean!
-
- """
- Indicates the user can perform `read_merge_request` on this resource
- """
- readMergeRequest: Boolean!
-
- """
- Indicates the user can perform `remove_source_branch` on this resource
- """
- removeSourceBranch: Boolean!
-
- """
- Indicates the user can perform `revert_on_current_merge_request` on this resource
- """
- revertOnCurrentMergeRequest: Boolean!
-
- """
- Indicates the user can perform `update_merge_request` on this resource
- """
- updateMergeRequest: Boolean!
-}
-
-"""
-Autogenerated input type of MergeRequestReviewerRereview
-"""
-input MergeRequestReviewerRereviewInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The user ID for the user that has been requested for a new review.
- """
- userId: UserID!
-}
-
-"""
-Autogenerated return type of MergeRequestReviewerRereview
-"""
-type MergeRequestReviewerRereviewPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetAssignees
-"""
-input MergeRequestSetAssigneesInput {
- """
- The usernames to assign to the resource. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetAssignees
-"""
-type MergeRequestSetAssigneesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetLabels
-"""
-input MergeRequestSetLabelsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The Label IDs to set. Replaces existing labels by default.
- """
- labelIds: [LabelID!]!
-
- """
- Changes the operation mode. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetLabels
-"""
-type MergeRequestSetLabelsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetLocked
-"""
-input MergeRequestSetLockedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- Whether or not to lock the merge request.
- """
- locked: Boolean!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetLocked
-"""
-type MergeRequestSetLockedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetMilestone
-"""
-input MergeRequestSetMilestoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The milestone to assign to the merge request.
- """
- milestoneId: MilestoneID
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetMilestone
-"""
-type MergeRequestSetMilestonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetSubscription
-"""
-input MergeRequestSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of MergeRequestSetSubscription
-"""
-type MergeRequestSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetWip
-"""
-input MergeRequestSetWipInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- Whether or not to set the merge request as a WIP.
- """
- wip: Boolean!
-}
-
-"""
-Autogenerated return type of MergeRequestSetWip
-"""
-type MergeRequestSetWipPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Values for sorting merge requests
-"""
-enum MergeRequestSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Label priority by ascending order
- """
- LABEL_PRIORITY_ASC
-
- """
- Label priority by descending order
- """
- LABEL_PRIORITY_DESC
-
- """
- Merge time by ascending order
- """
- MERGED_AT_ASC
-
- """
- Merge time by descending order
- """
- MERGED_AT_DESC
-
- """
- Milestone due date by ascending order
- """
- MILESTONE_DUE_ASC
-
- """
- Milestone due date by descending order
- """
- MILESTONE_DUE_DESC
-
- """
- Priority by ascending order
- """
- PRIORITY_ASC
-
- """
- Priority by descending order
- """
- PRIORITY_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-State of a GitLab merge request
-"""
-enum MergeRequestState {
- all
- closed
- locked
-
- """
- Merge Request has been merged
- """
- merged
- opened
-}
-
-"""
-Autogenerated input type of MergeRequestUpdate
-"""
-input MergeRequestUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The action to perform to change the state.
- """
- state: MergeRequestNewState
-
- """
- Target branch of the merge request.
- """
- targetBranch: String
-
- """
- Title of the merge request.
- """
- title: String
-}
-
-"""
-Autogenerated return type of MergeRequestUpdate
-"""
-type MergeRequestUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-type Metadata {
- """
- Revision.
- """
- revision: String!
-
- """
- Version.
- """
- version: String!
-}
-
-"""
-Represents a metric image upload
-"""
-type MetricImage {
- """
- File name of the metric image.
- """
- fileName: String
-
- """
- File path of the metric image.
- """
- filePath: String
-
- """
- ID of the metric upload.
- """
- id: ID!
-
- """
- Internal ID of the metric upload.
- """
- iid: ID!
-
- """
- URL of the metric source.
- """
- url: String!
-}
-
-type MetricsDashboard {
- """
- Annotations added to the dashboard.
- """
- annotations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Timestamp marking date and time from which annotations need to be fetched.
- """
- from: Time!
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Timestamp marking date and time to which annotations need to be fetched.
- """
- to: Time
- ): MetricsDashboardAnnotationConnection
-
- """
- Path to a file with the dashboard definition.
- """
- path: String
-
- """
- Dashboard schema validation warnings.
- """
- schemaValidationWarnings: [String!]
-}
-
-type MetricsDashboardAnnotation {
- """
- Description of the annotation.
- """
- description: String
-
- """
- Timestamp marking end of annotated time span.
- """
- endingAt: Time
-
- """
- ID of the annotation.
- """
- id: ID!
-
- """
- ID of a dashboard panel to which the annotation should be scoped.
- """
- panelId: String
-
- """
- Timestamp marking start of annotated time span.
- """
- startingAt: Time
-}
-
-"""
-The connection type for MetricsDashboardAnnotation.
-"""
-type MetricsDashboardAnnotationConnection {
- """
- A list of edges.
- """
- edges: [MetricsDashboardAnnotationEdge]
-
- """
- A list of nodes.
- """
- nodes: [MetricsDashboardAnnotation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MetricsDashboardAnnotationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MetricsDashboardAnnotation
-}
-
-"""
-Identifier of Metrics::Dashboard::Annotation.
-"""
-scalar MetricsDashboardAnnotationID
-
-"""
-Represents a milestone
-"""
-type Milestone implements TimeboxReportInterface {
- """
- Timestamp of milestone creation.
- """
- createdAt: Time!
-
- """
- Description of the milestone.
- """
- description: String
-
- """
- Timestamp of the milestone due date.
- """
- dueDate: Time
-
- """
- Indicates if milestone is at group level.
- """
- groupMilestone: Boolean!
-
- """
- ID of the milestone.
- """
- id: ID!
-
- """
- Indicates if milestone is at project level.
- """
- projectMilestone: Boolean!
-
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-
- """
- Timestamp of the milestone start date.
- """
- startDate: Time
-
- """
- State of the milestone.
- """
- state: MilestoneStateEnum!
-
- """
- Milestone statistics.
- """
- stats: MilestoneStats
-
- """
- Indicates if milestone is at subgroup level.
- """
- subgroupMilestone: Boolean!
-
- """
- Title of the milestone.
- """
- title: String!
-
- """
- Timestamp of last milestone update.
- """
- updatedAt: Time!
-
- """
- Web path of the milestone.
- """
- webPath: String!
-}
-
-"""
-The connection type for Milestone.
-"""
-type MilestoneConnection {
- """
- A list of edges.
- """
- edges: [MilestoneEdge]
-
- """
- A list of nodes.
- """
- nodes: [Milestone]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MilestoneEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Milestone
-}
-
-"""
-Identifier of Milestone.
-"""
-scalar MilestoneID
-
-"""
-Current state of milestone
-"""
-enum MilestoneStateEnum {
- """
- Milestone is currently active
- """
- active
-
- """
- Milestone is closed
- """
- closed
-}
-
-"""
-Contains statistics about a milestone
-"""
-type MilestoneStats {
- """
- Number of closed issues associated with the milestone.
- """
- closedIssuesCount: Int
-
- """
- Total number of issues associated with the milestone.
- """
- totalIssuesCount: Int
-}
-
-"""
-The position to which the adjacent object should be moved
-"""
-enum MoveType {
- """
- The adjacent object will be moved after the object that is being moved
- """
- after
-
- """
- The adjacent object will be moved before the object that is being moved
- """
- before
-}
-
-type Mutation {
- addAwardEmoji(input: AddAwardEmojiInput!): AddAwardEmojiPayload @deprecated(reason: "Use awardEmojiAdd. Deprecated in 13.2.")
- addProjectToSecurityDashboard(input: AddProjectToSecurityDashboardInput!): AddProjectToSecurityDashboardPayload
- adminSidekiqQueuesDeleteJobs(input: AdminSidekiqQueuesDeleteJobsInput!): AdminSidekiqQueuesDeleteJobsPayload
- alertSetAssignees(input: AlertSetAssigneesInput!): AlertSetAssigneesPayload
- alertTodoCreate(input: AlertTodoCreateInput!): AlertTodoCreatePayload
- apiFuzzingCiConfigurationCreate(input: ApiFuzzingCiConfigurationCreateInput!): ApiFuzzingCiConfigurationCreatePayload
- awardEmojiAdd(input: AwardEmojiAddInput!): AwardEmojiAddPayload
- awardEmojiRemove(input: AwardEmojiRemoveInput!): AwardEmojiRemovePayload
- awardEmojiToggle(input: AwardEmojiToggleInput!): AwardEmojiTogglePayload
- boardListCreate(input: BoardListCreateInput!): BoardListCreatePayload
- boardListUpdateLimitMetrics(input: BoardListUpdateLimitMetricsInput!): BoardListUpdateLimitMetricsPayload
- ciCdSettingsUpdate(input: CiCdSettingsUpdateInput!): CiCdSettingsUpdatePayload
- clusterAgentDelete(input: ClusterAgentDeleteInput!): ClusterAgentDeletePayload
- clusterAgentTokenCreate(input: ClusterAgentTokenCreateInput!): ClusterAgentTokenCreatePayload
- clusterAgentTokenDelete(input: ClusterAgentTokenDeleteInput!): ClusterAgentTokenDeletePayload
- commitCreate(input: CommitCreateInput!): CommitCreatePayload
- configureSast(input: ConfigureSastInput!): ConfigureSastPayload
- createAlertIssue(input: CreateAlertIssueInput!): CreateAlertIssuePayload
- createAnnotation(input: CreateAnnotationInput!): CreateAnnotationPayload
- createBoard(input: CreateBoardInput!): CreateBoardPayload
- createBranch(input: CreateBranchInput!): CreateBranchPayload
- createClusterAgent(input: CreateClusterAgentInput!): CreateClusterAgentPayload
- createComplianceFramework(input: CreateComplianceFrameworkInput!): CreateComplianceFrameworkPayload
-
- """
- Available only when feature flag `custom_emoji` is enabled.
- """
- createCustomEmoji(input: CreateCustomEmojiInput!): CreateCustomEmojiPayload
- createDevopsAdoptionSegment(input: CreateDevopsAdoptionSegmentInput!): CreateDevopsAdoptionSegmentPayload
- createDiffNote(input: CreateDiffNoteInput!): CreateDiffNotePayload
- createEpic(input: CreateEpicInput!): CreateEpicPayload
- createImageDiffNote(input: CreateImageDiffNoteInput!): CreateImageDiffNotePayload
- createIssue(input: CreateIssueInput!): CreateIssuePayload
- createIteration(input: CreateIterationInput!): CreateIterationPayload
- createNote(input: CreateNoteInput!): CreateNotePayload
- createRequirement(input: CreateRequirementInput!): CreateRequirementPayload
- createSnippet(input: CreateSnippetInput!): CreateSnippetPayload
- createTestCase(input: CreateTestCaseInput!): CreateTestCasePayload
- dastOnDemandScanCreate(input: DastOnDemandScanCreateInput!): DastOnDemandScanCreatePayload
- dastProfileCreate(input: DastProfileCreateInput!): DastProfileCreatePayload
- dastProfileDelete(input: DastProfileDeleteInput!): DastProfileDeletePayload
- dastProfileRun(input: DastProfileRunInput!): DastProfileRunPayload
- dastProfileUpdate(input: DastProfileUpdateInput!): DastProfileUpdatePayload
- dastScannerProfileCreate(input: DastScannerProfileCreateInput!): DastScannerProfileCreatePayload
- dastScannerProfileDelete(input: DastScannerProfileDeleteInput!): DastScannerProfileDeletePayload
- dastScannerProfileUpdate(input: DastScannerProfileUpdateInput!): DastScannerProfileUpdatePayload
- dastSiteProfileCreate(input: DastSiteProfileCreateInput!): DastSiteProfileCreatePayload
- dastSiteProfileDelete(input: DastSiteProfileDeleteInput!): DastSiteProfileDeletePayload
- dastSiteProfileUpdate(input: DastSiteProfileUpdateInput!): DastSiteProfileUpdatePayload
- dastSiteTokenCreate(input: DastSiteTokenCreateInput!): DastSiteTokenCreatePayload
- dastSiteValidationCreate(input: DastSiteValidationCreateInput!): DastSiteValidationCreatePayload
- dastSiteValidationRevoke(input: DastSiteValidationRevokeInput!): DastSiteValidationRevokePayload
- deleteAnnotation(input: DeleteAnnotationInput!): DeleteAnnotationPayload
- deleteDevopsAdoptionSegment(input: DeleteDevopsAdoptionSegmentInput!): DeleteDevopsAdoptionSegmentPayload
- designManagementDelete(input: DesignManagementDeleteInput!): DesignManagementDeletePayload
- designManagementMove(input: DesignManagementMoveInput!): DesignManagementMovePayload
- designManagementUpload(input: DesignManagementUploadInput!): DesignManagementUploadPayload
- destroyBoard(input: DestroyBoardInput!): DestroyBoardPayload
- destroyBoardList(input: DestroyBoardListInput!): DestroyBoardListPayload
- destroyComplianceFramework(input: DestroyComplianceFrameworkInput!): DestroyComplianceFrameworkPayload
- destroyContainerRepository(input: DestroyContainerRepositoryInput!): DestroyContainerRepositoryPayload
- destroyContainerRepositoryTags(input: DestroyContainerRepositoryTagsInput!): DestroyContainerRepositoryTagsPayload
- destroyNote(input: DestroyNoteInput!): DestroyNotePayload
- destroySnippet(input: DestroySnippetInput!): DestroySnippetPayload
-
- """
- Toggles the resolved state of a discussion
- """
- discussionToggleResolve(input: DiscussionToggleResolveInput!): DiscussionToggleResolvePayload
- dismissVulnerability(input: DismissVulnerabilityInput!): DismissVulnerabilityPayload @deprecated(reason: "Use vulnerabilityDismiss. Deprecated in 13.5.")
- environmentsCanaryIngressUpdate(input: EnvironmentsCanaryIngressUpdateInput!): EnvironmentsCanaryIngressUpdatePayload
- epicAddIssue(input: EpicAddIssueInput!): EpicAddIssuePayload
- epicBoardCreate(input: EpicBoardCreateInput!): EpicBoardCreatePayload
- epicBoardListCreate(input: EpicBoardListCreateInput!): EpicBoardListCreatePayload
- epicSetSubscription(input: EpicSetSubscriptionInput!): EpicSetSubscriptionPayload
- epicTreeReorder(input: EpicTreeReorderInput!): EpicTreeReorderPayload
- exportRequirements(input: ExportRequirementsInput!): ExportRequirementsPayload
- gitlabSubscriptionActivate(input: GitlabSubscriptionActivateInput!): GitlabSubscriptionActivatePayload
- httpIntegrationCreate(input: HttpIntegrationCreateInput!): HttpIntegrationCreatePayload
- httpIntegrationDestroy(input: HttpIntegrationDestroyInput!): HttpIntegrationDestroyPayload
- httpIntegrationResetToken(input: HttpIntegrationResetTokenInput!): HttpIntegrationResetTokenPayload
- httpIntegrationUpdate(input: HttpIntegrationUpdateInput!): HttpIntegrationUpdatePayload
- issueMove(input: IssueMoveInput!): IssueMovePayload
- issueMoveList(input: IssueMoveListInput!): IssueMoveListPayload
- issueSetAssignees(input: IssueSetAssigneesInput!): IssueSetAssigneesPayload
- issueSetConfidential(input: IssueSetConfidentialInput!): IssueSetConfidentialPayload
- issueSetDueDate(input: IssueSetDueDateInput!): IssueSetDueDatePayload
- issueSetEpic(input: IssueSetEpicInput!): IssueSetEpicPayload
- issueSetIteration(input: IssueSetIterationInput!): IssueSetIterationPayload
- issueSetLocked(input: IssueSetLockedInput!): IssueSetLockedPayload
- issueSetSeverity(input: IssueSetSeverityInput!): IssueSetSeverityPayload
- issueSetSubscription(input: IssueSetSubscriptionInput!): IssueSetSubscriptionPayload
- issueSetWeight(input: IssueSetWeightInput!): IssueSetWeightPayload
- jiraImportStart(input: JiraImportStartInput!): JiraImportStartPayload
- jiraImportUsers(input: JiraImportUsersInput!): JiraImportUsersPayload
- labelCreate(input: LabelCreateInput!): LabelCreatePayload
- markAsSpamSnippet(input: MarkAsSpamSnippetInput!): MarkAsSpamSnippetPayload
- mergeRequestCreate(input: MergeRequestCreateInput!): MergeRequestCreatePayload
- mergeRequestReviewerRereview(input: MergeRequestReviewerRereviewInput!): MergeRequestReviewerRereviewPayload
- mergeRequestSetAssignees(input: MergeRequestSetAssigneesInput!): MergeRequestSetAssigneesPayload
- mergeRequestSetLabels(input: MergeRequestSetLabelsInput!): MergeRequestSetLabelsPayload
- mergeRequestSetLocked(input: MergeRequestSetLockedInput!): MergeRequestSetLockedPayload
- mergeRequestSetMilestone(input: MergeRequestSetMilestoneInput!): MergeRequestSetMilestonePayload
- mergeRequestSetSubscription(input: MergeRequestSetSubscriptionInput!): MergeRequestSetSubscriptionPayload
- mergeRequestSetWip(input: MergeRequestSetWipInput!): MergeRequestSetWipPayload
-
- """
- Update attributes of a merge request
- """
- mergeRequestUpdate(input: MergeRequestUpdateInput!): MergeRequestUpdatePayload
- namespaceIncreaseStorageTemporarily(input: NamespaceIncreaseStorageTemporarilyInput!): NamespaceIncreaseStorageTemporarilyPayload
- oncallRotationCreate(input: OncallRotationCreateInput!): OncallRotationCreatePayload
- oncallRotationDestroy(input: OncallRotationDestroyInput!): OncallRotationDestroyPayload
- oncallScheduleCreate(input: OncallScheduleCreateInput!): OncallScheduleCreatePayload
- oncallScheduleDestroy(input: OncallScheduleDestroyInput!): OncallScheduleDestroyPayload
- oncallScheduleUpdate(input: OncallScheduleUpdateInput!): OncallScheduleUpdatePayload
- pipelineCancel(input: PipelineCancelInput!): PipelineCancelPayload
- pipelineDestroy(input: PipelineDestroyInput!): PipelineDestroyPayload
- pipelineRetry(input: PipelineRetryInput!): PipelineRetryPayload
- prometheusIntegrationCreate(input: PrometheusIntegrationCreateInput!): PrometheusIntegrationCreatePayload
- prometheusIntegrationResetToken(input: PrometheusIntegrationResetTokenInput!): PrometheusIntegrationResetTokenPayload
- prometheusIntegrationUpdate(input: PrometheusIntegrationUpdateInput!): PrometheusIntegrationUpdatePayload
- promoteToEpic(input: PromoteToEpicInput!): PromoteToEpicPayload
- releaseCreate(input: ReleaseCreateInput!): ReleaseCreatePayload
- releaseDelete(input: ReleaseDeleteInput!): ReleaseDeletePayload
- releaseUpdate(input: ReleaseUpdateInput!): ReleaseUpdatePayload
- removeAwardEmoji(input: RemoveAwardEmojiInput!): RemoveAwardEmojiPayload @deprecated(reason: "Use awardEmojiRemove. Deprecated in 13.2.")
- removeProjectFromSecurityDashboard(input: RemoveProjectFromSecurityDashboardInput!): RemoveProjectFromSecurityDashboardPayload
-
- """
- Repositions a DiffNote on an image (a `Note` where the `position.positionType` is `"image"`)
- """
- repositionImageDiffNote(input: RepositionImageDiffNoteInput!): RepositionImageDiffNotePayload
- revertVulnerabilityToDetected(input: RevertVulnerabilityToDetectedInput!): RevertVulnerabilityToDetectedPayload @deprecated(reason: "Use vulnerabilityRevertToDetected. Deprecated in 13.5.")
- runDastScan(input: RunDASTScanInput!): RunDASTScanPayload @deprecated(reason: "Use DastOnDemandScanCreate. Deprecated in 13.4.")
- terraformStateDelete(input: TerraformStateDeleteInput!): TerraformStateDeletePayload
- terraformStateLock(input: TerraformStateLockInput!): TerraformStateLockPayload
- terraformStateUnlock(input: TerraformStateUnlockInput!): TerraformStateUnlockPayload
- todoCreate(input: TodoCreateInput!): TodoCreatePayload
- todoMarkDone(input: TodoMarkDoneInput!): TodoMarkDonePayload
- todoRestore(input: TodoRestoreInput!): TodoRestorePayload
- todoRestoreMany(input: TodoRestoreManyInput!): TodoRestoreManyPayload
- todosMarkAllDone(input: TodosMarkAllDoneInput!): TodosMarkAllDonePayload
- toggleAwardEmoji(input: ToggleAwardEmojiInput!): ToggleAwardEmojiPayload @deprecated(reason: "Use awardEmojiToggle. Deprecated in 13.2.")
- updateAlertStatus(input: UpdateAlertStatusInput!): UpdateAlertStatusPayload
- updateBoard(input: UpdateBoardInput!): UpdateBoardPayload
- updateBoardEpicUserPreferences(input: UpdateBoardEpicUserPreferencesInput!): UpdateBoardEpicUserPreferencesPayload
- updateBoardList(input: UpdateBoardListInput!): UpdateBoardListPayload
- updateComplianceFramework(input: UpdateComplianceFrameworkInput!): UpdateComplianceFrameworkPayload
- updateContainerExpirationPolicy(input: UpdateContainerExpirationPolicyInput!): UpdateContainerExpirationPolicyPayload
- updateEpic(input: UpdateEpicInput!): UpdateEpicPayload
-
- """
- Updates a DiffNote on an image (a `Note` where the `position.positionType` is
- `"image"`). If the body of the Note contains only quick actions, the Note will
- be destroyed during the update, and no Note will be returned
- """
- updateImageDiffNote(input: UpdateImageDiffNoteInput!): UpdateImageDiffNotePayload
- updateIssue(input: UpdateIssueInput!): UpdateIssuePayload
- updateIteration(input: UpdateIterationInput!): UpdateIterationPayload
- updateNamespacePackageSettings(input: UpdateNamespacePackageSettingsInput!): UpdateNamespacePackageSettingsPayload
-
- """
- Updates a Note. If the body of the Note contains only quick actions, the Note
- will be destroyed during the update, and no Note will be returned
- """
- updateNote(input: UpdateNoteInput!): UpdateNotePayload
- updateRequirement(input: UpdateRequirementInput!): UpdateRequirementPayload
- updateSnippet(input: UpdateSnippetInput!): UpdateSnippetPayload
- vulnerabilityConfirm(input: VulnerabilityConfirmInput!): VulnerabilityConfirmPayload
- vulnerabilityDismiss(input: VulnerabilityDismissInput!): VulnerabilityDismissPayload
- vulnerabilityExternalIssueLinkCreate(input: VulnerabilityExternalIssueLinkCreateInput!): VulnerabilityExternalIssueLinkCreatePayload
- vulnerabilityExternalIssueLinkDestroy(input: VulnerabilityExternalIssueLinkDestroyInput!): VulnerabilityExternalIssueLinkDestroyPayload
- vulnerabilityResolve(input: VulnerabilityResolveInput!): VulnerabilityResolvePayload
- vulnerabilityRevertToDetected(input: VulnerabilityRevertToDetectedInput!): VulnerabilityRevertToDetectedPayload
-}
-
-"""
-Different toggles for changing mutator behavior
-"""
-enum MutationOperationMode {
- """
- Performs an append operation
- """
- APPEND
-
- """
- Performs a removal operation
- """
- REMOVE
-
- """
- Performs a replace operation
- """
- REPLACE
-}
-
-type Namespace {
- """
- Size limit for repositories in the namespace in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- Additional storage purchased for the root namespace in bytes.
- """
- additionalPurchasedStorageSize: Float
-
- """
- Compliance frameworks available to projects in this namespace. Available only
- when feature flag `ff_custom_compliance_frameworks` is enabled.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of a specific compliance framework to return.
- """
- id: ComplianceManagementFrameworkID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- Includes at least one project where the repository size exceeds the limit.
- """
- containsLockedProjects: Boolean!
-
- """
- Description of the namespace.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Full name of the namespace.
- """
- fullName: String!
-
- """
- Full path of the namespace.
- """
- fullPath: ID!
-
- """
- ID of the namespace.
- """
- id: ID!
-
- """
- Status of the temporary storage increase.
- """
- isTemporaryStorageIncreaseEnabled: Boolean!
-
- """
- Indicates if Large File Storage (LFS) is enabled for namespace.
- """
- lfsEnabled: Boolean
-
- """
- Name of the namespace.
- """
- name: String!
-
- """
- The package settings for the namespace.
- """
- packageSettings: PackageSettings
-
- """
- Path of the namespace.
- """
- path: String!
-
- """
- Projects within this namespace.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the projects which have vulnerabilities.
- """
- hasVulnerabilities: Boolean = false
-
- """
- Include also subgroup projects.
- """
- includeSubgroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search project with most similar names or paths.
- """
- search: String = null
-
- """
- Sort projects by this criteria.
- """
- sort: NamespaceProjectSort = null
- ): ProjectConnection!
-
- """
- Number of projects in the root namespace where the repository size exceeds the limit.
- """
- repositorySizeExcessProjectCount: Int!
-
- """
- Indicates if users can request access to namespace.
- """
- requestAccessEnabled: Boolean
-
- """
- Aggregated storage statistics of the namespace. Only available for root namespaces.
- """
- rootStorageStatistics: RootStorageStatistics
-
- """
- Total storage limit of the root namespace in bytes.
- """
- storageSizeLimit: Float
-
- """
- Date until the temporary storage increase is active.
- """
- temporaryStorageIncreaseEndsOn: Time
-
- """
- Total repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySize: Float
-
- """
- Total excess repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySizeExcess: Float
-
- """
- Visibility of the namespace.
- """
- visibility: String
-}
-
-"""
-The connection type for Namespace.
-"""
-type NamespaceConnection {
- """
- A list of edges.
- """
- edges: [NamespaceEdge]
-
- """
- A list of nodes.
- """
- nodes: [Namespace]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type NamespaceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Namespace
-}
-
-"""
-Identifier of Namespace.
-"""
-scalar NamespaceID
-
-"""
-Autogenerated input type of NamespaceIncreaseStorageTemporarily
-"""
-input NamespaceIncreaseStorageTemporarilyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the namespace to mutate.
- """
- id: NamespaceID!
-}
-
-"""
-Autogenerated return type of NamespaceIncreaseStorageTemporarily
-"""
-type NamespaceIncreaseStorageTemporarilyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The namespace after mutation.
- """
- namespace: Namespace
-}
-
-"""
-Values for sorting projects
-"""
-enum NamespaceProjectSort {
- """
- Most similar to the search query
- """
- SIMILARITY
-
- """
- Sort by storage size
- """
- STORAGE
-}
-
-input NegatedBoardIssueInput {
- """
- Filter by assignee username.
- """
- assigneeUsername: [String]
-
- """
- Filter by author username.
- """
- authorUsername: String
-
- """
- Filter by epic ID. Incompatible with epicWildcardId.
- """
- epicId: EpicID
-
- """
- Filter by iteration title.
- """
- iterationTitle: String
-
- """
- Filter by label name.
- """
- labelName: [String]
-
- """
- Filter by milestone title.
- """
- milestoneTitle: String
-
- """
- Filter by reaction emoji.
- """
- myReactionEmoji: String
-
- """
- Filter by release tag.
- """
- releaseTag: String
-
- """
- Filter by weight.
- """
- weight: String
-}
-
-type Note implements ResolvableInterface {
- """
- User who wrote this note.
- """
- author: User!
-
- """
- Content of the note.
- """
- body: String!
-
- """
- The GitLab Flavored Markdown rendering of `note`
- """
- bodyHtml: String
-
- """
- Indicates if this note is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of the note creation.
- """
- createdAt: Time!
-
- """
- The discussion this note is a part of.
- """
- discussion: Discussion
-
- """
- ID of the note.
- """
- id: NoteID!
-
- """
- The position of this note on a diff.
- """
- position: DiffPosition
-
- """
- Project associated with the note.
- """
- project: Project
-
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-
- """
- Indicates whether this note was created by the system or by a user.
- """
- system: Boolean!
-
- """
- Name of the icon corresponding to a system note.
- """
- systemNoteIconName: String
-
- """
- Timestamp of the note's last activity.
- """
- updatedAt: Time!
-
- """
- URL to view this Note in the Web UI.
- """
- url: String
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: NotePermissions!
-}
-
-"""
-The connection type for Note.
-"""
-type NoteConnection {
- """
- A list of edges.
- """
- edges: [NoteEdge]
-
- """
- A list of nodes.
- """
- nodes: [Note]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type NoteEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Note
-}
-
-"""
-Identifier of Note.
-"""
-scalar NoteID
-
-type NotePermissions {
- """
- Indicates the user can perform `admin_note` on this resource
- """
- adminNote: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `read_note` on this resource
- """
- readNote: Boolean!
-
- """
- Indicates the user can perform `reposition_note` on this resource
- """
- repositionNote: Boolean!
-
- """
- Indicates the user can perform `resolve_note` on this resource
- """
- resolveNote: Boolean!
-}
-
-interface Noteable {
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-}
-
-"""
-Identifier of Noteable.
-"""
-scalar NoteableID
-
-"""
-The rotation participant and color palette
-"""
-type OncallParticipantType {
- """
- The color palette to assign to the on-call user. For example "blue".
- """
- colorPalette: String
-
- """
- The color weight to assign to for the on-call user, for example "500". Max 4 chars. For easy identification of the user.
- """
- colorWeight: String
-
- """
- ID of the on-call participant.
- """
- id: IncidentManagementOncallParticipantID!
-
- """
- The user who is participating.
- """
- user: User!
-}
-
-"""
-The connection type for OncallParticipantType.
-"""
-type OncallParticipantTypeConnection {
- """
- A list of edges.
- """
- edges: [OncallParticipantTypeEdge]
-
- """
- A list of nodes.
- """
- nodes: [OncallParticipantType]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type OncallParticipantTypeEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: OncallParticipantType
-}
-
-"""
-Autogenerated input type of OncallRotationCreate
-"""
-input OncallRotationCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The name of the on-call rotation.
- """
- name: String!
-
- """
- The usernames of users participating in the on-call rotation.
- """
- participants: [OncallUserInputType!]!
-
- """
- The project to create the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The rotation length of the on-call rotation.
- """
- rotationLength: OncallRotationLengthInputType!
-
- """
- The IID of the on-call schedule to create the on-call rotation in.
- """
- scheduleIid: String!
-
- """
- The start date and time of the on-call rotation, in the timezone of the on-call schedule.
- """
- startsAt: OncallRotationDateInputType!
-}
-
-"""
-Autogenerated return type of OncallRotationCreate
-"""
-type OncallRotationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call rotation.
- """
- oncallRotation: IncidentManagementOncallRotation
-}
-
-"""
-Date input type for on-call rotation
-"""
-input OncallRotationDateInputType {
- """
- The date component of the date in YYYY-MM-DD format.
- """
- date: String!
-
- """
- The time component of the date in 24hr HH:MM format.
- """
- time: String!
-}
-
-"""
-Autogenerated input type of OncallRotationDestroy
-"""
-input OncallRotationDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the on-call rotation to remove.
- """
- id: IncidentManagementOncallRotationID!
-
- """
- The project to remove the on-call schedule from.
- """
- projectPath: ID!
-
- """
- The IID of the on-call schedule to the on-call rotation belongs to.
- """
- scheduleIid: String!
-}
-
-"""
-Autogenerated return type of OncallRotationDestroy
-"""
-type OncallRotationDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call rotation.
- """
- oncallRotation: IncidentManagementOncallRotation
-}
-
-"""
-The rotation length of the on-call rotation
-"""
-input OncallRotationLengthInputType {
- """
- The rotation length of the on-call rotation.
- """
- length: Int!
-
- """
- The unit of the rotation length of the on-call rotation.
- """
- unit: OncallRotationUnitEnum!
-}
-
-"""
-Rotation length unit of an on-call rotation
-"""
-enum OncallRotationUnitEnum {
- """
- Days
- """
- DAYS
-
- """
- Hours
- """
- HOURS
-
- """
- Weeks
- """
- WEEKS
-}
-
-"""
-Autogenerated input type of OncallScheduleCreate
-"""
-input OncallScheduleCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the on-call schedule.
- """
- description: String
-
- """
- The name of the on-call schedule.
- """
- name: String!
-
- """
- The project to create the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The timezone of the on-call schedule.
- """
- timezone: String!
-}
-
-"""
-Autogenerated return type of OncallScheduleCreate
-"""
-type OncallScheduleCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-Autogenerated input type of OncallScheduleDestroy
-"""
-input OncallScheduleDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The on-call schedule internal ID to remove.
- """
- iid: String!
-
- """
- The project to remove the on-call schedule from.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of OncallScheduleDestroy
-"""
-type OncallScheduleDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-Autogenerated input type of OncallScheduleUpdate
-"""
-input OncallScheduleUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the on-call schedule.
- """
- description: String
-
- """
- The on-call schedule internal ID to update.
- """
- iid: String!
-
- """
- The name of the on-call schedule.
- """
- name: String
-
- """
- The project to update the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The timezone of the on-call schedule.
- """
- timezone: String
-}
-
-"""
-Autogenerated return type of OncallScheduleUpdate
-"""
-type OncallScheduleUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-The rotation user and color palette
-"""
-input OncallUserInputType {
- """
- A value of DataVisualizationColorEnum. The color from the palette to assign to the on-call user.
- """
- colorPalette: DataVisualizationColorEnum
-
- """
- A value of DataVisualizationWeightEnum. The color weight to assign to for the on-call user.
- """
- colorWeight: DataVisualizationWeightEnum
-
- """
- The username of the user to participate in the on-call rotation, such as `user_one`.
- """
- username: String!
-}
-
-"""
-Represents a package in the Package Registry
-"""
-type Package {
- """
- Date of creation.
- """
- createdAt: Time!
-
- """
- ID of the package.
- """
- id: PackagesPackageID!
-
- """
- Package metadata.
- """
- metadata: PackageMetadata
-
- """
- Name of the package.
- """
- name: String!
-
- """
- Package type.
- """
- packageType: PackageTypeEnum!
-
- """
- Pipelines that built the package.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Project where the package is stored.
- """
- project: Project!
-
- """
- Package tags.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageTagConnection
-
- """
- Date of most recent update.
- """
- updatedAt: Time!
-
- """
- Version string.
- """
- version: String
-
- """
- The other versions of the package.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageWithoutVersionsConnection
-}
-
-"""
-Represents a composer JSON file
-"""
-type PackageComposerJsonType {
- """
- The license set in the Composer JSON file.
- """
- license: String
-
- """
- The name set in the Composer JSON file.
- """
- name: String
-
- """
- The type set in the Composer JSON file.
- """
- type: String
-
- """
- The version set in the Composer JSON file.
- """
- version: String
-}
-
-"""
-The connection type for Package.
-"""
-type PackageConnection {
- """
- A list of edges.
- """
- edges: [PackageEdge]
-
- """
- A list of nodes.
- """
- nodes: [Package]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Package
-}
-
-"""
-Represents the Geo sync and verification state of a package file
-"""
-type PackageFileRegistry {
- """
- Timestamp when the PackageFileRegistry was created
- """
- createdAt: Time
-
- """
- ID of the PackageFileRegistry
- """
- id: ID!
-
- """
- Error message during sync of the PackageFileRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the PackageFileRegistry
- """
- lastSyncedAt: Time
-
- """
- ID of the PackageFile.
- """
- packageFileId: ID!
-
- """
- Timestamp after which the PackageFileRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the PackageFileRegistry
- """
- retryCount: Int
-
- """
- Sync state of the PackageFileRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for PackageFileRegistry.
-"""
-type PackageFileRegistryConnection {
- """
- A list of edges.
- """
- edges: [PackageFileRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageFileRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageFileRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageFileRegistry
-}
-
-"""
-Represents metadata associated with a Package
-"""
-union PackageMetadata = ComposerMetadata
-
-"""
-Namespace-level Package Registry settings
-"""
-type PackageSettings {
- """
- When maven_duplicates_allowed is false, you can publish duplicate packages
- with names that match this regex. Otherwise, this setting has no effect.
- """
- mavenDuplicateExceptionRegex: UntrustedRegexp
-
- """
- Indicates whether duplicate Maven packages are allowed for this namespace.
- """
- mavenDuplicatesAllowed: Boolean!
-}
-
-"""
-Represents a package tag
-"""
-type PackageTag {
- """
- The created date.
- """
- createdAt: Time!
-
- """
- The ID of the tag.
- """
- id: ID!
-
- """
- The name of the tag.
- """
- name: String!
-
- """
- The updated date.
- """
- updatedAt: Time!
-}
-
-"""
-The connection type for PackageTag.
-"""
-type PackageTagConnection {
- """
- A list of edges.
- """
- edges: [PackageTagEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageTag]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageTagEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageTag
-}
-
-enum PackageTypeEnum {
- """
- Packages from the Composer package manager
- """
- COMPOSER
-
- """
- Packages from the Conan package manager
- """
- CONAN
-
- """
- Packages from the Debian package manager
- """
- DEBIAN
-
- """
- Packages from the Generic package manager
- """
- GENERIC
-
- """
- Packages from the Golang package manager
- """
- GOLANG
-
- """
- Packages from the Maven package manager
- """
- MAVEN
-
- """
- Packages from the npm package manager
- """
- NPM
-
- """
- Packages from the Nuget package manager
- """
- NUGET
-
- """
- Packages from the PyPI package manager
- """
- PYPI
-
- """
- Packages from the Rubygems package manager
- """
- RUBYGEMS
-}
-
-"""
-Represents a version of a package in the Package Registry
-"""
-type PackageWithoutVersions {
- """
- Date of creation.
- """
- createdAt: Time!
-
- """
- ID of the package.
- """
- id: PackagesPackageID!
-
- """
- Package metadata.
- """
- metadata: PackageMetadata
-
- """
- Name of the package.
- """
- name: String!
-
- """
- Package type.
- """
- packageType: PackageTypeEnum!
-
- """
- Pipelines that built the package.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Project where the package is stored.
- """
- project: Project!
-
- """
- Package tags.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageTagConnection
-
- """
- Date of most recent update.
- """
- updatedAt: Time!
-
- """
- Version string.
- """
- version: String
-}
-
-"""
-The connection type for PackageWithoutVersions.
-"""
-type PackageWithoutVersionsConnection {
- """
- A list of edges.
- """
- edges: [PackageWithoutVersionsEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageWithoutVersions]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageWithoutVersionsEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageWithoutVersions
-}
-
-"""
-Identifier of Packages::Package.
-"""
-scalar PackagesPackageID
-
-"""
-Information about pagination in a connection.
-"""
-type PageInfo {
- """
- When paginating forwards, the cursor to continue.
- """
- endCursor: String
-
- """
- When paginating forwards, are there more items?
- """
- hasNextPage: Boolean!
-
- """
- When paginating backwards, are there more items?
- """
- hasPreviousPage: Boolean!
-
- """
- When paginating backwards, the cursor to continue.
- """
- startCursor: String
-}
-
-type Pipeline {
- """
- Indicates if the pipeline is active.
- """
- active: Boolean!
-
- """
- Base SHA of the source branch.
- """
- beforeSha: String
-
- """
- Specifies if a pipeline can be canceled.
- """
- cancelable: Boolean!
-
- """
- Timestamp of the pipeline's commit.
- """
- committedAt: Time
-
- """
- Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE,
- AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE,
- BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE)
- """
- configSource: PipelineConfigSourceEnum
-
- """
- Coverage percentage.
- """
- coverage: Float
-
- """
- Timestamp of the pipeline's creation.
- """
- createdAt: Time!
-
- """
- Detailed status of the pipeline.
- """
- detailedStatus: DetailedStatus!
-
- """
- Pipelines this pipeline will trigger.
- """
- downstream(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Duration of the pipeline in seconds.
- """
- duration: Int
-
- """
- Timestamp of the pipeline's completion.
- """
- finishedAt: Time
-
- """
- ID of the pipeline.
- """
- id: ID!
-
- """
- Internal ID of the pipeline.
- """
- iid: String!
-
- """
- Jobs belonging to the pipeline.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter jobs by the type of security report they produce.
- """
- securityReportTypes: [SecurityReportTypeEnum!]
- ): CiJobConnection
-
- """
- Relative path to the pipeline's page.
- """
- path: String
-
- """
- Project the pipeline belongs to.
- """
- project: Project
-
- """
- Specifies if a pipeline can be retried.
- """
- retryable: Boolean!
-
- """
- Vulnerability and scanned resource counts for each security scanner of the pipeline.
- """
- securityReportSummary: SecurityReportSummary
-
- """
- SHA of the pipeline's commit.
- """
- sha: String!
-
- """
- Job where pipeline was triggered from.
- """
- sourceJob: CiJob
-
- """
- Stages of the pipeline.
- """
- stages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiStageConnection
-
- """
- Timestamp when the pipeline was started.
- """
- startedAt: Time
-
- """
- Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING,
- RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED)
- """
- status: PipelineStatusEnum!
-
- """
- Timestamp of the pipeline's last activity.
- """
- updatedAt: Time!
-
- """
- Pipeline that triggered the pipeline.
- """
- upstream: Pipeline
-
- """
- Pipeline user.
- """
- user: User
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: PipelinePermissions!
-
- """
- Indicates if a pipeline has warnings.
- """
- warnings: Boolean!
-}
-
-type PipelineAnalytics {
- """
- Labels for the monthly pipeline count.
- """
- monthPipelinesLabels: [String!]
-
- """
- Total monthly successful pipeline count.
- """
- monthPipelinesSuccessful: [Int!]
-
- """
- Total monthly pipeline count.
- """
- monthPipelinesTotals: [Int!]
-
- """
- Pipeline times labels.
- """
- pipelineTimesLabels: [String!]
-
- """
- Pipeline times.
- """
- pipelineTimesValues: [Int!]
-
- """
- Labels for the weekly pipeline count.
- """
- weekPipelinesLabels: [String!]
-
- """
- Total weekly successful pipeline count.
- """
- weekPipelinesSuccessful: [Int!]
-
- """
- Total weekly pipeline count.
- """
- weekPipelinesTotals: [Int!]
-
- """
- Labels for the yearly pipeline count.
- """
- yearPipelinesLabels: [String!]
-
- """
- Total yearly successful pipeline count.
- """
- yearPipelinesSuccessful: [Int!]
-
- """
- Total yearly pipeline count.
- """
- yearPipelinesTotals: [Int!]
-}
-
-"""
-Autogenerated input type of PipelineCancel
-"""
-input PipelineCancelInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineCancel
-"""
-type PipelineCancelPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-enum PipelineConfigSourceEnum {
- AUTO_DEVOPS_SOURCE
- BRIDGE_SOURCE
- COMPLIANCE_SOURCE
- EXTERNAL_PROJECT_SOURCE
- PARAMETER_SOURCE
- REMOTE_SOURCE
- REPOSITORY_SOURCE
- UNKNOWN_SOURCE
- WEBIDE_SOURCE
-}
-
-"""
-The connection type for Pipeline.
-"""
-type PipelineConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [PipelineEdge]
-
- """
- A list of nodes.
- """
- nodes: [Pipeline]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of PipelineDestroy
-"""
-input PipelineDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineDestroy
-"""
-type PipelineDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type PipelineEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Pipeline
-}
-
-type PipelinePermissions {
- """
- Indicates the user can perform `admin_pipeline` on this resource
- """
- adminPipeline: Boolean!
-
- """
- Indicates the user can perform `destroy_pipeline` on this resource
- """
- destroyPipeline: Boolean!
-
- """
- Indicates the user can perform `update_pipeline` on this resource
- """
- updatePipeline: Boolean!
-}
-
-"""
-Autogenerated input type of PipelineRetry
-"""
-input PipelineRetryInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineRetry
-"""
-type PipelineRetryPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The pipeline after mutation.
- """
- pipeline: Pipeline
-}
-
-enum PipelineStatusEnum {
- CANCELED
- CREATED
- FAILED
- MANUAL
- PENDING
- PREPARING
- RUNNING
- SCHEDULED
- SKIPPED
- SUCCESS
- WAITING_FOR_RESOURCE
-}
-
-type Project {
- """
- Size limit for the repository in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- A single Alert Management alert of the project.
- """
- alertManagementAlert(
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Filter query for given domain.
- """
- domain: AlertManagementDomainFilter! = operations
-
- """
- IID of the alert. For example, "1".
- """
- iid: String
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
-
- """
- Sort alerts by this criteria.
- """
- sort: AlertManagementAlertSort
-
- """
- Alerts with the specified statues. For example, [TRIGGERED].
- """
- statuses: [AlertManagementStatus!]
- ): AlertManagementAlert
-
- """
- Counts of alerts by status for the project.
- """
- alertManagementAlertStatusCounts(
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
- ): AlertManagementAlertStatusCountsType
-
- """
- Alert Management alerts of the project.
- """
- alertManagementAlerts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter query for given domain.
- """
- domain: AlertManagementDomainFilter! = operations
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the alert. For example, "1".
- """
- iid: String
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
-
- """
- Sort alerts by this criteria.
- """
- sort: AlertManagementAlertSort
-
- """
- Alerts with the specified statues. For example, [TRIGGERED].
- """
- statuses: [AlertManagementStatus!]
- ): AlertManagementAlertConnection
-
- """
- Integrations which can receive alerts for the project.
- """
- alertManagementIntegrations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AlertManagementIntegrationConnection
-
- """
- Extract alert fields from payload for custom mapping.
- """
- alertManagementPayloadFields(
- """
- Sample payload for extracting alert fields for custom mappings.
- """
- payloadExample: String!
- ): [AlertManagementPayloadAlertField!]
-
- """
- If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge
- requests of the project can also be merged with skipped jobs.
- """
- allowMergeOnSkippedPipeline: Boolean
-
- """
- API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled.
- """
- apiFuzzingCiConfiguration: ApiFuzzingCiConfiguration
-
- """
- Indicates the archived status of the project.
- """
- archived: Boolean
-
- """
- Indicates if issues referenced by merge requests and commits within the default branch are closed automatically.
- """
- autocloseReferencedIssues: Boolean
-
- """
- URL to avatar image file of the project.
- """
- avatarUrl: String
-
- """
- A single board of the project.
- """
- board(
- """
- The board's ID.
- """
- id: BoardID!
- ): Board
-
- """
- Boards of the project.
- """
- boards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a board by its ID.
- """
- id: BoardID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardConnection
-
- """
- CI/CD settings for the project.
- """
- ciCdSettings: ProjectCiCdSetting
-
- """
- Find a single cluster agent by name.
- """
- clusterAgent(
- """
- Name of the cluster agent.
- """
- name: String!
- ): ClusterAgent
-
- """
- Cluster agents associated with the project.
- """
- clusterAgents(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ClusterAgentConnection
-
- """
- Code coverage summary associated with the project.
- """
- codeCoverageSummary: CodeCoverageSummary
-
- """
- Compliance frameworks associated with the project.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- The container expiration policy of the project.
- """
- containerExpirationPolicy: ContainerExpirationPolicy
-
- """
- Indicates if the project stores Docker container images in a container registry.
- """
- containerRegistryEnabled: Boolean
-
- """
- Container repositories of the project.
- """
- containerRepositories(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter the container repositories by their name.
- """
- name: String
-
- """
- Sort container repositories by this criteria.
- """
- sort: ContainerRepositorySort = created_desc
- ): ContainerRepositoryConnection
-
- """
- Number of container repositories in the project.
- """
- containerRepositoriesCount: Int!
-
- """
- Timestamp of the project creation.
- """
- createdAt: Time
-
- """
- DAST Profiles associated with the project. Always returns no nodes if `dast_saved_scans` is disabled.
- """
- dastProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastProfileConnection
-
- """
- The DAST scanner profiles associated with the project.
- """
- dastScannerProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastScannerProfileConnection
-
- """
- DAST Site Profile associated with the project.
- """
- dastSiteProfile(
- """
- ID of the site profile.
- """
- id: DastSiteProfileID!
- ): DastSiteProfile
-
- """
- DAST Site Profiles associated with the project.
- """
- dastSiteProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastSiteProfileConnection
-
- """
- DAST Site Validations associated with the project. Always returns no nodes if
- `security_on_demand_scans_site_validation` is disabled.
- """
- dastSiteValidations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Normalized URL of the target to be scanned.
- """
- normalizedTargetUrls: [String!]
- ): DastSiteValidationConnection
-
- """
- Short description of the project.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- A single environment of the project.
- """
- environment(
- """
- Name of the environment.
- """
- name: String
-
- """
- Search query for environment name.
- """
- search: String
-
- """
- States of environments that should be included in result.
- """
- states: [String!]
- ): Environment
-
- """
- Environments of the project.
- """
- environments(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Name of the environment.
- """
- name: String
-
- """
- Search query for environment name.
- """
- search: String
-
- """
- States of environments that should be included in result.
- """
- states: [String!]
- ): EnvironmentConnection
-
- """
- Number of times the project has been forked.
- """
- forksCount: Int!
-
- """
- Full path of the project.
- """
- fullPath: ID!
-
- """
- Grafana integration details for the project.
- """
- grafanaIntegration: GrafanaIntegration
-
- """
- Group of the project.
- """
- group: Group
-
- """
- URL to connect to the project via HTTPS.
- """
- httpUrlToRepo: String
-
- """
- ID of the project.
- """
- id: ID!
-
- """
- Status of import background job of the project.
- """
- importStatus: String
-
- """
- Incident Management On-call schedules of the project.
- """
- incidentManagementOncallSchedules(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IncidentManagementOncallScheduleConnection
-
- """
- A single issue of the project.
- """
- issue(
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): Issue
-
- """
- Counts of issues by status for the project.
- """
- issueStatusCounts(
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueStatusCountsType
-
- """
- Issues of the project.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueConnection
-
- """
- Indicates if Issues are enabled for the current user
- """
- issuesEnabled: Boolean
-
- """
- Find iterations.
- """
- iterations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of the Iteration to look up.
- """
- id: ID
-
- """
- Internal ID of the Iteration to look up.
- """
- iid: ID
-
- """
- Whether to include ancestor iterations. Defaults to true.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter iterations by state.
- """
- state: IterationState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- Fuzzy search by title.
- """
- title: String
- ): IterationConnection
-
- """
- Status of Jira import background job of the project.
- """
- jiraImportStatus: String
-
- """
- Jira imports into the project.
- """
- jiraImports(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): JiraImportConnection
-
- """
- Indicates if CI/CD pipeline jobs are enabled for the current user.
- """
- jobsEnabled: Boolean
-
- """
- A label available on this project.
- """
- label(
- """
- Title of the label.
- """
- title: String!
- ): Label
-
- """
- Labels available on this project.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Include labels from ancestor groups.
- """
- includeAncestorGroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search term to find labels with.
- """
- searchTerm: String
- ): LabelConnection
-
- """
- Timestamp of the project last activity.
- """
- lastActivityAt: Time
-
- """
- Indicates if the project has Large File Storage (LFS) enabled.
- """
- lfsEnabled: Boolean
-
- """
- A single merge request of the project.
- """
- mergeRequest(
- """
- IID of the merge request, for example `1`.
- """
- iid: String!
- ): MergeRequest
-
- """
- Merge requests of the project.
- """
- mergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Indicates if Merge Requests are enabled for the current user
- """
- mergeRequestsEnabled: Boolean
-
- """
- Indicates if no merge commits should be created and all merges should instead
- be fast-forwarded, which means that merging is only allowed if the branch
- could be fast-forwarded.
- """
- mergeRequestsFfOnlyEnabled: Boolean
-
- """
- Milestones of the project.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- A date that the milestone contains.
- """
- containingDate: Time
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global milestone IDs, e.g., "gid://gitlab/Milestone/1".
- """
- ids: [ID!]
-
- """
- Also return milestones in the project's parent group and its ancestors.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search string for the title.
- """
- searchTitle: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter milestones by state.
- """
- state: MilestoneStateEnum
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- The title of the milestone.
- """
- title: String
- ): MilestoneConnection
-
- """
- Name of the project (without namespace).
- """
- name: String!
-
- """
- Full name of the project with its namespace.
- """
- nameWithNamespace: String!
-
- """
- Namespace of the project.
- """
- namespace: Namespace
-
- """
- Indicates if merge requests of the project can only be merged when all the discussions are resolved.
- """
- onlyAllowMergeIfAllDiscussionsAreResolved: Boolean
-
- """
- Indicates if merge requests of the project can only be merged with successful jobs.
- """
- onlyAllowMergeIfPipelineSucceeds: Boolean
-
- """
- Number of open issues for the project.
- """
- openIssuesCount: Int
-
- """
- Packages of the project.
- """
- packages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageConnection
-
- """
- Path of the project.
- """
- path: String!
-
- """
- Build pipeline of the project.
- """
- pipeline(
- """
- IID of the Pipeline, e.g., "1".
- """
- iid: ID!
- ): Pipeline
-
- """
- Pipeline analytics.
- """
- pipelineAnalytics: PipelineAnalytics
-
- """
- Build pipelines of the project.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- Indicates if a link to create or view a merge request should display after a
- push to Git repositories of the project from the command line.
- """
- printingMergeRequestLinkEnabled: Boolean
-
- """
- Members of the project.
- """
- projectMembers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter members by the given member relations.
- """
- relations: [ProjectMemberRelation!] = [DIRECT, INHERITED]
-
- """
- Search query.
- """
- search: String
- ): MemberInterfaceConnection
-
- """
- Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts.
- """
- publicJobs: Boolean
-
- """
- A single release of the project.
- """
- release(
- """
- The name of the tag associated to the release.
- """
- tagName: String!
- ): Release
-
- """
- Releases of the project.
- """
- releases(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Sort releases by this criteria.
- """
- sort: ReleaseSort = RELEASED_AT_DESC
- ): ReleaseConnection
-
- """
- Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project.
- """
- removeSourceBranchAfterMerge: Boolean
-
- """
- Git repository of the project.
- """
- repository: Repository
-
- """
- Size of repository that exceeds the limit in bytes.
- """
- repositorySizeExcess: Float
-
- """
- Indicates if users can request member access to the project.
- """
- requestAccessEnabled: Boolean
-
- """
- Find a single requirement.
- """
- requirement(
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- IID of the requirement, e.g., "1".
- """
- iid: ID
-
- """
- List of IIDs of requirements, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- The state of latest requirement test report.
- """
- lastTestReportState: TestReportState
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
- ): Requirement
-
- """
- Number of requirements for the project by their state.
- """
- requirementStatesCount: RequirementStatesCount
-
- """
- Find requirements.
- """
- requirements(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the requirement, e.g., "1".
- """
- iid: ID
-
- """
- List of IIDs of requirements, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The state of latest requirement test report.
- """
- lastTestReportState: TestReportState
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
- ): RequirementConnection
-
- """
- SAST CI configuration for the project.
- """
- sastCiConfiguration: SastCiConfiguration
-
- """
- Path to project's security dashboard.
- """
- securityDashboardPath: String
-
- """
- Information about security analyzers used in the project.
- """
- securityScanners: SecurityScanners
-
- """
- Detailed version of a Sentry error on the project.
- """
- sentryDetailedError(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryDetailedError
-
- """
- Paginated collection of Sentry errors on the project.
- """
- sentryErrors: SentryErrorCollection
-
- """
- E-mail address of the service desk.
- """
- serviceDeskAddress: String
-
- """
- Indicates if the project has service desk enabled.
- """
- serviceDeskEnabled: Boolean
-
- """
- Project services.
- """
- services(
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Class name of the service.
- """
- type: ServiceType
- ): ServiceConnection
-
- """
- Indicates if shared runners are enabled for the project.
- """
- sharedRunnersEnabled: Boolean
-
- """
- Snippets of the project.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Indicates if Snippets are enabled for the current user
- """
- snippetsEnabled: Boolean
-
- """
- Indicates if `squashReadOnly` is enabled.
- """
- squashReadOnly: Boolean!
-
- """
- URL to connect to the project via SSH.
- """
- sshUrlToRepo: String
-
- """
- Number of times the project has been starred.
- """
- starCount: Int!
-
- """
- Statistics of the project.
- """
- statistics: ProjectStatistics
-
- """
- The commit message used to apply merge request suggestions.
- """
- suggestionCommitMessage: String
-
- """
- List of project topics (not Git tags).
- """
- tagList: String
-
- """
- Find a single Terraform state by name.
- """
- terraformState(
- """
- Name of the Terraform state.
- """
- name: String!
- ): TerraformState
-
- """
- Terraform states associated with the project.
- """
- terraformStates(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TerraformStateConnection
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: ProjectPermissions!
-
- """
- Visibility of the project.
- """
- visibility: String
-
- """
- Vulnerabilities reported on the project.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the project.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Vulnerability scanners reported on the project vulnerabilities.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity in the project.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-
- """
- Web URL of the project.
- """
- webUrl: String
-
- """
- Indicates if Wikis are enabled for the current user
- """
- wikiEnabled: Boolean
-}
-
-type ProjectCiCdSetting {
- """
- Whether to keep the latest builds artifacts.
- """
- keepLatestArtifact: Boolean
-
- """
- Whether merge pipelines are enabled.
- """
- mergePipelinesEnabled: Boolean
-
- """
- Whether merge trains are enabled.
- """
- mergeTrainsEnabled: Boolean
-
- """
- Project the CI/CD settings belong to.
- """
- project: Project
-}
-
-"""
-The connection type for Project.
-"""
-type ProjectConnection {
- """
- A list of edges.
- """
- edges: [ProjectEdge]
-
- """
- A list of nodes.
- """
- nodes: [Project]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ProjectEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Project
-}
-
-"""
-Identifier of Project.
-"""
-scalar ProjectID
-
-"""
-Represents a Project Membership
-"""
-type ProjectMember implements MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Project that User is a member of.
- """
- project: Project
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: ProjectPermissions!
-}
-
-"""
-The connection type for ProjectMember.
-"""
-type ProjectMemberConnection {
- """
- A list of edges.
- """
- edges: [ProjectMemberEdge]
-
- """
- A list of nodes.
- """
- nodes: [ProjectMember]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ProjectMemberEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ProjectMember
-}
-
-"""
-Project member relation
-"""
-enum ProjectMemberRelation {
- """
- Descendants members
- """
- DESCENDANTS
-
- """
- Direct members
- """
- DIRECT
-
- """
- Inherited members
- """
- INHERITED
-
- """
- Invited Groups members
- """
- INVITED_GROUPS
-}
-
-type ProjectPermissions {
- """
- Indicates the user can perform `admin_operations` on this resource
- """
- adminOperations: Boolean!
-
- """
- Indicates the user can perform `admin_project` on this resource
- """
- adminProject: Boolean!
-
- """
- Indicates the user can perform `admin_remote_mirror` on this resource
- """
- adminRemoteMirror: Boolean!
-
- """
- Indicates the user can perform `admin_wiki` on this resource
- """
- adminWiki: Boolean!
-
- """
- Indicates the user can perform `archive_project` on this resource
- """
- archiveProject: Boolean!
-
- """
- Indicates the user can perform `change_namespace` on this resource
- """
- changeNamespace: Boolean!
-
- """
- Indicates the user can perform `change_visibility_level` on this resource
- """
- changeVisibilityLevel: Boolean!
-
- """
- Indicates the user can perform `create_deployment` on this resource
- """
- createDeployment: Boolean!
-
- """
- Indicates the user can perform `create_design` on this resource
- """
- createDesign: Boolean!
-
- """
- Indicates the user can perform `create_issue` on this resource
- """
- createIssue: Boolean!
-
- """
- Indicates the user can perform `create_label` on this resource
- """
- createLabel: Boolean!
-
- """
- Indicates the user can perform `create_merge_request_from` on this resource
- """
- createMergeRequestFrom: Boolean!
-
- """
- Indicates the user can perform `create_merge_request_in` on this resource
- """
- createMergeRequestIn: Boolean!
-
- """
- Indicates the user can perform `create_pages` on this resource
- """
- createPages: Boolean!
-
- """
- Indicates the user can perform `create_pipeline` on this resource
- """
- createPipeline: Boolean!
-
- """
- Indicates the user can perform `create_pipeline_schedule` on this resource
- """
- createPipelineSchedule: Boolean!
-
- """
- Indicates the user can perform `create_snippet` on this resource
- """
- createSnippet: Boolean!
-
- """
- Indicates the user can perform `create_wiki` on this resource
- """
- createWiki: Boolean!
-
- """
- Indicates the user can perform `destroy_design` on this resource
- """
- destroyDesign: Boolean!
-
- """
- Indicates the user can perform `destroy_pages` on this resource
- """
- destroyPages: Boolean!
-
- """
- Indicates the user can perform `destroy_wiki` on this resource
- """
- destroyWiki: Boolean!
-
- """
- Indicates the user can perform `download_code` on this resource
- """
- downloadCode: Boolean!
-
- """
- Indicates the user can perform `download_wiki_code` on this resource
- """
- downloadWikiCode: Boolean!
-
- """
- Indicates the user can perform `fork_project` on this resource
- """
- forkProject: Boolean!
-
- """
- Indicates the user can perform `push_code` on this resource
- """
- pushCode: Boolean!
-
- """
- Indicates the user can perform `push_to_delete_protected_branch` on this resource
- """
- pushToDeleteProtectedBranch: Boolean!
-
- """
- Indicates the user can perform `read_commit_status` on this resource
- """
- readCommitStatus: Boolean!
-
- """
- Indicates the user can perform `read_cycle_analytics` on this resource
- """
- readCycleAnalytics: Boolean!
-
- """
- Indicates the user can perform `read_design` on this resource
- """
- readDesign: Boolean!
-
- """
- Indicates the user can perform `read_merge_request` on this resource
- """
- readMergeRequest: Boolean!
-
- """
- Indicates the user can perform `read_pages_content` on this resource
- """
- readPagesContent: Boolean!
-
- """
- Indicates the user can perform `read_project` on this resource
- """
- readProject: Boolean!
-
- """
- Indicates the user can perform `read_project_member` on this resource
- """
- readProjectMember: Boolean!
-
- """
- Indicates the user can perform `read_wiki` on this resource
- """
- readWiki: Boolean!
-
- """
- Indicates the user can perform `remove_fork_project` on this resource
- """
- removeForkProject: Boolean!
-
- """
- Indicates the user can perform `remove_pages` on this resource
- """
- removePages: Boolean!
-
- """
- Indicates the user can perform `remove_project` on this resource
- """
- removeProject: Boolean!
-
- """
- Indicates the user can perform `rename_project` on this resource
- """
- renameProject: Boolean!
-
- """
- Indicates the user can perform `request_access` on this resource
- """
- requestAccess: Boolean!
-
- """
- Indicates the user can perform `update_pages` on this resource
- """
- updatePages: Boolean!
-
- """
- Indicates the user can perform `update_wiki` on this resource
- """
- updateWiki: Boolean!
-
- """
- Indicates the user can perform `upload_file` on this resource
- """
- uploadFile: Boolean!
-}
-
-type ProjectStatistics {
- """
- Build artifacts size of the project in bytes.
- """
- buildArtifactsSize: Float!
-
- """
- Commit count of the project.
- """
- commitCount: Float!
-
- """
- Large File Storage (LFS) object size of the project in bytes.
- """
- lfsObjectsSize: Float!
-
- """
- Packages size of the project in bytes.
- """
- packagesSize: Float!
-
- """
- Repository size of the project in bytes.
- """
- repositorySize: Float!
-
- """
- Snippets size of the project in bytes.
- """
- snippetsSize: Float
-
- """
- Storage size of the project in bytes.
- """
- storageSize: Float!
-
- """
- Uploads size of the project in bytes.
- """
- uploadsSize: Float
-
- """
- Wiki size of the project in bytes.
- """
- wikiSize: Float
-}
-
-"""
-The alert condition for Prometheus
-"""
-type PrometheusAlert {
- """
- The human-readable text of the alert condition.
- """
- humanizedText: String!
-
- """
- ID of the alert condition.
- """
- id: ID!
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationCreate
-"""
-input PrometheusIntegrationCreateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean!
-
- """
- Endpoint at which prometheus can be queried.
- """
- apiUrl: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project to create the integration in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationCreate
-"""
-type PrometheusIntegrationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationResetToken
-"""
-input PrometheusIntegrationResetTokenInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: PrometheusServiceID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationResetToken
-"""
-type PrometheusIntegrationResetTokenPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationUpdate
-"""
-input PrometheusIntegrationUpdateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean
-
- """
- Endpoint at which prometheus can be queried.
- """
- apiUrl: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: PrometheusServiceID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationUpdate
-"""
-type PrometheusIntegrationUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Identifier of PrometheusService.
-"""
-scalar PrometheusServiceID
-
-"""
-Autogenerated input type of PromoteToEpic
-"""
-input PromoteToEpicInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the promoted epic will belong to.
- """
- groupPath: ID
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of PromoteToEpic
-"""
-type PromoteToEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after issue promotion.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-type Query {
- """
- CI related settings that apply to the entire instance.
- """
- ciApplicationSettings: CiApplicationSettings
-
- """
- Get linted and processed contents of a CI config. Should not be requested more than once per request.
- """
- ciConfig(
- """
- Contents of '.gitlab-ci.yml'.
- """
- content: String!
-
- """
- Run pipeline creation simulation, or only do static check.
- """
- dryRun: Boolean
-
- """
- The project of the CI config.
- """
- projectPath: ID!
- ): CiConfig
-
- """
- Find a container repository.
- """
- containerRepository(
- """
- The global ID of the container repository.
- """
- id: ContainerRepositoryID!
- ): ContainerRepositoryDetails
-
- """
- Get information about current user.
- """
- currentUser: User
-
- """
- Fields related to design management.
- """
- designManagement: DesignManagement!
-
- """
- Get configured DevOps adoption segments on the instance.
- """
- devopsAdoptionSegments(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DevopsAdoptionSegmentConnection
-
- """
- Text to echo back.
- """
- echo(
- """
- Text to echo back.
- """
- text: String!
- ): String!
-
- """
- Find a Geo node.
- """
- geoNode(
- """
- The name of the Geo node. Defaults to the current Geo node name.
- """
- name: String
- ): GeoNode
-
- """
- Find a group.
- """
- group(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Group
-
- """
- Fields related to Instance Security Dashboard.
- """
- instanceSecurityDashboard: InstanceSecurityDashboard
-
- """
- Get statistics on the instance.
- """
- instanceStatisticsMeasurements(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The type of measurement/statistics to retrieve.
- """
- identifier: MeasurementIdentifier!
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Measurement recorded after this date.
- """
- recordedAfter: Time
-
- """
- Measurement recorded before this date.
- """
- recordedBefore: Time
- ): InstanceStatisticsMeasurementConnection
-
- """
- Find an issue.
- """
- issue(
- """
- The global ID of the Issue.
- """
- id: IssueID!
- ): Issue
-
- """
- Find an iteration.
- """
- iteration(
- """
- Find an iteration by its ID.
- """
- id: IterationID!
- ): Iteration
-
- """
- Metadata about GitLab.
- """
- metadata: Metadata
-
- """
- Find a milestone.
- """
- milestone(
- """
- Find a milestone by its ID.
- """
- id: MilestoneID!
- ): Milestone
-
- """
- Find a namespace.
- """
- namespace(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Namespace
-
- """
- Find a package.
- """
- package(
- """
- The global ID of the package.
- """
- id: PackagesPackageID!
- ): Package
-
- """
- Find a project.
- """
- project(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Project
-
- """
- Find projects visible to the current user.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filter projects by IDs.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Limit projects that the current user is a member of.
- """
- membership: Boolean
-
- """
- Search query for project name, path, or description.
- """
- search: String
-
- """
- Include namespace in project search.
- """
- searchNamespaces: Boolean
-
- """
- Sort order of results.
- """
- sort: String
- ): ProjectConnection
-
- """
- Supported runner platforms.
- """
- runnerPlatforms(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): RunnerPlatformConnection
-
- """
- Get runner setup instructions.
- """
- runnerSetup(
- """
- Architecture to generate the instructions for.
- """
- architecture: String!
-
- """
- Group to register the runner for.
- """
- groupId: GroupID
-
- """
- Platform to generate the instructions for.
- """
- platform: String!
-
- """
- Project to register the runner for.
- """
- projectId: ProjectID
- ): RunnerSetup
-
- """
- Find Snippets visible to the current user.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: UserID
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Explore personal snippets.
- """
- explore: Boolean
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: ProjectID
-
- """
- The type of snippet.
- """
- type: TypeEnum
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Find a user.
- """
- user(
- """
- ID of the User.
- """
- id: UserID
-
- """
- Username of the User.
- """
- username: String
- ): User
-
- """
- Find users.
- """
- users(
- """
- Return only admin users.
- """
- admins: Boolean = false
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- List of user Global IDs.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Query to search users by name, username, or primary email.
- """
- search: String
-
- """
- Sort users by this criteria.
- """
- sort: Sort = created_desc
-
- """
- List of usernames.
- """
- usernames: [String!]
- ): UserConnection
-
- """
- Vulnerabilities reported on projects on the current user's instance security dashboard.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the projects on the current user's instance security dashboard.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Number of vulnerabilities per severity level, per day, for the projects on the
- current user's instance security dashboard. Deprecated in 13.3: Use
- `vulnerabilitiesCountByDay`.
- """
- vulnerabilitiesCountByDayAndSeverity(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayAndSeverityConnection @deprecated(reason: "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3.")
-
- """
- Find a vulnerability.
- """
- vulnerability(
- """
- The Global ID of the Vulnerability.
- """
- id: VulnerabilityID!
- ): Vulnerability
-}
-
-"""
-State of a Geo registry
-"""
-enum RegistryState {
- """
- Registry that failed to sync
- """
- FAILED
-
- """
- Registry waiting to be synced
- """
- PENDING
-
- """
- Registry currently syncing
- """
- STARTED
-
- """
- Registry that is synced
- """
- SYNCED
-}
-
-"""
-Represents a release
-"""
-type Release {
- """
- Assets of the release.
- """
- assets: ReleaseAssets
-
- """
- User that created the release.
- """
- author: User
-
- """
- The commit associated with the release.
- """
- commit: Commit
-
- """
- Timestamp of when the release was created.
- """
- createdAt: Time
-
- """
- Description (also known as "release notes") of the release.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Evidence for the release.
- """
- evidences(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseEvidenceConnection
-
- """
- Links of the release.
- """
- links: ReleaseLinks
-
- """
- Milestones associated to the release.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): MilestoneConnection
-
- """
- Name of the release.
- """
- name: String
-
- """
- Timestamp of when the release was released.
- """
- releasedAt: Time
-
- """
- Name of the tag associated with the release.
- """
- tagName: String
-
- """
- Relative web path to the tag associated with the release.
- """
- tagPath: String
-
- """
- Indicates the release is an upcoming release.
- """
- upcomingRelease: Boolean
-}
-
-"""
-Represents an asset link associated with a release
-"""
-type ReleaseAssetLink {
- """
- Direct asset URL of the link.
- """
- directAssetUrl: String
-
- """
- Indicates the link points to an external resource.
- """
- external: Boolean
-
- """
- ID of the link.
- """
- id: ID!
-
- """
- Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`.
- """
- linkType: ReleaseAssetLinkType
-
- """
- Name of the link.
- """
- name: String
-
- """
- URL of the link.
- """
- url: String
-}
-
-"""
-The connection type for ReleaseAssetLink.
-"""
-type ReleaseAssetLinkConnection {
- """
- A list of edges.
- """
- edges: [ReleaseAssetLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseAssetLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseAssetLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseAssetLink
-}
-
-"""
-Fields that are available when modifying a release asset link
-"""
-input ReleaseAssetLinkInput {
- """
- Relative path for a direct asset link.
- """
- directAssetPath: String
-
- """
- The type of the asset link.
- """
- linkType: ReleaseAssetLinkType = OTHER
-
- """
- Name of the asset link.
- """
- name: String!
-
- """
- URL of the asset link.
- """
- url: String!
-}
-
-"""
-Type of the link: `other`, `runbook`, `image`, `package`
-"""
-enum ReleaseAssetLinkType {
- """
- Image link type
- """
- IMAGE
-
- """
- Other link type
- """
- OTHER
-
- """
- Package link type
- """
- PACKAGE
-
- """
- Runbook link type
- """
- RUNBOOK
-}
-
-"""
-A container for all assets associated with a release
-"""
-type ReleaseAssets {
- """
- Number of assets of the release.
- """
- count: Int
-
- """
- Asset links of the release.
- """
- links(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseAssetLinkConnection
-
- """
- Sources of the release.
- """
- sources(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseSourceConnection
-}
-
-"""
-Fields that are available when modifying release assets
-"""
-input ReleaseAssetsInput {
- """
- A list of asset links to associate to the release.
- """
- links: [ReleaseAssetLinkInput!]
-}
-
-"""
-The connection type for Release.
-"""
-type ReleaseConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ReleaseEdge]
-
- """
- A list of nodes.
- """
- nodes: [Release]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ReleaseCreate
-"""
-input ReleaseCreateInput {
- """
- Assets associated to the release.
- """
- assets: ReleaseAssetsInput
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description (also known as "release notes") of the release.
- """
- description: String
-
- """
- The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.
- """
- milestones: [String!]
-
- """
- Name of the release.
- """
- name: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- The commit SHA or branch name to use if creating a new tag.
- """
- ref: String
-
- """
- The date when the release will be/was ready. Defaults to the current time.
- """
- releasedAt: Time
-
- """
- Name of the tag to associate with the release.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseCreate
-"""
-type ReleaseCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The release after mutation.
- """
- release: Release
-}
-
-"""
-Autogenerated input type of ReleaseDelete
-"""
-input ReleaseDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- Name of the tag associated with the release to delete.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseDelete
-"""
-type ReleaseDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The deleted release.
- """
- release: Release
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Release
-}
-
-"""
-Evidence for a release
-"""
-type ReleaseEvidence {
- """
- Timestamp when the evidence was collected.
- """
- collectedAt: Time
-
- """
- URL from where the evidence can be downloaded.
- """
- filepath: String
-
- """
- ID of the evidence.
- """
- id: ID!
-
- """
- SHA1 ID of the evidence hash.
- """
- sha: String
-}
-
-"""
-The connection type for ReleaseEvidence.
-"""
-type ReleaseEvidenceConnection {
- """
- A list of edges.
- """
- edges: [ReleaseEvidenceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseEvidence]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseEvidenceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseEvidence
-}
-
-type ReleaseLinks {
- """
- HTTP URL of the issues page, filtered by this release and `state=closed`.
- """
- closedIssuesUrl: String
-
- """
- HTTP URL of the merge request page , filtered by this release and `state=closed`.
- """
- closedMergeRequestsUrl: String
-
- """
- HTTP URL of the release's edit page.
- """
- editUrl: String
-
- """
- HTTP URL of the merge request page , filtered by this release and `state=merged`.
- """
- mergedMergeRequestsUrl: String
-
- """
- HTTP URL of the issues page, filtered by this release and `state=open`.
- """
- openedIssuesUrl: String
-
- """
- HTTP URL of the merge request page, filtered by this release and `state=open`.
- """
- openedMergeRequestsUrl: String
-
- """
- HTTP URL of the release.
- """
- selfUrl: String
-}
-
-"""
-Values for sorting releases
-"""
-enum ReleaseSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Released at by ascending order
- """
- RELEASED_AT_ASC
-
- """
- Released at by descending order
- """
- RELEASED_AT_DESC
-}
-
-"""
-Represents the source code attached to a release in a particular format
-"""
-type ReleaseSource {
- """
- Format of the source.
- """
- format: String
-
- """
- Download URL of the source.
- """
- url: String
-}
-
-"""
-The connection type for ReleaseSource.
-"""
-type ReleaseSourceConnection {
- """
- A list of edges.
- """
- edges: [ReleaseSourceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseSource]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseSourceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseSource
-}
-
-"""
-Autogenerated input type of ReleaseUpdate
-"""
-input ReleaseUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description (release notes) of the release.
- """
- description: String
-
- """
- The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.
- """
- milestones: [String!]
-
- """
- Name of the release.
- """
- name: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- The release date.
- """
- releasedAt: Time
-
- """
- Name of the tag associated with the release.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseUpdate
-"""
-type ReleaseUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The release after mutation.
- """
- release: Release
-}
-
-"""
-Autogenerated input type of RemoveAwardEmoji
-"""
-input RemoveAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of RemoveAwardEmoji
-"""
-type RemoveAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of RemoveProjectFromSecurityDashboard
-"""
-input RemoveProjectFromSecurityDashboardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the project to remove from the Instance Security Dashboard.
- """
- id: ProjectID!
-}
-
-"""
-Autogenerated return type of RemoveProjectFromSecurityDashboard
-"""
-type RemoveProjectFromSecurityDashboardPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of RepositionImageDiffNote
-"""
-input RepositionImageDiffNoteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the DiffNote to update.
- """
- id: DiffNoteID!
-
- """
- The position of this note on a diff.
- """
- position: UpdateDiffImagePositionInput!
-}
-
-"""
-Autogenerated return type of RepositionImageDiffNote
-"""
-type RepositionImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-type Repository {
- """
- Indicates repository has no visible content.
- """
- empty: Boolean!
-
- """
- Indicates a corresponding Git repository exists on disk.
- """
- exists: Boolean!
-
- """
- Default branch of the repository.
- """
- rootRef: String
-
- """
- Tree of the repository.
- """
- tree(
- """
- The path to get the tree for. Default value is the root of the repository.
- """
- path: String = ""
-
- """
- Used to get a recursive tree. Default is false.
- """
- recursive: Boolean = false
-
- """
- The commit ref to get the tree for. Default value is HEAD.
- """
- ref: String = "head"
- ): Tree
-}
-
-"""
-Represents a requirement
-"""
-type Requirement {
- """
- Author of the requirement.
- """
- author: User!
-
- """
- Timestamp of when the requirement was created.
- """
- createdAt: Time!
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- ID of the requirement.
- """
- id: ID!
-
- """
- Internal ID of the requirement.
- """
- iid: ID!
-
- """
- Indicates if latest test report was created by user.
- """
- lastTestReportManuallyCreated: Boolean
-
- """
- Latest requirement test report state.
- """
- lastTestReportState: TestReportState
-
- """
- Project to which the requirement belongs.
- """
- project: Project!
-
- """
- State of the requirement.
- """
- state: RequirementState!
-
- """
- Test reports of the requirement.
- """
- testReports(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List test reports by sort order.
- """
- sort: Sort
- ): TestReportConnection
-
- """
- Title of the requirement.
- """
- title: String
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Timestamp of when the requirement was last updated.
- """
- updatedAt: Time!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: RequirementPermissions!
-}
-
-"""
-The connection type for Requirement.
-"""
-type RequirementConnection {
- """
- A list of edges.
- """
- edges: [RequirementEdge]
-
- """
- A list of nodes.
- """
- nodes: [Requirement]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RequirementEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Requirement
-}
-
-"""
-Check permissions for the current user on a requirement
-"""
-type RequirementPermissions {
- """
- Indicates the user can perform `admin_requirement` on this resource
- """
- adminRequirement: Boolean!
-
- """
- Indicates the user can perform `create_requirement` on this resource
- """
- createRequirement: Boolean!
-
- """
- Indicates the user can perform `destroy_requirement` on this resource
- """
- destroyRequirement: Boolean!
-
- """
- Indicates the user can perform `read_requirement` on this resource
- """
- readRequirement: Boolean!
-
- """
- Indicates the user can perform `update_requirement` on this resource
- """
- updateRequirement: Boolean!
-}
-
-"""
-State of a requirement
-"""
-enum RequirementState {
- ARCHIVED
- OPENED
-}
-
-"""
-Counts of requirements by their state
-"""
-type RequirementStatesCount {
- """
- Number of archived requirements.
- """
- archived: Int
-
- """
- Number of opened requirements.
- """
- opened: Int
-}
-
-interface ResolvableInterface {
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-}
-
-"""
-Autogenerated input type of RevertVulnerabilityToDetected
-"""
-input RevertVulnerabilityToDetectedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be reverted.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of RevertVulnerabilityToDetected
-"""
-type RevertVulnerabilityToDetectedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after revert.
- """
- vulnerability: Vulnerability
-}
-
-type RootStorageStatistics {
- """
- The CI artifacts size in bytes.
- """
- buildArtifactsSize: Float!
-
- """
- The LFS objects size in bytes.
- """
- lfsObjectsSize: Float!
-
- """
- The packages size in bytes.
- """
- packagesSize: Float!
-
- """
- The CI pipeline artifacts size in bytes.
- """
- pipelineArtifactsSize: Float!
-
- """
- The Git repository size in bytes.
- """
- repositorySize: Float!
-
- """
- The snippets size in bytes.
- """
- snippetsSize: Float!
-
- """
- The total storage in bytes.
- """
- storageSize: Float!
-
- """
- The uploads size in bytes.
- """
- uploadsSize: Float!
-
- """
- The wiki size in bytes.
- """
- wikiSize: Float!
-}
-
-"""
-Autogenerated input type of RunDASTScan
-"""
-input RunDASTScanInput {
- """
- The branch to be associated with the scan.
- """
- branch: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the DAST scan belongs to.
- """
- projectPath: ID!
-
- """
- The type of scan to be run.
- """
- scanType: DastScanTypeEnum!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String!
-}
-
-"""
-Autogenerated return type of RunDASTScan
-"""
-type RunDASTScanPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-type RunnerArchitecture {
- """
- Download location for the runner for the platform architecture.
- """
- downloadLocation: String!
-
- """
- Name of the runner platform architecture.
- """
- name: String!
-}
-
-"""
-The connection type for RunnerArchitecture.
-"""
-type RunnerArchitectureConnection {
- """
- A list of edges.
- """
- edges: [RunnerArchitectureEdge]
-
- """
- A list of nodes.
- """
- nodes: [RunnerArchitecture]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RunnerArchitectureEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: RunnerArchitecture
-}
-
-type RunnerPlatform {
- """
- Runner architectures supported for the platform.
- """
- architectures(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): RunnerArchitectureConnection
-
- """
- Human readable name of the runner platform.
- """
- humanReadableName: String!
-
- """
- Name slug of the runner platform.
- """
- name: String!
-}
-
-"""
-The connection type for RunnerPlatform.
-"""
-type RunnerPlatformConnection {
- """
- A list of edges.
- """
- edges: [RunnerPlatformEdge]
-
- """
- A list of nodes.
- """
- nodes: [RunnerPlatform]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RunnerPlatformEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: RunnerPlatform
-}
-
-type RunnerSetup {
- """
- Instructions for installing the runner on the specified architecture.
- """
- installInstructions: String!
-
- """
- Instructions for registering the runner.
- """
- registerInstructions: String
-}
-
-"""
-Represents a CI configuration of SAST
-"""
-type SastCiConfiguration {
- """
- List of analyzers entities attached to SAST configuration.
- """
- analyzers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationAnalyzersEntityConnection
-
- """
- List of global entities related to SAST configuration.
- """
- global(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-
- """
- List of pipeline entities related to SAST configuration.
- """
- pipeline(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-}
-
-"""
-Represents an analyzer entity in SAST CI configuration
-"""
-type SastCiConfigurationAnalyzersEntity {
- """
- Analyzer description that is displayed on the form.
- """
- description: String
-
- """
- Indicates whether an analyzer is enabled.
- """
- enabled: Boolean
-
- """
- Analyzer label used in the config UI.
- """
- label: String
-
- """
- Name of the analyzer.
- """
- name: String
-
- """
- List of supported variables.
- """
- variables(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-}
-
-"""
-The connection type for SastCiConfigurationAnalyzersEntity.
-"""
-type SastCiConfigurationAnalyzersEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationAnalyzersEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationAnalyzersEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationAnalyzersEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationAnalyzersEntity
-}
-
-"""
-Represents the analyzers entity in SAST CI configuration
-"""
-input SastCiConfigurationAnalyzersEntityInput {
- """
- State of the analyzer.
- """
- enabled: Boolean!
-
- """
- Name of analyzer.
- """
- name: String!
-
- """
- List of variables for the analyzer.
- """
- variables: [SastCiConfigurationEntityInput!]
-}
-
-"""
-Represents an entity in SAST CI configuration
-"""
-type SastCiConfigurationEntity {
- """
- Default value that is used if value is empty.
- """
- defaultValue: String
-
- """
- Entity description that is displayed on the form.
- """
- description: String
-
- """
- CI keyword of entity.
- """
- field: String
-
- """
- Label for entity used in the form.
- """
- label: String
-
- """
- Different possible values of the field.
- """
- options(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationOptionsEntityConnection
-
- """
- Size of the UI component.
- """
- size: SastUiComponentSize
-
- """
- Type of the field value.
- """
- type: String
-
- """
- Current value of the entity.
- """
- value: String
-}
-
-"""
-The connection type for SastCiConfigurationEntity.
-"""
-type SastCiConfigurationEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationEntity
-}
-
-"""
-Represents an entity in SAST CI configuration
-"""
-input SastCiConfigurationEntityInput {
- """
- Default value that is used if value is empty.
- """
- defaultValue: String!
-
- """
- CI keyword of entity.
- """
- field: String!
-
- """
- Current value of the entity.
- """
- value: String!
-}
-
-"""
-Represents a CI configuration of SAST
-"""
-input SastCiConfigurationInput {
- """
- List of analyzers and related variables for the SAST configuration.
- """
- analyzers: [SastCiConfigurationAnalyzersEntityInput!]
-
- """
- List of global entities related to SAST configuration.
- """
- global: [SastCiConfigurationEntityInput!]
-
- """
- List of pipeline entities related to SAST configuration.
- """
- pipeline: [SastCiConfigurationEntityInput!]
-}
-
-"""
-Represents an entity for options in SAST CI configuration
-"""
-type SastCiConfigurationOptionsEntity {
- """
- Label of option entity.
- """
- label: String
-
- """
- Value of option entity.
- """
- value: String
-}
-
-"""
-The connection type for SastCiConfigurationOptionsEntity.
-"""
-type SastCiConfigurationOptionsEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationOptionsEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationOptionsEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationOptionsEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationOptionsEntity
-}
-
-"""
-Size of UI component in SAST configuration page
-"""
-enum SastUiComponentSize {
- LARGE
- MEDIUM
- SMALL
-}
-
-"""
-Represents a resource scanned by a security scan
-"""
-type ScannedResource {
- """
- The HTTP request method used to access the URL.
- """
- requestMethod: String
-
- """
- The URL scanned by the scanner.
- """
- url: String
-}
-
-"""
-The connection type for ScannedResource.
-"""
-type ScannedResourceConnection {
- """
- A list of edges.
- """
- edges: [ScannedResourceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ScannedResource]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ScannedResourceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ScannedResource
-}
-
-"""
-Represents summary of a security report
-"""
-type SecurityReportSummary {
- """
- Aggregated counts for the `api_fuzzing` scan
- """
- apiFuzzing: SecurityReportSummarySection
-
- """
- Aggregated counts for the `container_scanning` scan
- """
- containerScanning: SecurityReportSummarySection
-
- """
- Aggregated counts for the `coverage_fuzzing` scan
- """
- coverageFuzzing: SecurityReportSummarySection
-
- """
- Aggregated counts for the `dast` scan
- """
- dast: SecurityReportSummarySection
-
- """
- Aggregated counts for the `dependency_scanning` scan
- """
- dependencyScanning: SecurityReportSummarySection
-
- """
- Aggregated counts for the `sast` scan
- """
- sast: SecurityReportSummarySection
-
- """
- Aggregated counts for the `secret_detection` scan
- """
- secretDetection: SecurityReportSummarySection
-}
-
-"""
-Represents a section of a summary of a security report
-"""
-type SecurityReportSummarySection {
- """
- A list of the first 20 scanned resources.
- """
- scannedResources(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ScannedResourceConnection
-
- """
- Total number of scanned resources.
- """
- scannedResourcesCount: Int
-
- """
- Path to download all the scanned resources in CSV format.
- """
- scannedResourcesCsvPath: String
-
- """
- Total number of vulnerabilities.
- """
- vulnerabilitiesCount: Int
-}
-
-enum SecurityReportTypeEnum {
- """
- API FUZZING scan report
- """
- API_FUZZING
-
- """
- CONTAINER SCANNING scan report
- """
- CONTAINER_SCANNING
-
- """
- COVERAGE FUZZING scan report
- """
- COVERAGE_FUZZING
-
- """
- DAST scan report
- """
- DAST
-
- """
- DEPENDENCY SCANNING scan report
- """
- DEPENDENCY_SCANNING
-
- """
- SAST scan report
- """
- SAST
-
- """
- SECRET DETECTION scan report
- """
- SECRET_DETECTION
-}
-
-"""
-The type of the security scanner
-"""
-enum SecurityScannerType {
- API_FUZZING
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- SAST
- SECRET_DETECTION
-}
-
-"""
-Represents a list of security scanners
-"""
-type SecurityScanners {
- """
- List of analyzers which are available for the project.
- """
- available: [SecurityScannerType!]
-
- """
- List of analyzers which are enabled for the project.
- """
- enabled: [SecurityScannerType!]
-
- """
- List of analyzers which ran successfully in the latest pipeline.
- """
- pipelineRun: [SecurityScannerType!]
-}
-
-"""
-A Sentry error
-"""
-type SentryDetailedError {
- """
- Count of occurrences.
- """
- count: Int!
-
- """
- Culprit of the error.
- """
- culprit: String!
-
- """
- External Base URL of the Sentry Instance.
- """
- externalBaseUrl: String!
-
- """
- External URL of the error.
- """
- externalUrl: String!
-
- """
- Commit the error was first seen.
- """
- firstReleaseLastCommit: String
-
- """
- Release short version the error was first seen.
- """
- firstReleaseShortVersion: String
-
- """
- Release version the error was first seen.
- """
- firstReleaseVersion: String
-
- """
- Timestamp when the error was first seen.
- """
- firstSeen: Time!
-
- """
- Last 24hr stats of the error.
- """
- frequency: [SentryErrorFrequency!]!
-
- """
- GitLab commit SHA attributed to the Error based on the release version.
- """
- gitlabCommit: String
-
- """
- Path to the GitLab page for the GitLab commit attributed to the error.
- """
- gitlabCommitPath: String
-
- """
- URL of GitLab Issue.
- """
- gitlabIssuePath: String
-
- """
- ID (global ID) of the error.
- """
- id: ID!
-
- """
- Commit the error was last seen.
- """
- lastReleaseLastCommit: String
-
- """
- Release short version the error was last seen.
- """
- lastReleaseShortVersion: String
-
- """
- Release version the error was last seen.
- """
- lastReleaseVersion: String
-
- """
- Timestamp when the error was last seen.
- """
- lastSeen: Time!
-
- """
- Sentry metadata message of the error.
- """
- message: String
-
- """
- ID (Sentry ID) of the error.
- """
- sentryId: String!
-
- """
- ID of the project (Sentry project).
- """
- sentryProjectId: ID!
-
- """
- Name of the project affected by the error.
- """
- sentryProjectName: String!
-
- """
- Slug of the project affected by the error.
- """
- sentryProjectSlug: String!
-
- """
- Short ID (Sentry ID) of the error.
- """
- shortId: String!
-
- """
- Status of the error.
- """
- status: SentryErrorStatus!
-
- """
- Tags associated with the Sentry Error.
- """
- tags: SentryErrorTags!
-
- """
- Title of the error.
- """
- title: String!
-
- """
- Type of the error.
- """
- type: String!
-
- """
- Count of users affected by the error.
- """
- userCount: Int!
-}
-
-"""
-A Sentry error. A simplified version of SentryDetailedError
-"""
-type SentryError {
- """
- Count of occurrences.
- """
- count: Int!
-
- """
- Culprit of the error.
- """
- culprit: String!
-
- """
- External URL of the error.
- """
- externalUrl: String!
-
- """
- Timestamp when the error was first seen.
- """
- firstSeen: Time!
-
- """
- Last 24hr stats of the error.
- """
- frequency: [SentryErrorFrequency!]!
-
- """
- ID (global ID) of the error.
- """
- id: ID!
-
- """
- Timestamp when the error was last seen.
- """
- lastSeen: Time!
-
- """
- Sentry metadata message of the error.
- """
- message: String
-
- """
- ID (Sentry ID) of the error.
- """
- sentryId: String!
-
- """
- ID of the project (Sentry project).
- """
- sentryProjectId: ID!
-
- """
- Name of the project affected by the error.
- """
- sentryProjectName: String!
-
- """
- Slug of the project affected by the error.
- """
- sentryProjectSlug: String!
-
- """
- Short ID (Sentry ID) of the error.
- """
- shortId: String!
-
- """
- Status of the error.
- """
- status: SentryErrorStatus!
-
- """
- Title of the error.
- """
- title: String!
-
- """
- Type of the error.
- """
- type: String!
-
- """
- Count of users affected by the error.
- """
- userCount: Int!
-}
-
-"""
-An object containing a collection of Sentry errors, and a detailed error
-"""
-type SentryErrorCollection {
- """
- Detailed version of a Sentry error on the project.
- """
- detailedError(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryDetailedError
-
- """
- Stack Trace of Sentry Error.
- """
- errorStackTrace(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryErrorStackTrace
-
- """
- Collection of Sentry Errors.
- """
- errors(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query for the Sentry error details.
- """
- searchTerm: String
-
- """
- Attribute to sort on. Options are frequency, first_seen, last_seen. last_seen is default.
- """
- sort: String
- ): SentryErrorConnection
-
- """
- External URL for Sentry.
- """
- externalUrl: String
-}
-
-"""
-The connection type for SentryError.
-"""
-type SentryErrorConnection {
- """
- A list of edges.
- """
- edges: [SentryErrorEdge]
-
- """
- A list of nodes.
- """
- nodes: [SentryError]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SentryErrorEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SentryError
-}
-
-type SentryErrorFrequency {
- """
- Count of errors received since the previously recorded time.
- """
- count: Int!
-
- """
- Time the error frequency stats were recorded.
- """
- time: Time!
-}
-
-"""
-An object containing a stack trace entry for a Sentry error
-"""
-type SentryErrorStackTrace {
- """
- Time the stack trace was received by Sentry.
- """
- dateReceived: String!
-
- """
- ID of the Sentry error.
- """
- issueId: String!
-
- """
- Stack trace entries for the Sentry error.
- """
- stackTraceEntries: [SentryErrorStackTraceEntry!]!
-}
-
-"""
-An object context for a Sentry error stack trace
-"""
-type SentryErrorStackTraceContext {
- """
- Code number of the context.
- """
- code: String!
-
- """
- Line number of the context.
- """
- line: Int!
-}
-
-"""
-An object containing a stack trace entry for a Sentry error
-"""
-type SentryErrorStackTraceEntry {
- """
- Function in which the Sentry error occurred.
- """
- col: String
-
- """
- File in which the Sentry error occurred.
- """
- fileName: String
-
- """
- Function in which the Sentry error occurred.
- """
- function: String
-
- """
- Function in which the Sentry error occurred.
- """
- line: String
-
- """
- Context of the Sentry error.
- """
- traceContext: [SentryErrorStackTraceContext!]
-}
-
-"""
-State of a Sentry error
-"""
-enum SentryErrorStatus {
- """
- Error has been ignored
- """
- IGNORED
-
- """
- Error has been resolved
- """
- RESOLVED
-
- """
- Error has been ignored until next release
- """
- RESOLVED_IN_NEXT_RELEASE
-
- """
- Error is unresolved
- """
- UNRESOLVED
-}
-
-"""
-State of a Sentry error
-"""
-type SentryErrorTags {
- """
- Severity level of the Sentry Error.
- """
- level: String
-
- """
- Logger of the Sentry Error.
- """
- logger: String
-}
-
-interface Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Class name of the service.
- """
- type: String
-}
-
-"""
-The connection type for Service.
-"""
-type ServiceConnection {
- """
- A list of edges.
- """
- edges: [ServiceEdge]
-
- """
- A list of nodes.
- """
- nodes: [Service]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ServiceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Service
-}
-
-enum ServiceType {
- """
- AsanaService type
- """
- ASANA_SERVICE
-
- """
- AssemblaService type
- """
- ASSEMBLA_SERVICE
-
- """
- BambooService type
- """
- BAMBOO_SERVICE
-
- """
- BugzillaService type
- """
- BUGZILLA_SERVICE
-
- """
- BuildkiteService type
- """
- BUILDKITE_SERVICE
-
- """
- CampfireService type
- """
- CAMPFIRE_SERVICE
-
- """
- ConfluenceService type
- """
- CONFLUENCE_SERVICE
-
- """
- CustomIssueTrackerService type
- """
- CUSTOM_ISSUE_TRACKER_SERVICE
-
- """
- DatadogService type
- """
- DATADOG_SERVICE
-
- """
- DiscordService type
- """
- DISCORD_SERVICE
-
- """
- DroneCiService type
- """
- DRONE_CI_SERVICE
-
- """
- EmailsOnPushService type
- """
- EMAILS_ON_PUSH_SERVICE
-
- """
- EwmService type
- """
- EWM_SERVICE
-
- """
- ExternalWikiService type
- """
- EXTERNAL_WIKI_SERVICE
-
- """
- FlowdockService type
- """
- FLOWDOCK_SERVICE
-
- """
- GithubService type
- """
- GITHUB_SERVICE
-
- """
- HangoutsChatService type
- """
- HANGOUTS_CHAT_SERVICE
-
- """
- HipchatService type
- """
- HIPCHAT_SERVICE
-
- """
- IrkerService type
- """
- IRKER_SERVICE
-
- """
- JenkinsService type
- """
- JENKINS_SERVICE
-
- """
- JiraService type
- """
- JIRA_SERVICE
-
- """
- MattermostService type
- """
- MATTERMOST_SERVICE
-
- """
- MattermostSlashCommandsService type
- """
- MATTERMOST_SLASH_COMMANDS_SERVICE
-
- """
- MicrosoftTeamsService type
- """
- MICROSOFT_TEAMS_SERVICE
-
- """
- PackagistService type
- """
- PACKAGIST_SERVICE
-
- """
- PipelinesEmailService type
- """
- PIPELINES_EMAIL_SERVICE
-
- """
- PivotaltrackerService type
- """
- PIVOTALTRACKER_SERVICE
-
- """
- PrometheusService type
- """
- PROMETHEUS_SERVICE
-
- """
- PushoverService type
- """
- PUSHOVER_SERVICE
-
- """
- RedmineService type
- """
- REDMINE_SERVICE
-
- """
- SlackService type
- """
- SLACK_SERVICE
-
- """
- SlackSlashCommandsService type
- """
- SLACK_SLASH_COMMANDS_SERVICE
-
- """
- TeamcityService type
- """
- TEAMCITY_SERVICE
-
- """
- UnifyCircuitService type
- """
- UNIFY_CIRCUIT_SERVICE
-
- """
- WebexTeamsService type
- """
- WEBEX_TEAMS_SERVICE
-
- """
- YoutrackService type
- """
- YOUTRACK_SERVICE
-}
-
-"""
-Represents a snippet entry
-"""
-type Snippet implements Noteable {
- """
- The owner of the snippet.
- """
- author: User
-
- """
- Snippet blob. Deprecated in 13.3: Use `blobs`.
- """
- blob: SnippetBlob! @deprecated(reason: "Use `blobs`. Deprecated in 13.3.")
-
- """
- Snippet blobs.
- """
- blobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Paths of the blobs.
- """
- paths: [String!]
- ): SnippetBlobConnection
-
- """
- Timestamp this snippet was created.
- """
- createdAt: Time!
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- File Name of the snippet.
- """
- fileName: String
-
- """
- HTTP URL to the snippet repository.
- """
- httpUrlToRepo: String
-
- """
- ID of the snippet.
- """
- id: SnippetID!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The project the snippet is associated with.
- """
- project: Project
-
- """
- Raw URL of the snippet.
- """
- rawUrl: String!
-
- """
- SSH URL to the snippet repository.
- """
- sshUrlToRepo: String
-
- """
- Title of the snippet.
- """
- title: String!
-
- """
- Timestamp this snippet was updated.
- """
- updatedAt: Time!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: SnippetPermissions!
-
- """
- Visibility Level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum!
-
- """
- Web URL of the snippet.
- """
- webUrl: String!
-}
-
-"""
-Represents the snippet blob
-"""
-type SnippetBlob {
- """
- Shows whether the blob is binary.
- """
- binary: Boolean!
-
- """
- Blob external storage.
- """
- externalStorage: String
-
- """
- Blob mode.
- """
- mode: String
-
- """
- Blob name.
- """
- name: String
-
- """
- Blob path.
- """
- path: String
-
- """
- Blob plain highlighted data.
- """
- plainData: String
-
- """
- Blob raw content endpoint path.
- """
- rawPath: String!
-
- """
- Shows whether the blob is rendered as text.
- """
- renderedAsText: Boolean!
-
- """
- Blob highlighted data.
- """
- richData: String
-
- """
- Blob content rich viewer.
- """
- richViewer: SnippetBlobViewer
-
- """
- Blob content simple viewer.
- """
- simpleViewer: SnippetBlobViewer!
-
- """
- Blob size.
- """
- size: Int!
-}
-
-"""
-Type of a snippet blob input action
-"""
-enum SnippetBlobActionEnum {
- create
- delete
- move
- update
-}
-
-"""
-Represents an action to perform over a snippet file
-"""
-input SnippetBlobActionInputType {
- """
- Type of input action.
- """
- action: SnippetBlobActionEnum!
-
- """
- Snippet file content.
- """
- content: String
-
- """
- Path of the snippet file.
- """
- filePath: String!
-
- """
- Previous path of the snippet file.
- """
- previousPath: String
-}
-
-"""
-The connection type for SnippetBlob.
-"""
-type SnippetBlobConnection {
- """
- A list of edges.
- """
- edges: [SnippetBlobEdge]
-
- """
- A list of nodes.
- """
- nodes: [SnippetBlob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetBlobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SnippetBlob
-}
-
-"""
-Represents how the blob content should be displayed
-"""
-type SnippetBlobViewer {
- """
- Shows whether the blob should be displayed collapsed.
- """
- collapsed: Boolean!
-
- """
- Content file type.
- """
- fileType: String!
-
- """
- Shows whether the blob content is loaded asynchronously.
- """
- loadAsync: Boolean!
-
- """
- Loading partial name.
- """
- loadingPartialName: String!
-
- """
- Error rendering the blob content.
- """
- renderError: String
-
- """
- Shows whether the blob too large to be displayed.
- """
- tooLarge: Boolean!
-
- """
- Type of blob viewer.
- """
- type: BlobViewersType!
-}
-
-"""
-The connection type for Snippet.
-"""
-type SnippetConnection {
- """
- A list of edges.
- """
- edges: [SnippetEdge]
-
- """
- A list of nodes.
- """
- nodes: [Snippet]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Snippet
-}
-
-"""
-Identifier of Snippet.
-"""
-scalar SnippetID
-
-type SnippetPermissions {
- """
- Indicates the user can perform `admin_snippet` on this resource
- """
- adminSnippet: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `read_snippet` on this resource
- """
- readSnippet: Boolean!
-
- """
- Indicates the user can perform `report_snippet` on this resource
- """
- reportSnippet: Boolean!
-
- """
- Indicates the user can perform `update_snippet` on this resource
- """
- updateSnippet: Boolean!
-}
-
-"""
-Represents the Geo sync and verification state of a snippet repository
-"""
-type SnippetRepositoryRegistry {
- """
- Timestamp when the SnippetRepositoryRegistry was created
- """
- createdAt: Time
-
- """
- ID of the SnippetRepositoryRegistry
- """
- id: ID!
-
- """
- Error message during sync of the SnippetRepositoryRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the SnippetRepositoryRegistry
- """
- lastSyncedAt: Time
-
- """
- Timestamp after which the SnippetRepositoryRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the SnippetRepositoryRegistry
- """
- retryCount: Int
-
- """
- ID of the Snippet Repository.
- """
- snippetRepositoryId: ID!
-
- """
- Sync state of the SnippetRepositoryRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for SnippetRepositoryRegistry.
-"""
-type SnippetRepositoryRegistryConnection {
- """
- A list of edges.
- """
- edges: [SnippetRepositoryRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [SnippetRepositoryRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetRepositoryRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SnippetRepositoryRegistry
-}
-
-"""
-Common sort values
-"""
-enum Sort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-type StatusAction {
- """
- Title for the button, for example: Retry this job.
- """
- buttonTitle: String
-
- """
- Icon used in the action button.
- """
- icon: String
-
- """
- Method for the action, for example: :post.
- """
- method: String
-
- """
- Path for the action.
- """
- path: String
-
- """
- Title for the action, for example: Retry.
- """
- title: String
-}
-
-type Submodule implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Tree URL for the sub-module.
- """
- treeUrl: String
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web URL for the sub-module.
- """
- webUrl: String
-}
-
-"""
-The connection type for Submodule.
-"""
-type SubmoduleConnection {
- """
- A list of edges.
- """
- edges: [SubmoduleEdge]
-
- """
- A list of nodes.
- """
- nodes: [Submodule]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SubmoduleEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Submodule
-}
-
-"""
-Completion status of tasks
-"""
-type TaskCompletionStatus {
- """
- Number of completed tasks.
- """
- completedCount: Int!
-
- """
- Number of total tasks.
- """
- count: Int!
-}
-
-type TerraformState {
- """
- Timestamp the Terraform state was created.
- """
- createdAt: Time!
-
- """
- ID of the Terraform state.
- """
- id: ID!
-
- """
- The latest version of the Terraform state.
- """
- latestVersion: TerraformStateVersion
-
- """
- Timestamp the Terraform state was locked.
- """
- lockedAt: Time
-
- """
- The user currently holding a lock on the Terraform state.
- """
- lockedByUser: User
-
- """
- Name of the Terraform state.
- """
- name: String!
-
- """
- Timestamp the Terraform state was updated.
- """
- updatedAt: Time!
-}
-
-"""
-The connection type for TerraformState.
-"""
-type TerraformStateConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [TerraformStateEdge]
-
- """
- A list of nodes.
- """
- nodes: [TerraformState]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of TerraformStateDelete
-"""
-input TerraformStateDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateDelete
-"""
-type TerraformStateDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type TerraformStateEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TerraformState
-}
-
-"""
-Identifier of Terraform::State.
-"""
-scalar TerraformStateID
-
-"""
-Autogenerated input type of TerraformStateLock
-"""
-input TerraformStateLockInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateLock
-"""
-type TerraformStateLockPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of TerraformStateUnlock
-"""
-input TerraformStateUnlockInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateUnlock
-"""
-type TerraformStateUnlockPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type TerraformStateVersion {
- """
- Timestamp the version was created.
- """
- createdAt: Time!
-
- """
- The user that created this version.
- """
- createdByUser: User
-
- """
- URL for downloading the version's JSON file.
- """
- downloadPath: String
-
- """
- ID of the Terraform state version.
- """
- id: ID!
-
- """
- The job that created this version.
- """
- job: CiJob
-
- """
- Serial number of the version.
- """
- serial: Int
-
- """
- Timestamp the version was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Represents the Geo sync and verification state of a terraform state version
-"""
-type TerraformStateVersionRegistry {
- """
- Timestamp when the TerraformStateVersionRegistry was created
- """
- createdAt: Time
-
- """
- ID of the TerraformStateVersionRegistry
- """
- id: ID!
-
- """
- Error message during sync of the TerraformStateVersionRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the TerraformStateVersionRegistry
- """
- lastSyncedAt: Time
-
- """
- Timestamp after which the TerraformStateVersionRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the TerraformStateVersionRegistry
- """
- retryCount: Int
-
- """
- Sync state of the TerraformStateVersionRegistry
- """
- state: RegistryState
-
- """
- ID of the terraform state version.
- """
- terraformStateVersionId: ID!
-}
-
-"""
-The connection type for TerraformStateVersionRegistry.
-"""
-type TerraformStateVersionRegistryConnection {
- """
- A list of edges.
- """
- edges: [TerraformStateVersionRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [TerraformStateVersionRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TerraformStateVersionRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TerraformStateVersionRegistry
-}
-
-"""
-Represents a requirement test report
-"""
-type TestReport {
- """
- Author of the test report.
- """
- author: User
-
- """
- Timestamp of when the test report was created.
- """
- createdAt: Time!
-
- """
- ID of the test report.
- """
- id: ID!
-
- """
- State of the test report.
- """
- state: TestReportState!
-}
-
-"""
-The connection type for TestReport.
-"""
-type TestReportConnection {
- """
- A list of edges.
- """
- edges: [TestReportEdge]
-
- """
- A list of nodes.
- """
- nodes: [TestReport]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TestReportEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TestReport
-}
-
-"""
-State of a test report
-"""
-enum TestReportState {
- FAILED
- PASSED
-}
-
-"""
-Time represented in ISO 8601
-"""
-scalar Time
-
-"""
-Represents the time report stats for timeboxes
-"""
-type TimeReportStats {
- """
- Completed issues metrics.
- """
- complete: TimeboxMetrics
-
- """
- Incomplete issues metrics.
- """
- incomplete: TimeboxMetrics
-
- """
- Total issues metrics.
- """
- total: TimeboxMetrics
-}
-
-"""
-Represents measured stats metrics for timeboxes
-"""
-type TimeboxMetrics {
- """
- The count metric.
- """
- count: Int!
-
- """
- The weight metric.
- """
- weight: Int!
-}
-
-"""
-Represents a historically accurate report about the timebox
-"""
-type TimeboxReport {
- """
- Daily scope and completed totals for burnup charts.
- """
- burnupTimeSeries: [BurnupChartDailyTotals!]
-
- """
- Represents the time report stats for the timebox.
- """
- stats: TimeReportStats
-}
-
-interface TimeboxReportInterface {
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-}
-
-"""
-A time-frame defined as a closed inclusive range of two dates
-"""
-input Timeframe {
- """
- The end of the range.
- """
- end: Date!
-
- """
- The start of the range.
- """
- start: Date!
-}
-
-type Timelog {
- """
- The issue that logged time was added to.
- """
- issue: Issue
-
- """
- The note where the quick action to add the logged time was executed.
- """
- note: Note
-
- """
- Timestamp of when the time tracked was spent at.
- """
- spentAt: Time
-
- """
- The time spent displayed in seconds.
- """
- timeSpent: Int!
-
- """
- The user that logged the time.
- """
- user: User!
-}
-
-"""
-The connection type for Timelog.
-"""
-type TimelogConnection {
- """
- A list of edges.
- """
- edges: [TimelogEdge]
-
- """
- A list of nodes.
- """
- nodes: [Timelog]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TimelogEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Timelog
-}
-
-"""
-Representing a to-do entry
-"""
-type Todo {
- """
- Action of the to-do item.
- """
- action: TodoActionEnum!
-
- """
- The author of this to-do item.
- """
- author: User!
-
- """
- Body of the to-do item.
- """
- body: String!
-
- """
- Timestamp this to-do item was created.
- """
- createdAt: Time!
-
- """
- Group this to-do item is associated with.
- """
- group: Group
-
- """
- ID of the to-do item.
- """
- id: ID!
-
- """
- The project this to-do item is associated with.
- """
- project: Project
-
- """
- State of the to-do item.
- """
- state: TodoStateEnum!
-
- """
- Target type of the to-do item.
- """
- targetType: TodoTargetEnum!
-}
-
-enum TodoActionEnum {
- approval_required
- assigned
- build_failed
- directly_addressed
- marked
- mentioned
- unmergeable
-}
-
-"""
-The connection type for Todo.
-"""
-type TodoConnection {
- """
- A list of edges.
- """
- edges: [TodoEdge]
-
- """
- A list of nodes.
- """
- nodes: [Todo]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of TodoCreate
-"""
-input TodoCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item's parent. Issues, merge requests, designs and epics are supported.
- """
- targetId: TodoableID!
-}
-
-"""
-Autogenerated return type of TodoCreate
-"""
-type TodoCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The to-do item created.
- """
- todo: Todo
-}
-
-"""
-An edge in a connection.
-"""
-type TodoEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Todo
-}
-
-"""
-Identifier of Todo.
-"""
-scalar TodoID
-
-"""
-Autogenerated input type of TodoMarkDone
-"""
-input TodoMarkDoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item to mark as done.
- """
- id: TodoID!
-}
-
-"""
-Autogenerated return type of TodoMarkDone
-"""
-type TodoMarkDonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The requested to-do item.
- """
- todo: Todo!
-}
-
-"""
-Autogenerated input type of TodoRestore
-"""
-input TodoRestoreInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item to restore.
- """
- id: TodoID!
-}
-
-"""
-Autogenerated input type of TodoRestoreMany
-"""
-input TodoRestoreManyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global IDs of the to-do items to restore (a maximum of 50 is supported at once).
- """
- ids: [TodoID!]!
-}
-
-"""
-Autogenerated return type of TodoRestoreMany
-"""
-type TodoRestoreManyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated to-do items.
- """
- todos: [Todo!]!
-
- """
- The IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.
- """
- updatedIds: [TodoID!]! @deprecated(reason: "Use to-do items. Deprecated in 13.2.")
-}
-
-"""
-Autogenerated return type of TodoRestore
-"""
-type TodoRestorePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The requested to-do item.
- """
- todo: Todo!
-}
-
-enum TodoStateEnum {
- done
- pending
-}
-
-enum TodoTargetEnum {
- """
- An Alert
- """
- ALERT
-
- """
- A Commit
- """
- COMMIT
-
- """
- A Design
- """
- DESIGN
-
- """
- An Epic
- """
- EPIC
-
- """
- An Issue
- """
- ISSUE
-
- """
- A MergeRequest
- """
- MERGEREQUEST
-}
-
-"""
-Identifier of Todoable.
-"""
-scalar TodoableID
-
-"""
-Autogenerated input type of TodosMarkAllDone
-"""
-input TodosMarkAllDoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-}
-
-"""
-Autogenerated return type of TodosMarkAllDone
-"""
-type TodosMarkAllDonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated to-do items.
- """
- todos: [Todo!]!
-
- """
- IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.
- """
- updatedIds: [TodoID!]! @deprecated(reason: "Use to-do items. Deprecated in 13.2.")
-}
-
-"""
-Autogenerated input type of ToggleAwardEmoji
-"""
-input ToggleAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of ToggleAwardEmoji
-"""
-type ToggleAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.
- """
- toggledOn: Boolean!
-}
-
-type Tree {
- """
- Blobs of the tree.
- """
- blobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BlobConnection!
-
- """
- Last commit for the tree.
- """
- lastCommit: Commit
-
- """
- Sub-modules of the tree.
- """
- submodules(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SubmoduleConnection!
-
- """
- Trees of the tree.
- """
- trees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TreeEntryConnection!
-}
-
-"""
-Represents a directory
-"""
-type TreeEntry implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web path for the tree entry (directory).
- """
- webPath: String
-
- """
- Web URL for the tree entry (directory).
- """
- webUrl: String
-}
-
-"""
-The connection type for TreeEntry.
-"""
-type TreeEntryConnection {
- """
- A list of edges.
- """
- edges: [TreeEntryEdge]
-
- """
- A list of nodes.
- """
- nodes: [TreeEntry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TreeEntryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TreeEntry
-}
-
-enum TypeEnum {
- personal
- project
-}
-
-"""
-A regexp containing patterns sourced from user input
-"""
-scalar UntrustedRegexp
-
-"""
-Autogenerated input type of UpdateAlertStatus
-"""
-input UpdateAlertStatusInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-
- """
- The status to set the alert.
- """
- status: AlertManagementStatus!
-}
-
-"""
-Autogenerated return type of UpdateAlertStatus
-"""
-type UpdateAlertStatusPayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of UpdateBoardEpicUserPreferences
-"""
-input UpdateBoardEpicUserPreferencesInput {
- """
- The board global ID.
- """
- boardId: BoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether the epic should be collapsed in the board.
- """
- collapsed: Boolean!
-
- """
- ID of an epic to set preferences for.
- """
- epicId: EpicID!
-}
-
-"""
-Autogenerated return type of UpdateBoardEpicUserPreferences
-"""
-type UpdateBoardEpicUserPreferencesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- User preferences for the epic in the board after mutation.
- """
- epicUserPreferences: BoardEpicUserPreferences
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateBoard
-"""
-input UpdateBoardInput {
- """
- The ID of user to be assigned to the board.
- """
- assigneeId: UserID
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The board global ID.
- """
- id: BoardID!
-
- """
- The ID of iteration to be assigned to the board.
- """
- iterationId: IterationID
-
- """
- The IDs of labels to be added to the board.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- The ID of milestone to be assigned to the board.
- """
- milestoneId: MilestoneID
-
- """
- The board name.
- """
- name: String
-
- """
- The weight value to be assigned to the board.
- """
- weight: Int
-}
-
-"""
-Autogenerated input type of UpdateBoardList
-"""
-input UpdateBoardListInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if list is collapsed for this user.
- """
- collapsed: Boolean
-
- """
- Global ID of the list.
- """
- listId: ListID!
-
- """
- Position of list within the board.
- """
- position: Int
-}
-
-"""
-Autogenerated return type of UpdateBoardList
-"""
-type UpdateBoardListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Mutated list.
- """
- list: BoardList
-}
-
-"""
-Autogenerated return type of UpdateBoard
-"""
-type UpdateBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateComplianceFramework
-"""
-input UpdateComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the compliance framework to update.
- """
- id: ComplianceManagementFrameworkID!
-
- """
- Parameters to update the compliance framework with.
- """
- params: ComplianceFrameworkInput!
-}
-
-"""
-Autogenerated return type of UpdateComplianceFramework
-"""
-type UpdateComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The compliance framework after mutation.
- """
- complianceFramework: ComplianceFramework
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateContainerExpirationPolicy
-"""
-input UpdateContainerExpirationPolicyInput {
- """
- This container expiration policy schedule.
- """
- cadence: ContainerExpirationPolicyCadenceEnum
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates whether this container expiration policy is enabled.
- """
- enabled: Boolean
-
- """
- Number of tags to retain.
- """
- keepN: ContainerExpirationPolicyKeepEnum
-
- """
- Tags with names matching this regex pattern will expire.
- """
- nameRegex: UntrustedRegexp
-
- """
- Tags with names matching this regex pattern will be preserved.
- """
- nameRegexKeep: UntrustedRegexp
-
- """
- Tags older that this will expire.
- """
- olderThan: ContainerExpirationPolicyOlderThanEnum
-
- """
- The project path where the container expiration policy is located.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of UpdateContainerExpirationPolicy
-"""
-type UpdateContainerExpirationPolicyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The container expiration policy after mutation.
- """
- containerExpirationPolicy: ContainerExpirationPolicy
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-input UpdateDiffImagePositionInput {
- """
- Total height of the image.
- """
- height: Int
-
- """
- Total width of the image.
- """
- width: Int
-
- """
- X position of the note.
- """
- x: Int
-
- """
- Y position of the note.
- """
- y: Int
-}
-
-"""
-Autogenerated input type of UpdateEpic
-"""
-input UpdateEpicInput {
- """
- The IDs of labels to be added to the epic.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- The description of the epic.
- """
- description: String
-
- """
- The end date of the epic.
- """
- dueDateFixed: String
-
- """
- Indicates end date should be sourced from due_date_fixed field not the issue milestones.
- """
- dueDateIsFixed: Boolean
-
- """
- The group the epic to mutate is in.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The IDs of labels to be removed from the epic.
- """
- removeLabelIds: [ID!]
-
- """
- The start date of the epic.
- """
- startDateFixed: String
-
- """
- Indicates start date should be sourced from start_date_fixed field not the issue milestones.
- """
- startDateIsFixed: Boolean
-
- """
- State event for the epic.
- """
- stateEvent: EpicStateEvent
-
- """
- The title of the epic.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateEpic
-"""
-type UpdateEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateImageDiffNote
-"""
-input UpdateImageDiffNoteInput {
- """
- Content of the note.
- """
- body: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the note to update.
- """
- id: NoteID!
-
- """
- The position of this note on a diff.
- """
- position: UpdateDiffImagePositionInput
-}
-
-"""
-Autogenerated return type of UpdateImageDiffNote
-"""
-type UpdateImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of UpdateIssue
-"""
-input UpdateIssueInput {
- """
- The IDs of labels to be added to the issue.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean
-
- """
- Description of the issue.
- """
- description: String
-
- """
- Due date of the issue.
- """
- dueDate: ISO8601Date
-
- """
- The ID of the parent epic. NULL when removing the association.
- """
- epicId: EpicID
-
- """
- The desired health status.
- """
- healthStatus: HealthStatus
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- Indicates discussion is locked on the issue.
- """
- locked: Boolean
-
- """
- The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.
- """
- milestoneId: ID
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The IDs of labels to be removed from the issue.
- """
- removeLabelIds: [ID!]
-
- """
- Close or reopen an issue.
- """
- stateEvent: IssueStateEvent
-
- """
- Title of the issue.
- """
- title: String
-
- """
- The weight of the issue.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of UpdateIssue
-"""
-type UpdateIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of UpdateIteration
-"""
-input UpdateIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the iteration.
- """
- description: String
-
- """
- End date of the iteration.
- """
- dueDate: String
-
- """
- Group of the iteration.
- """
- groupPath: ID!
-
- """
- Global ID of the iteration.
- """
- id: ID!
-
- """
- Start date of the iteration.
- """
- startDate: String
-
- """
- Title of the iteration.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateIteration
-"""
-type UpdateIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated iteration.
- """
- iteration: Iteration
-}
-
-"""
-Autogenerated input type of UpdateNamespacePackageSettings
-"""
-input UpdateNamespacePackageSettingsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- When maven_duplicates_allowed is false, you can publish duplicate packages
- with names that match this regex. Otherwise, this setting has no effect.
- """
- mavenDuplicateExceptionRegex: UntrustedRegexp
-
- """
- Indicates whether duplicate Maven packages are allowed for this namespace.
- """
- mavenDuplicatesAllowed: Boolean
-
- """
- The namespace path where the namespace package setting is located.
- """
- namespacePath: ID!
-}
-
-"""
-Autogenerated return type of UpdateNamespacePackageSettings
-"""
-type UpdateNamespacePackageSettingsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The namespace package setting after mutation.
- """
- packageSettings: PackageSettings
-}
-
-"""
-Autogenerated input type of UpdateNote
-"""
-input UpdateNoteInput {
- """
- Content of the note.
- """
- body: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the note to update.
- """
- id: NoteID!
-}
-
-"""
-Autogenerated return type of UpdateNote
-"""
-type UpdateNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of UpdateRequirement
-"""
-input UpdateRequirementInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- The IID of the requirement to update.
- """
- iid: String!
-
- """
- Creates a test report for the requirement with the given state.
- """
- lastTestReportState: TestReportState
-
- """
- Full project path the requirement is associated with.
- """
- projectPath: ID!
-
- """
- State of the requirement.
- """
- state: RequirementState
-
- """
- Title of the requirement.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateRequirement
-"""
-type UpdateRequirementPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Requirement after mutation.
- """
- requirement: Requirement
-}
-
-"""
-Autogenerated input type of UpdateSnippet
-"""
-input UpdateSnippetInput {
- """
- Actions to perform over the snippet repository and blobs.
- """
- blobActions: [SnippetBlobActionInputType!]
-
- """
- A valid CAPTCHA response value obtained by using the provided captchaSiteKey
- with a CAPTCHA API to present a challenge to be solved on the client. Required
- to resubmit if the previous operation returned "NeedsCaptchaResponse: true".
- """
- captchaResponse: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The global ID of the snippet to update.
- """
- id: SnippetID!
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- the operation to be completed. Required to resubmit if the previous operation
- returned "NeedsCaptchaResponse: true".
- """
- spamLogId: Int
-
- """
- Title of the snippet.
- """
- title: String
-
- """
- The visibility level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum
-}
-
-"""
-Autogenerated return type of UpdateSnippet
-"""
-type UpdateSnippetPayload {
- """
- The CAPTCHA site key which must be used to render a challenge for the user to
- solve to obtain a valid captchaResponse value. Included only when an operation
- was not completed because "NeedsCaptchaResponse" is true.
- """
- captchaSiteKey: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates whether the operation was detected as possible spam and not
- completed. If CAPTCHA is enabled, the request must be resubmitted with a valid
- CAPTCHA response and spam_log_id included for the operation to be completed.
- Included only when an operation was not completed because
- "NeedsCaptchaResponse" is true.
- """
- needsCaptchaResponse: Boolean
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-
- """
- Indicates whether the operation was detected as definite spam. There is no
- option to resubmit the request with a CAPTCHA response.
- """
- spam: Boolean
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- an operation to be completed. Included only when an operation was not
- completed because "NeedsCaptchaResponse" is true.
- """
- spamLogId: Int
-}
-
-scalar Upload
-
-type User {
- """
- Merge Requests assigned to the user.
- """
- assignedMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Merge Requests authored by the user.
- """
- authoredMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- URL of the user's avatar.
- """
- avatarUrl: String
-
- """
- Indicates if the user is a bot.
- """
- bot: Boolean!
-
- """
- User email. Deprecated in 13.7: Use public_email.
- """
- email: String @deprecated(reason: "Use public_email. Deprecated in 13.7.")
-
- """
- Group count for the user. Available only when feature flag `user_group_counts` is enabled.
- """
- groupCount: Int
-
- """
- Group memberships of the user.
- """
- groupMemberships(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): GroupMemberConnection
-
- """
- ID of the user.
- """
- id: ID!
-
- """
- The location of the user.
- """
- location: String
-
- """
- Human-readable name of the user.
- """
- name: String!
-
- """
- Project memberships of the user.
- """
- projectMemberships(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectMemberConnection
-
- """
- User's public email.
- """
- publicEmail: String
-
- """
- Merge Requests assigned to the user for review.
- """
- reviewRequestedMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Snippets authored by the user.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The type of snippet.
- """
- type: TypeEnum
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Projects starred by the user.
- """
- starredProjects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query.
- """
- search: String
- ): ProjectConnection
-
- """
- State of the user.
- """
- state: UserState!
-
- """
- User status.
- """
- status: UserStatus
-
- """
- To-do items of the user.
- """
- todos(
- """
- The action to be filtered.
- """
- action: [TodoActionEnum!]
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: [ID!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The ID of a group.
- """
- groupId: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: [ID!]
-
- """
- The state of the todo.
- """
- state: [TodoStateEnum!]
-
- """
- The type of the todo.
- """
- type: [TodoTargetEnum!]
- ): TodoConnection!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: UserPermissions!
-
- """
- Username of the user. Unique within this instance of GitLab.
- """
- username: String!
-
- """
- Web path of the user.
- """
- webPath: String!
-
- """
- Web URL of the user.
- """
- webUrl: String!
-}
-
-"""
-The connection type for User.
-"""
-type UserConnection {
- """
- A list of edges.
- """
- edges: [UserEdge]
-
- """
- A list of nodes.
- """
- nodes: [User]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type UserEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: User
-}
-
-"""
-Identifier of User.
-"""
-scalar UserID
-
-type UserPermissions {
- """
- Indicates the user can perform `create_snippet` on this resource
- """
- createSnippet: Boolean!
-}
-
-"""
-Possible states of a user
-"""
-enum UserState {
- """
- The user is active and is able to use the system
- """
- active
-
- """
- The user has been blocked and is prevented from using the system
- """
- blocked
-
- """
- The user is no longer active and is unable to use the system
- """
- deactivated
-}
-
-type UserStatus {
- """
- User availability status.
- """
- availability: AvailabilityEnum!
-
- """
- String representation of emoji.
- """
- emoji: String
-
- """
- User status message.
- """
- message: String
-
- """
- HTML of the user status message
- """
- messageHtml: String
-}
-
-enum VisibilityLevelsEnum {
- internal
- private
- public
-}
-
-enum VisibilityScopesEnum {
- internal
- private
- public
-}
-
-"""
-Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days
-"""
-type VulnerabilitiesCountByDay {
- """
- Total number of vulnerabilities on a particular day with critical severity
- """
- critical: Int!
-
- """
- Date for the count.
- """
- date: ISO8601Date!
-
- """
- Total number of vulnerabilities on a particular day with high severity
- """
- high: Int!
-
- """
- Total number of vulnerabilities on a particular day with info severity
- """
- info: Int!
-
- """
- Total number of vulnerabilities on a particular day with low severity
- """
- low: Int!
-
- """
- Total number of vulnerabilities on a particular day with medium severity
- """
- medium: Int!
-
- """
- Total number of vulnerabilities on a particular day.
- """
- total: Int!
-
- """
- Total number of vulnerabilities on a particular day with unknown severity
- """
- unknown: Int!
-}
-
-"""
-Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days
-"""
-type VulnerabilitiesCountByDayAndSeverity {
- """
- Number of vulnerabilities.
- """
- count: Int
-
- """
- Date for the count.
- """
- day: ISO8601Date
-
- """
- Severity of the counted vulnerabilities.
- """
- severity: VulnerabilitySeverity
-}
-
-"""
-The connection type for VulnerabilitiesCountByDayAndSeverity.
-"""
-type VulnerabilitiesCountByDayAndSeverityConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilitiesCountByDayAndSeverityEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilitiesCountByDayAndSeverity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilitiesCountByDayAndSeverityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilitiesCountByDayAndSeverity
-}
-
-"""
-The connection type for VulnerabilitiesCountByDay.
-"""
-type VulnerabilitiesCountByDayConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilitiesCountByDayEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilitiesCountByDay]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilitiesCountByDayEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilitiesCountByDay
-}
-
-"""
-Identifier of Vulnerabilities::ExternalIssueLink.
-"""
-scalar VulnerabilitiesExternalIssueLinkID
-
-"""
-Represents a vulnerability
-"""
-type Vulnerability implements Noteable {
- """
- Timestamp of when the vulnerability state was changed to confirmed.
- """
- confirmedAt: Time
-
- """
- The user that confirmed the vulnerability.
- """
- confirmedBy: User
-
- """
- Description of the vulnerability.
- """
- description: String
-
- """
- Details of the vulnerability.
- """
- details: [VulnerabilityDetail!]!
-
- """
- Timestamp of when the vulnerability was first detected.
- """
- detectedAt: Time!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Timestamp of when the vulnerability state was changed to dismissed.
- """
- dismissedAt: Time
-
- """
- The user that dismissed the vulnerability.
- """
- dismissedBy: User
-
- """
- List of external issue links related to the vulnerability.
- """
- externalIssueLinks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityExternalIssueLinkConnection!
-
- """
- Indicates whether there is a solution available for this vulnerability.
- """
- hasSolutions: Boolean
-
- """
- GraphQL ID of the vulnerability.
- """
- id: ID!
-
- """
- Identifiers of the vulnerability.
- """
- identifiers: [VulnerabilityIdentifier!]!
-
- """
- List of issue links related to the vulnerability.
- """
- issueLinks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter issue links by link type.
- """
- linkType: VulnerabilityIssueLinkType
- ): VulnerabilityIssueLinkConnection!
-
- """
- Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability.
- """
- location: VulnerabilityLocation
-
- """
- Merge request that fixes the vulnerability.
- """
- mergeRequest: MergeRequest
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Primary identifier of the vulnerability.
- """
- primaryIdentifier: VulnerabilityIdentifier
-
- """
- The project on which the vulnerability was found.
- """
- project: Project
-
- """
- Type of the security report that found the vulnerability (SAST,
- DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION,
- COVERAGE_FUZZING, API_FUZZING)
- """
- reportType: VulnerabilityReportType
-
- """
- Timestamp of when the vulnerability state was changed to resolved.
- """
- resolvedAt: Time
-
- """
- The user that resolved the vulnerability.
- """
- resolvedBy: User
-
- """
- Indicates whether the vulnerability is fixed on the default branch or not.
- """
- resolvedOnDefaultBranch: Boolean!
-
- """
- Scanner metadata for the vulnerability.
- """
- scanner: VulnerabilityScanner
-
- """
- Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)
- """
- severity: VulnerabilitySeverity
-
- """
- State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED)
- """
- state: VulnerabilityState
-
- """
- Title of the vulnerability.
- """
- title: String
-
- """
- Number of user notes attached to the vulnerability.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: VulnerabilityPermissions!
-
- """
- URL to the vulnerability's details page.
- """
- vulnerabilityPath: String
-}
-
-"""
-Autogenerated input type of VulnerabilityConfirm
-"""
-input VulnerabilityConfirmInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be confirmed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityConfirm
-"""
-type VulnerabilityConfirmPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after state change.
- """
- vulnerability: Vulnerability
-}
-
-"""
-The connection type for Vulnerability.
-"""
-type VulnerabilityConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityEdge]
-
- """
- A list of nodes.
- """
- nodes: [Vulnerability]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type
-"""
-union VulnerabilityDetail = VulnerabilityDetailBase | VulnerabilityDetailBoolean | VulnerabilityDetailCode | VulnerabilityDetailCommit | VulnerabilityDetailDiff | VulnerabilityDetailFileLocation | VulnerabilityDetailInt | VulnerabilityDetailList | VulnerabilityDetailMarkdown | VulnerabilityDetailModuleLocation | VulnerabilityDetailTable | VulnerabilityDetailText | VulnerabilityDetailUrl
-
-"""
-Represents the vulnerability details base
-"""
-type VulnerabilityDetailBase {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details boolean value
-"""
-type VulnerabilityDetailBoolean {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the field.
- """
- value: Boolean!
-}
-
-"""
-Represents the vulnerability details code field
-"""
-type VulnerabilityDetailCode {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Language of the code.
- """
- lang: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Source code.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details commit field
-"""
-type VulnerabilityDetailCommit {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- The commit SHA value.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details diff field
-"""
-type VulnerabilityDetailDiff {
- """
- Value of the field after the change.
- """
- after: String!
-
- """
- Value of the field before the change.
- """
- before: String!
-
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details location within a file in the project
-"""
-type VulnerabilityDetailFileLocation {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- File name.
- """
- fileName: String!
-
- """
- End line number of the file location.
- """
- lineEnd: Int!
-
- """
- Start line number of the file location.
- """
- lineStart: Int!
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details integer value
-"""
-type VulnerabilityDetailInt {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the field.
- """
- value: Int!
-}
-
-"""
-Represents the vulnerability details list value
-"""
-type VulnerabilityDetailList {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- List of details.
- """
- items: [VulnerabilityDetail!]!
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details Markdown field
-"""
-type VulnerabilityDetailMarkdown {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the Markdown field.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details location within a file in the project
-"""
-type VulnerabilityDetailModuleLocation {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Module name.
- """
- moduleName: String!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Offset of the module location.
- """
- offset: Int!
-}
-
-"""
-Represents the vulnerability details table value
-"""
-type VulnerabilityDetailTable {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Table headers.
- """
- headers: [VulnerabilityDetail!]!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Table rows.
- """
- rows: [VulnerabilityDetail!]!
-}
-
-"""
-Represents the vulnerability details text field
-"""
-type VulnerabilityDetailText {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the text field.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details URL field
-"""
-type VulnerabilityDetailUrl {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Href of the URL.
- """
- href: String!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Text of the URL.
- """
- text: String
-}
-
-"""
-Autogenerated input type of VulnerabilityDismiss
-"""
-input VulnerabilityDismissInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Comment why vulnerability should be dismissed.
- """
- comment: String
-
- """
- Reason why vulnerability should be dismissed.
- """
- dismissalReason: VulnerabilityDismissalReason
-
- """
- ID of the vulnerability to be dismissed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityDismiss
-"""
-type VulnerabilityDismissPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after dismissal.
- """
- vulnerability: Vulnerability
-}
-
-"""
-The dismissal reason of the Vulnerability
-"""
-enum VulnerabilityDismissalReason {
- """
- The likelihood of the Vulnerability occurring and its impact are deemed acceptable
- """
- ACCEPTABLE_RISK
-
- """
- The Vulnerability was incorrectly identified as being present
- """
- FALSE_POSITIVE
-
- """
- There is a mitigating control that eliminates the Vulnerability or makes its risk acceptable
- """
- MITIGATING_CONTROL
-
- """
- Other reasons for dismissal
- """
- NOT_APPLICABLE
-
- """
- The Vulnerability is used in tests and does not pose an actual risk
- """
- USED_IN_TESTS
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Vulnerability
-}
-
-"""
-Represents an external issue link of a vulnerability
-"""
-type VulnerabilityExternalIssueLink {
- """
- The external issue attached to the issue link.
- """
- externalIssue: ExternalIssue
-
- """
- GraphQL ID of the external issue link.
- """
- id: VulnerabilitiesExternalIssueLinkID!
-
- """
- Type of the external issue link.
- """
- linkType: VulnerabilityExternalIssueLinkType!
-}
-
-"""
-The connection type for VulnerabilityExternalIssueLink.
-"""
-type VulnerabilityExternalIssueLinkConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityExternalIssueLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityExternalIssueLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of VulnerabilityExternalIssueLinkCreate
-"""
-input VulnerabilityExternalIssueLinkCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- External tracker type of the external issue link.
- """
- externalTracker: VulnerabilityExternalIssueLinkExternalTracker!
-
- """
- ID of the vulnerability.
- """
- id: VulnerabilityID!
-
- """
- Type of the external issue link.
- """
- linkType: VulnerabilityExternalIssueLinkType!
-}
-
-"""
-Autogenerated return type of VulnerabilityExternalIssueLinkCreate
-"""
-type VulnerabilityExternalIssueLinkCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created external issue link.
- """
- externalIssueLink: VulnerabilityExternalIssueLink
-}
-
-"""
-Autogenerated input type of VulnerabilityExternalIssueLinkDestroy
-"""
-input VulnerabilityExternalIssueLinkDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the vulnerability external issue link.
- """
- id: VulnerabilitiesExternalIssueLinkID!
-}
-
-"""
-Autogenerated return type of VulnerabilityExternalIssueLinkDestroy
-"""
-type VulnerabilityExternalIssueLinkDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityExternalIssueLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityExternalIssueLink
-}
-
-"""
-The external tracker of the external issue link related to a vulnerability
-"""
-enum VulnerabilityExternalIssueLinkExternalTracker {
- """
- Jira external tracker
- """
- JIRA
-}
-
-"""
-The type of the external issue link related to a vulnerability
-"""
-enum VulnerabilityExternalIssueLinkType {
- """
- Created link type
- """
- CREATED
-}
-
-"""
-The grade of the vulnerable project
-"""
-enum VulnerabilityGrade {
- A
- B
- C
- D
- F
-}
-
-"""
-Identifier of Vulnerability.
-"""
-scalar VulnerabilityID
-
-"""
-Represents a vulnerability identifier
-"""
-type VulnerabilityIdentifier {
- """
- External ID of the vulnerability identifier.
- """
- externalId: String
-
- """
- External type of the vulnerability identifier.
- """
- externalType: String
-
- """
- Name of the vulnerability identifier.
- """
- name: String
-
- """
- URL of the vulnerability identifier.
- """
- url: String
-}
-
-"""
-Represents an issue link of a vulnerability
-"""
-type VulnerabilityIssueLink {
- """
- GraphQL ID of the vulnerability.
- """
- id: ID!
-
- """
- The issue attached to issue link.
- """
- issue: Issue!
-
- """
- Type of the issue link.
- """
- linkType: VulnerabilityIssueLinkType!
-}
-
-"""
-The connection type for VulnerabilityIssueLink.
-"""
-type VulnerabilityIssueLinkConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityIssueLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityIssueLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityIssueLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityIssueLink
-}
-
-"""
-The type of the issue link related to a vulnerability
-"""
-enum VulnerabilityIssueLinkType {
- CREATED
- RELATED
-}
-
-"""
-Represents a vulnerability location. The fields with data will depend on the vulnerability report type
-"""
-union VulnerabilityLocation = VulnerabilityLocationContainerScanning | VulnerabilityLocationCoverageFuzzing | VulnerabilityLocationDast | VulnerabilityLocationDependencyScanning | VulnerabilityLocationSast | VulnerabilityLocationSecretDetection
-
-"""
-Represents the location of a vulnerability found by a container security scan
-"""
-type VulnerabilityLocationContainerScanning {
- """
- Dependency containing the vulnerability.
- """
- dependency: VulnerableDependency
-
- """
- Name of the vulnerable container image.
- """
- image: String
-
- """
- Operating system that runs on the vulnerable container image.
- """
- operatingSystem: String
-}
-
-"""
-Represents the location of a vulnerability found by a Coverage Fuzzing scan
-"""
-type VulnerabilityLocationCoverageFuzzing {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a DAST scan
-"""
-type VulnerabilityLocationDast {
- """
- Domain name of the vulnerable request.
- """
- hostname: String
-
- """
- Query parameter for the URL on which the vulnerability occurred.
- """
- param: String
-
- """
- URL path and query string of the vulnerable request.
- """
- path: String
-
- """
- HTTP method of the vulnerable request.
- """
- requestMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a dependency security scan
-"""
-type VulnerabilityLocationDependencyScanning {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Dependency containing the vulnerability.
- """
- dependency: VulnerableDependency
-
- """
- Path to the vulnerable file.
- """
- file: String
-}
-
-"""
-Represents the location of a vulnerability found by a SAST scan
-"""
-type VulnerabilityLocationSast {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a secret detection scan
-"""
-type VulnerabilityLocationSecretDetection {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Check permissions for the current user on a vulnerability
-"""
-type VulnerabilityPermissions {
- """
- Indicates the user can perform `admin_vulnerability` on this resource
- """
- adminVulnerability: Boolean!
-
- """
- Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource
- """
- adminVulnerabilityExternalIssueLink: Boolean!
-
- """
- Indicates the user can perform `admin_vulnerability_issue_link` on this resource
- """
- adminVulnerabilityIssueLink: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability` on this resource
- """
- createVulnerability: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability_export` on this resource
- """
- createVulnerabilityExport: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability_feedback` on this resource
- """
- createVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `destroy_vulnerability_feedback` on this resource
- """
- destroyVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `read_vulnerability_feedback` on this resource
- """
- readVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `update_vulnerability_feedback` on this resource
- """
- updateVulnerabilityFeedback: Boolean!
-}
-
-"""
-The type of the security scan that found the vulnerability
-"""
-enum VulnerabilityReportType {
- API_FUZZING
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- SAST
- SECRET_DETECTION
-}
-
-"""
-Autogenerated input type of VulnerabilityResolve
-"""
-input VulnerabilityResolveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be resolved.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityResolve
-"""
-type VulnerabilityResolvePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after state change.
- """
- vulnerability: Vulnerability
-}
-
-"""
-Autogenerated input type of VulnerabilityRevertToDetected
-"""
-input VulnerabilityRevertToDetectedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be reverted.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityRevertToDetected
-"""
-type VulnerabilityRevertToDetectedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after revert.
- """
- vulnerability: Vulnerability
-}
-
-"""
-Represents a vulnerability scanner
-"""
-type VulnerabilityScanner {
- """
- External ID of the vulnerability scanner.
- """
- externalId: String
-
- """
- Name of the vulnerability scanner.
- """
- name: String
-
- """
- Type of the vulnerability report.
- """
- reportType: VulnerabilityReportType
-
- """
- Vendor of the vulnerability scanner.
- """
- vendor: String
-}
-
-"""
-The connection type for VulnerabilityScanner.
-"""
-type VulnerabilityScannerConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityScannerEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityScanner]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityScannerEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityScanner
-}
-
-"""
-Represents vulnerability counts by severity
-"""
-type VulnerabilitySeveritiesCount {
- """
- Number of vulnerabilities of CRITICAL severity of the project
- """
- critical: Int
-
- """
- Number of vulnerabilities of HIGH severity of the project
- """
- high: Int
-
- """
- Number of vulnerabilities of INFO severity of the project
- """
- info: Int
-
- """
- Number of vulnerabilities of LOW severity of the project
- """
- low: Int
-
- """
- Number of vulnerabilities of MEDIUM severity of the project
- """
- medium: Int
-
- """
- Number of vulnerabilities of UNKNOWN severity of the project
- """
- unknown: Int
-}
-
-"""
-The severity of the vulnerability
-"""
-enum VulnerabilitySeverity {
- CRITICAL
- HIGH
- INFO
- LOW
- MEDIUM
- UNKNOWN
-}
-
-"""
-Vulnerability sort values
-"""
-enum VulnerabilitySort {
- """
- Detection timestamp in ascending order
- """
- detected_asc
-
- """
- Detection timestamp in descending order
- """
- detected_desc
-
- """
- Report Type in ascending order
- """
- report_type_asc
-
- """
- Report Type in descending order
- """
- report_type_desc
-
- """
- Severity in ascending order
- """
- severity_asc
-
- """
- Severity in descending order
- """
- severity_desc
-
- """
- State in ascending order
- """
- state_asc
-
- """
- State in descending order
- """
- state_desc
-
- """
- Title in ascending order
- """
- title_asc
-
- """
- Title in descending order
- """
- title_desc
-}
-
-"""
-The state of the vulnerability
-"""
-enum VulnerabilityState {
- CONFIRMED
- DETECTED
- DISMISSED
- RESOLVED
-}
-
-"""
-Represents a vulnerable dependency. Used in vulnerability location data
-"""
-type VulnerableDependency {
- """
- The package associated with the vulnerable dependency.
- """
- package: VulnerablePackage
-
- """
- The version of the vulnerable dependency.
- """
- version: String
-}
-
-"""
-Represents a vulnerable package. Used in vulnerability dependency data
-"""
-type VulnerablePackage {
- """
- The name of the vulnerable package.
- """
- name: String
-}
-
-"""
-Represents vulnerability letter grades with associated projects
-"""
-type VulnerableProjectsByGrade {
- """
- Number of projects within this grade.
- """
- count: Int!
-
- """
- Grade based on the highest severity vulnerability present.
- """
- grade: VulnerabilityGrade!
-
- """
- Projects within this grade.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectConnection!
-} \ No newline at end of file
diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json
deleted file mode 100644
index 492682d2e54..00000000000
--- a/doc/api/graphql/reference/gitlab_schema.json
+++ /dev/null
@@ -1,85944 +0,0 @@
-{
- "data": {
- "__schema": {
- "queryType": {
- "name": "Query"
- },
- "mutationType": {
- "name": "Mutation"
- },
- "subscriptionType": null,
- "types": [
- {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "description": "Represents the access level of a relationship between a User and object that it is related to",
- "fields": [
- {
- "name": "integerValue",
- "description": "Integer representation of access level.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stringValue",
- "description": "String representation of access level.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AccessLevelEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AccessLevelEnum",
- "description": "Access level to a resource",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NO_ACCESS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GUEST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REPORTER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEVELOPER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MAINTAINER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OWNER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AddAwardEmojiInput",
- "description": "Autogenerated input type of AddAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AddAwardEmojiPayload",
- "description": "Autogenerated return type of AddAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AddProjectToSecurityDashboardInput",
- "description": "Autogenerated input type of AddProjectToSecurityDashboard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the project to be added to Instance Security Dashboard.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AddProjectToSecurityDashboardPayload",
- "description": "Autogenerated return type of AddProjectToSecurityDashboard",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project that was added to the Instance Security Dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsInput",
- "description": "Autogenerated input type of AdminSidekiqQueuesDeleteJobs",
- "fields": null,
- "inputFields": [
- {
- "name": "user",
- "description": "Delete jobs matching user in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "project",
- "description": "Delete jobs matching project in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "rootNamespace",
- "description": "Delete jobs matching root_namespace in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "subscriptionPlan",
- "description": "Delete jobs matching subscription_plan in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "callerId",
- "description": "Delete jobs matching caller_id in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "remoteIp",
- "description": "Delete jobs matching remote_ip in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relatedClass",
- "description": "Delete jobs matching related_class in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "featureCategory",
- "description": "Delete jobs matching feature_category in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "queueName",
- "description": "The name of the queue to delete jobs from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsPayload",
- "description": "Autogenerated return type of AdminSidekiqQueuesDeleteJobs",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "result",
- "description": "Information about the status of the deletion request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteJobsResponse",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "description": "Describes an alert from the project's Alert Management",
- "fields": [
- {
- "name": "assignees",
- "description": "Assignees of the alert.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp the alert was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "details",
- "description": "Alert details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "JSON",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailsUrl",
- "description": "The URL of the alert detail page.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endedAt",
- "description": "Timestamp the alert ended.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "Environment for the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "eventCount",
- "description": "Number of events of this alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hosts",
- "description": "List of hosts the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueIid",
- "description": "Internal ID of the GitLab issue attached to the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricsDashboardUrl",
- "description": "URL for metrics embed for the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monitoringTool",
- "description": "Monitoring tool the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusAlert",
- "description": "The alert condition for Prometheus.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runbook",
- "description": "Runbook for the alert as defined in alert details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "service",
- "description": "Service the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startedAt",
- "description": "Timestamp the alert was raised.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "To-do items of the current user for the alert.",
- "args": [
- {
- "name": "action",
- "description": "The action to be filtered.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "The ID of a group.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The state of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the alert was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertConnection",
- "description": "The connection type for AlertManagementAlert.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "description": "Values for sorting alerts",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED_AT_ASC",
- "description": "Start time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED_AT_DESC",
- "description": "Start time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENDED_AT_ASC",
- "description": "End time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENDED_AT_DESC",
- "description": "End time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_TIME_ASC",
- "description": "Created time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_TIME_DESC",
- "description": "Created time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_TIME_ASC",
- "description": "Created time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_TIME_DESC",
- "description": "Created time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVENT_COUNT_ASC",
- "description": "Events count by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVENT_COUNT_DESC",
- "description": "Events count by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_ASC",
- "description": "Severity from less critical to more critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_DESC",
- "description": "Severity from more critical to less critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STATUS_ASC",
- "description": "Status by order: Ignored > Resolved > Acknowledged > Triggered",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STATUS_DESC",
- "description": "Status by order: Triggered > Acknowledged > Resolved > Ignored",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertStatusCountsType",
- "description": "Represents total number of alerts for the represented categories",
- "fields": [
- {
- "name": "acknowledged",
- "description": "Number of alerts with status ACKNOWLEDGED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": "Total number of alerts for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ignored",
- "description": "Number of alerts with status IGNORED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "open",
- "description": "Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Number of alerts with status RESOLVED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "triggered",
- "description": "Number of alerts with status TRIGGERED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "description": "Filters the alerts based on given domain",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "operations",
- "description": "Alerts for operations domain",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "threat_monitoring",
- "description": "Alerts for threat monitoring domain",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "description": "An endpoint and credentials used to accept alerts for a project",
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "description": "Identifier of AlertManagement::HttpIntegration.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationConnection",
- "description": "The connection type for AlertManagementIntegration.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "description": "Values of types of integrations",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PROMETHEUS",
- "description": "Prometheus integration",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HTTP",
- "description": "Integration with any monitoring tool",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPayloadAlertField",
- "description": "Parsed field from an alert used for custom mappings",
- "fields": [
- {
- "name": "label",
- "description": "Human-readable label of the payload path.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path to value inside payload JSON.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the parsed value.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "description": "Field that are available while modifying the custom mapping attributes for an HTTP integration",
- "fields": null,
- "inputFields": [
- {
- "name": "fieldName",
- "description": "A GitLab alert field name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldName",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "path",
- "description": "Path to value inside payload JSON.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "label",
- "description": "Human-readable label of the payload path.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "Type of the parsed value.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldName",
- "description": "Values for alert field names used in the custom mapping",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TITLE",
- "description": "The title of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCRIPTION",
- "description": "A high-level summary of the problem.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "START_TIME",
- "description": "The time of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "END_TIME",
- "description": "The resolved time of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SERVICE",
- "description": "The affected service.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MONITORING_TOOL",
- "description": "The name of the associated monitoring tool.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HOSTS",
- "description": "One or more hosts, as to where this incident occurred.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY",
- "description": "The severity of the alert.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FINGERPRINT",
- "description": "The unique identifier of the alert. This can be used to group occurrences of the same alert.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GITLAB_ENVIRONMENT_NAME",
- "description": "The name of the associated GitLab environment.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "description": "Values for alert field types used in the custom mapping",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ARRAY",
- "description": "Array field type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DATETIME",
- "description": "DateTime field type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STRING",
- "description": "String field type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "description": "An endpoint and credentials used to accept Prometheus alerts for a project",
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementSeverity",
- "description": "Alert severity values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CRITICAL",
- "description": "Critical severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": "High severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": "Medium severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": "Low severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INFO",
- "description": "Info severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNKNOWN",
- "description": "Unknown severity",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "description": "Alert status values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TRIGGERED",
- "description": "Triggered status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACKNOWLEDGED",
- "description": "Acknowledged status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED",
- "description": "Resolved status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IGNORED",
- "description": "Ignored status",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertSetAssigneesInput",
- "description": "Autogenerated input type of AlertSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the alert. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertSetAssigneesPayload",
- "description": "Autogenerated return type of AlertSetAssignees",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertTodoCreateInput",
- "description": "Autogenerated input type of AlertTodoCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertTodoCreatePayload",
- "description": "Autogenerated return type of AlertTodoCreate",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AnalyticsDevopsAdoptionSegmentID",
- "description": "Identifier of Analytics::DevopsAdoption::Segment.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfiguration",
- "description": "Data associated with configuring API fuzzing scans in GitLab CI",
- "fields": [
- {
- "name": "scanModes",
- "description": "All available scan modes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanProfiles",
- "description": "All default scan profiles.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ApiFuzzingScanProfile",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ApiFuzzingCiConfigurationCreateInput",
- "description": "Autogenerated input type of ApiFuzzingCiConfigurationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "apiSpecificationFile",
- "description": "File path or URL to the file that defines the API surface for scanning. Must be in the format specified by the `scanMode` argument.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authPassword",
- "description": "CI variable containing the password for authenticating with the target API.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authUsername",
- "description": "CI variable containing the username for authenticating with the target API.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "scanMode",
- "description": "The mode for API fuzzing scans.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanProfile",
- "description": "Name of a default profile to use for scanning. Ex: Quick-10.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "target",
- "description": "URL for the target of API fuzzing scans.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfigurationCreatePayload",
- "description": "Autogenerated return type of ApiFuzzingCiConfigurationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configurationYaml",
- "description": "A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCiYamlEditPath",
- "description": "The location at which the project's `.gitlab-ci.yml` file can be edited in the browser.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "description": "All possible ways to specify the API surface for an API fuzzing scan",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "HAR",
- "description": "The API surface is specified by a HAR file.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OPENAPI",
- "description": "The API surface is specified by a OPENAPI file.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingScanProfile",
- "description": "An API Fuzzing scan profile.",
- "fields": [
- {
- "name": "description",
- "description": "A short description of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The unique name of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yaml",
- "description": "A syntax highlit HTML representation of the YAML.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AvailabilityEnum",
- "description": "User availability status",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NOT_SET",
- "description": "Not Set",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUSY",
- "description": "Busy",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "description": "An emoji awarded by a user",
- "fields": [
- {
- "name": "description",
- "description": "The emoji description.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emoji",
- "description": "The emoji as an icon.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unicode",
- "description": "The emoji in Unicode.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unicodeVersion",
- "description": "The Unicode version for this emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user who awarded the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiAddInput",
- "description": "Autogenerated input type of AwardEmojiAdd",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiAddPayload",
- "description": "Autogenerated return type of AwardEmojiAdd",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "description": "The connection type for AwardEmoji.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AwardEmojiEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiRemoveInput",
- "description": "Autogenerated input type of AwardEmojiRemove",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiRemovePayload",
- "description": "Autogenerated return type of AwardEmojiRemove",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiToggleInput",
- "description": "Autogenerated input type of AwardEmojiToggle",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiTogglePayload",
- "description": "Autogenerated return type of AwardEmojiToggle",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggledOn",
- "description": "Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AwardableID",
- "description": "Identifier of Awardable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BaseService",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BigInt",
- "description": "Represents non-fractional signed whole numeric values. Since the value may exceed the size of a 32-bit integer, it's encoded as a string.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Blob",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsOid",
- "description": "LFS ID of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mode",
- "description": "Blob mode in numeric format.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BlobConnection",
- "description": "The connection type for Blob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BlobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BlobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "BlobViewersType",
- "description": "Types of blob viewers",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "rich",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "simple",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "auxiliary",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Board",
- "description": "Represents a project or group board",
- "fields": [
- {
- "name": "assignee",
- "description": "The board assignee.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epics",
- "description": "Epics associated with board issues.",
- "args": [
- {
- "name": "issueFilters",
- "description": "Filters applied when selecting issues on the board.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "The board iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the board.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lists",
- "description": "Lists of the board.",
- "args": [
- {
- "name": "id",
- "description": "Find a list by its global ID.",
- "type": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "issueFilters",
- "description": "Filters applied when getting issue metadata in the board list.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "The board milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "description": "The connection type for Board.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "description": "Represents an epic on an issue board",
- "fields": [
- {
- "name": "author",
- "description": "Author of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "A list of award emojis associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "children",
- "description": "Children (sub-epics) of the epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the epic was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the epic was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantCounts",
- "description": "Number of open and closed descendant epics and issues.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantWeightSum",
- "description": "Total weight of open and closed issues in the epic and its descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFixed",
- "description": "Fixed due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFromMilestones",
- "description": "Inherited due date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates if the due date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group to which the epic belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasChildren",
- "description": "Indicates if the epic has children.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasIssues",
- "description": "Indicates if the epic has direct issues.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasParent",
- "description": "Indicates if the epic has a parent epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "A list of issues associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels assigned to the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent epic of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants for the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the epic. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Indicates if the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relationship.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "The relative position of the epic in the epic tree.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFixed",
- "description": "Fixed start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFromMilestones",
- "description": "Inherited start date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates if the start date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the epic was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPreferences",
- "description": "User preferences for the epic on the issue board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicConnection",
- "description": "The connection type for BoardEpic.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEpicEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "description": "Represents user preferences for a board epic",
- "fields": [
- {
- "name": "collapsed",
- "description": "Indicates epic should be displayed as collapsed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardID",
- "description": "Identifier of Board.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "labelName",
- "description": "Filter by label name.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter by milestone title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Filter by assignee username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter by author username.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releaseTag",
- "description": "Filter by release tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "myReactionEmoji",
- "description": "Filter by reaction emoji.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Filter by epic ID. Incompatible with epicWildcardId.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationTitle",
- "description": "Filter by iteration title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "Filter by weight.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "not",
- "description": "List of negated params. Warning: this argument is experimental and a subject to change in future.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "NegatedBoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicWildcardId",
- "description": "Filter by epic ID wildcard. Incompatible with epicId.",
- "type": {
- "kind": "ENUM",
- "name": "EpicWildcardId",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationWildcardId",
- "description": "Filter by iteration ID wildcard.",
- "type": {
- "kind": "ENUM",
- "name": "IterationWildcardId",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardList",
- "description": "Represents a list for an issue board",
- "fields": [
- {
- "name": "assignee",
- "description": "Assignee in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "collapsed",
- "description": "Indicates if list is collapsed for this user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Board issues.",
- "args": [
- {
- "name": "filters",
- "description": "Filters applied when selecting issues in the board list.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesCount",
- "description": "Count of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "limitMetric",
- "description": "The current limit metric for the list.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "listType",
- "description": "Type of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "maxIssueCount",
- "description": "Maximum number of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "maxIssueWeight",
- "description": "Maximum weight of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "Position of list within the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalWeight",
- "description": "Total weight of all issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListConnection",
- "description": "The connection type for BoardList.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardListEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardListCreateInput",
- "description": "Autogenerated input type of BoardListCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "backlog",
- "description": "Create the backlog list.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelId",
- "description": "Global ID of an existing label.",
- "type": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the issue board to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "Global ID of an existing milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "Global ID of an existing iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "Global ID of an existing user.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListCreatePayload",
- "description": "Autogenerated return type of BoardListCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Issue list in the issue board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardListUpdateLimitMetricsInput",
- "description": "Autogenerated input type of BoardListUpdateLimitMetrics",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "The global ID of the list.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "limitMetric",
- "description": "The new limit metric type for the list.",
- "type": {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "maxIssueCount",
- "description": "The new maximum issue count limit.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "maxIssueWeight",
- "description": "The new maximum issue weight limit.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListUpdateLimitMetricsPayload",
- "description": "Autogenerated return type of BoardListUpdateLimitMetrics",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "The updated list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "description": "Identifier of Boards::EpicBoard.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "description": "Identifier of Boards::EpicList.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Boolean",
- "description": "Represents `true` or `false` values.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Branch",
- "description": null,
- "fields": [
- {
- "name": "commit",
- "description": "Commit for the branch.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the branch.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BurnupChartDailyTotals",
- "description": "Represents the total number of issues and their weights for a particular day",
- "fields": [
- {
- "name": "completedCount",
- "description": "Number of closed issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "completedWeight",
- "description": "Total weight of closed issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date for burnup totals.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopeCount",
- "description": "Number of issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopeWeight",
- "description": "Total weight of issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiApplicationSettings",
- "description": null,
- "fields": [
- {
- "name": "keepLatestArtifact",
- "description": "Whether to keep the latest jobs artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "description": null,
- "fields": [
- {
- "name": "name",
- "description": "Name of the job we need to complete.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeedConnection",
- "description": "The connection type for CiBuildNeed.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiBuildNeedEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeedEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CiCdSettingsUpdateInput",
- "description": "Autogenerated input type of CiCdSettingsUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full Path of the project the settings belong to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "keepLatestArtifact",
- "description": "Indicates if the latest artifact should be kept for this project.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiCdSettingsUpdatePayload",
- "description": "Autogenerated return type of CiCdSettingsUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfig",
- "description": null,
- "fields": [
- {
- "name": "errors",
- "description": "Linting errors.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedYaml",
- "description": "Merged CI configuration YAML.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stages",
- "description": "Stages of the pipeline.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigStageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of linting, can be either valid or invalid.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "CiConfigStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "description": null,
- "fields": [
- {
- "name": "jobs",
- "description": "Jobs in group.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroupConnection",
- "description": "The connection type for CiConfigGroup.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigGroupEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroupEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "description": null,
- "fields": [
- {
- "name": "afterScript",
- "description": "Override a set of commands that are executed after the job.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "allowFailure",
- "description": "Allow job to fail.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "beforeScript",
- "description": "Override a set of commands that are executed before the job.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "Name of an environment to which the job deploys.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "except",
- "description": "Limit when jobs are not created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupName",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needs",
- "description": "Builds that must complete before the jobs run.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigNeedConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "only",
- "description": "Jobs are created when these conditions do not apply.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "script",
- "description": "Shell script that is executed by a runner.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stage",
- "description": "Name of the job stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "List of tags that are used to select a runner.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "when",
- "description": "When to run the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobConnection",
- "description": "The connection type for CiConfigJob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigJobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "description": null,
- "fields": [
- {
- "name": "refs",
- "description": "The Git refs the job restriction applies to.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "description": null,
- "fields": [
- {
- "name": "name",
- "description": "Name of the need.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeedConnection",
- "description": "The connection type for CiConfigNeed.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigNeedEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeedEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "description": null,
- "fields": [
- {
- "name": "groups",
- "description": "Groups of jobs for the stage.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigGroupConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStageConnection",
- "description": "The connection type for CiConfigStage.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigStageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CiConfigStatus",
- "description": "Values for YAML processor result",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "VALID",
- "description": "The configuration file is valid",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INVALID",
- "description": "The configuration file is not valid",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroup",
- "description": null,
- "fields": [
- {
- "name": "detailedStatus",
- "description": "Detailed status of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobs",
- "description": "Jobs in group.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroupConnection",
- "description": "The connection type for CiGroup.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiGroupEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiGroup",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroupEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiGroup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJob",
- "description": null,
- "fields": [
- {
- "name": "artifacts",
- "description": "Artifacts generated by the job.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobArtifactConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailedStatus",
- "description": "Detailed status of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needs",
- "description": "References to builds that must complete before the jobs run.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiBuildNeedConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "Pipeline the job belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledAt",
- "description": "Schedule for the build.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "description": null,
- "fields": [
- {
- "name": "downloadPath",
- "description": "URL for downloading the artifact's file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileType",
- "description": "File type of the artifact.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "JobArtifactFileType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifactConnection",
- "description": "The connection type for CiJobArtifact.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobArtifactEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifactEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "description": "The connection type for CiJob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "description": "Identifier of Ci::Pipeline.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStage",
- "description": null,
- "fields": [
- {
- "name": "detailedStatus",
- "description": "Detailed status of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groups",
- "description": "Group of jobs for the stage.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiGroupConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStageConnection",
- "description": "The connection type for CiStage.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiStageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiStage",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiStage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the cluster agent was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "User object, containing information about the person who created the agent.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the cluster agent.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project this cluster agent is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tokens",
- "description": "Tokens associated with the cluster agent.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the cluster agent was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentConnection",
- "description": "The connection type for ClusterAgent.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentDeleteInput",
- "description": "Autogenerated input type of ClusterAgentDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the cluster agent that will be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentDeletePayload",
- "description": "Autogenerated return type of ClusterAgentDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "description": null,
- "fields": [
- {
- "name": "clusterAgent",
- "description": "Cluster agent this token is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp the token was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "The user who created the token.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the token.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenConnection",
- "description": "The connection type for ClusterAgentToken.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenCreateInput",
- "description": "Autogenerated input type of ClusterAgentTokenCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "clusterAgentId",
- "description": "Global ID of the cluster agent that will be associated with the new token.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenCreatePayload",
- "description": "Autogenerated return type of ClusterAgentTokenCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "secret",
- "description": "Token secret value. Make sure you save it - you won't be able to access it again.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenDeleteInput",
- "description": "Autogenerated input type of ClusterAgentTokenDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the cluster agent token that will be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenDeletePayload",
- "description": "Autogenerated return type of ClusterAgentTokenDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "description": "Identifier of Clusters::Agent.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "description": "Identifier of Clusters::AgentToken.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersClusterID",
- "description": "Identifier of Clusters::Cluster.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "description": "Represents the code coverage activity for a group",
- "fields": [
- {
- "name": "averageCoverage",
- "description": "Average percentage of the different code coverage results available for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageCount",
- "description": "Number of different code coverage results available for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date when the code coverage was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectCount",
- "description": "Number of projects with code coverage results for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityConnection",
- "description": "The connection type for CodeCoverageActivity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageSummary",
- "description": "Represents the code coverage summary for a project",
- "fields": [
- {
- "name": "averageCoverage",
- "description": "Average percentage of the different code coverage results available for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageCount",
- "description": "Number of different code coverage results available.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastUpdatedOn",
- "description": "Latest date when the code coverage was created for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Commit",
- "description": null,
- "fields": [
- {
- "name": "author",
- "description": "Author of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authorGravatar",
- "description": "Commit authors gravatar.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authorName",
- "description": "Commit authors name.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authoredDate",
- "description": "Timestamp of when the commit was authored.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Raw commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines of the commit ordered latest first.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA1 ID of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short SHA1 ID of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "signatureHtml",
- "description": "Rendered HTML of the commit signature.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CommitAction",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "action",
- "description": "The action to perform, create, delete, move, update, chmod.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "CommitActionMode",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "filePath",
- "description": "Full path to the file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Content of the file.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "previousPath",
- "description": "Original full path to the file being moved.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "lastCommitId",
- "description": "Last known file commit ID.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "executeFilemode",
- "description": "Enables/disables the execute flag on the file.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "encoding",
- "description": "Encoding of the file. Default is text.",
- "type": {
- "kind": "ENUM",
- "name": "CommitEncoding",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CommitActionMode",
- "description": "Mode of a commit action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATE",
- "description": "Create command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETE",
- "description": "Delete command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MOVE",
- "description": "Move command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATE",
- "description": "Update command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CHMOD",
- "description": "Chmod command",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitConnection",
- "description": "The connection type for Commit.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CommitEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CommitCreateInput",
- "description": "Autogenerated input type of CommitCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the branch is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "branch",
- "description": "Name of the branch to commit into, it can be a new branch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startBranch",
- "description": "If on a new branch, name of the original branch.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "message",
- "description": "Raw commit message.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "actions",
- "description": "Array of action hashes to commit as a batch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CommitAction",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitCreatePayload",
- "description": "Autogenerated return type of CommitCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": "The commit after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CommitEncoding",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TEXT",
- "description": "Text encoding",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BASE64",
- "description": "Base64 encoding",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "description": "Represents a ComplianceFramework associated with a Project",
- "fields": [
- {
- "name": "color",
- "description": "Hexadecimal representation of compliance framework's label color.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Compliance framework ID.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineConfigurationFullPath",
- "description": "Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "description": "The connection type for ComplianceFramework.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "New name for the compliance framework.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "New description for the compliance framework.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "color",
- "description": "New color representation of the compliance framework in hex format. e.g. #FCA121.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "pipelineConfigurationFullPath",
- "description": "Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "description": "Identifier of ComplianceManagement::Framework.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComposerMetadata",
- "description": "Composer metadata",
- "fields": [
- {
- "name": "composerJson",
- "description": "Data of the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageComposerJsonType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetSha",
- "description": "Target SHA of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ConfigureSastInput",
- "description": "Autogenerated input type of ConfigureSast",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "configuration",
- "description": "SAST CI configuration for the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ConfigureSastPayload",
- "description": "Autogenerated return type of ConfigureSast",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of creating the commit for the supplied SAST CI configuration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "successPath",
- "description": "Redirect path to use when the response is successful.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "description": "A tag expiration policy designed to keep only the images that matter most",
- "fields": [
- {
- "name": "cadence",
- "description": "This container expiration policy schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the container expiration policy was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this container expiration policy is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "keepN",
- "description": "Number of tags to retain.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameRegex",
- "description": "Tags with names matching this regex pattern will expire.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameRegexKeep",
- "description": "Tags with names matching this regex pattern will be preserved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nextRunAt",
- "description": "Next time that this container expiration policy will get executed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "olderThan",
- "description": "Tags older that this will expire.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the container expiration policy was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "EVERY_DAY",
- "description": "Every day",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_WEEK",
- "description": "Every week",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_TWO_WEEKS",
- "description": "Every two weeks",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_MONTH",
- "description": "Every month",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_THREE_MONTHS",
- "description": "Every three months",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ONE_TAG",
- "description": "1 tag per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIVE_TAGS",
- "description": "5 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEN_TAGS",
- "description": "10 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TWENTY_FIVE_TAGS",
- "description": "25 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIFTY_TAGS",
- "description": "50 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ONE_HUNDRED_TAGS",
- "description": "100 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SEVEN_DAYS",
- "description": "7 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FOURTEEN_DAYS",
- "description": "14 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "THIRTY_DAYS",
- "description": "30 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NINETY_DAYS",
- "description": "90 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "description": "A container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the container repository was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyCleanupStatus",
- "description": "The tags cleanup status for the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyStartedAt",
- "description": "Timestamp when the cleanup done by the expiration policy was started on the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project of the container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagsCount",
- "description": "Number of tags associated with this image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp when the container repository was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "description": "Status of the tags cleanup of a container repository",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNSCHEDULED",
- "description": "The tags cleanup is not scheduled. This is the default state.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEDULED",
- "description": "The tags cleanup is scheduled and is going to be executed shortly.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNFINISHED",
- "description": "The tags cleanup has been partially executed. There are still remaining tags to delete.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ONGOING",
- "description": "The tags cleanup is ongoing.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "description": "The connection type for ContainerRepository.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryDetails",
- "description": "Details of a container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the container repository was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyCleanupStatus",
- "description": "The tags cleanup status for the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyStartedAt",
- "description": "Timestamp when the cleanup done by the expiration policy was started on the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project of the container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Tags of the container repository.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagsCount",
- "description": "Number of tags associated with this image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp when the container repository was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "description": "Identifier of ContainerRepository.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "description": "Values for sorting container repositories",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NAME_ASC",
- "description": "Name by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NAME_DESC",
- "description": "Name by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "description": "Status of a container repository",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DELETE_SCHEDULED",
- "description": "Delete Scheduled status.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETE_FAILED",
- "description": "Delete Failed status.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "description": "A tag from a container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete this tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the tag was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "digest",
- "description": "Digest of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revision",
- "description": "Revision of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortRevision",
- "description": "Short revision of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalSize",
- "description": "The size of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "BigInt",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagConnection",
- "description": "The connection type for ContainerRepositoryTag.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateAlertIssueInput",
- "description": "Autogenerated input type of CreateAlertIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateAlertIssuePayload",
- "description": "Autogenerated return type of CreateAlertIssue",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateAnnotationInput",
- "description": "Autogenerated input type of CreateAnnotation",
- "fields": null,
- "inputFields": [
- {
- "name": "environmentId",
- "description": "The global ID of the environment to add an annotation to.",
- "type": {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clusterId",
- "description": "The global ID of the cluster to add an annotation to.",
- "type": {
- "kind": "SCALAR",
- "name": "ClustersClusterID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startingAt",
- "description": "Timestamp indicating starting moment to which the annotation relates.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endingAt",
- "description": "Timestamp indicating ending moment to which the annotation relates.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dashboardPath",
- "description": "The path to a file defining the dashboard on which the annotation should be added.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the annotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateAnnotationPayload",
- "description": "Autogenerated return type of CreateAnnotation",
- "fields": [
- {
- "name": "annotation",
- "description": "The created annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateBoardInput",
- "description": "Autogenerated input type of CreateBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "The ID of user to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of milestone to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The ID of iteration to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight value to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the board.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateBoardPayload",
- "description": "Autogenerated return type of CreateBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateBranchInput",
- "description": "Autogenerated input type of CreateBranch",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the branch is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the branch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Branch name or commit SHA to create branch from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateBranchPayload",
- "description": "Autogenerated return type of CreateBranch",
- "fields": [
- {
- "name": "branch",
- "description": "Branch after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Branch",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateClusterAgentInput",
- "description": "Autogenerated input type of CreateClusterAgent",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the associated project for this cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateClusterAgentPayload",
- "description": "Autogenerated return type of CreateClusterAgent",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgent",
- "description": "Cluster agent created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateComplianceFrameworkInput",
- "description": "Autogenerated input type of CreateComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "namespacePath",
- "description": "Full path of the namespace to add the compliance framework to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "params",
- "description": "Parameters to update the compliance framework with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateComplianceFrameworkPayload",
- "description": "Autogenerated return type of CreateComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "framework",
- "description": "The created compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateCustomEmojiInput",
- "description": "Autogenerated input type of CreateCustomEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "Namespace full path the emoji is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the emoji.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "url",
- "description": "Location of the emoji file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateCustomEmojiPayload",
- "description": "Autogenerated return type of CreateCustomEmoji",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "customEmoji",
- "description": "The new custom emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateDevopsAdoptionSegmentInput",
- "description": "Autogenerated input type of CreateDevopsAdoptionSegment",
- "fields": null,
- "inputFields": [
- {
- "name": "namespaceId",
- "description": "Namespace ID to set for the segment.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateDevopsAdoptionSegmentPayload",
- "description": "Autogenerated return type of CreateDevopsAdoptionSegment",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "segment",
- "description": "The segment after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateDiffNoteInput",
- "description": "Autogenerated input type of CreateDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateDiffNotePayload",
- "description": "Autogenerated return type of CreateDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateEpicInput",
- "description": "Autogenerated input type of CreateEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "The group the epic to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateFixed",
- "description": "The start date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateFixed",
- "description": "The end date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateEpicPayload",
- "description": "Autogenerated return type of CreateEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The created epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateImageDiffNoteInput",
- "description": "Autogenerated input type of CreateImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffImagePositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateImageDiffNotePayload",
- "description": "Autogenerated return type of CreateImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateIssueInput",
- "description": "Autogenerated input type of CreateIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "description",
- "description": "Description of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Indicates discussion is locked on the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Project full path the issue is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID (internal ID) of a project issue. Only admins and project owners can modify.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the issue was created. Available only for admins and project owners.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergeRequestToResolveDiscussionsOf",
- "description": "The IID of a merge request for which to resolve discussions.",
- "type": {
- "kind": "SCALAR",
- "name": "MergeRequestID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "discussionToResolve",
- "description": "The ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeIds",
- "description": "The array of user IDs to assign to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "healthStatus",
- "description": "The desired health status.",
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of an epic to associate the issue with.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateIssuePayload",
- "description": "Autogenerated return type of CreateIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateIterationInput",
- "description": "Autogenerated input type of CreateIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDate",
- "description": "The start date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "The end date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateIterationPayload",
- "description": "Autogenerated return type of CreateIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "The created iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateNoteInput",
- "description": "Autogenerated input type of CreateNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "discussionId",
- "description": "The global ID of the discussion this note is in reply to.",
- "type": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateNotePayload",
- "description": "Autogenerated return type of CreateNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateRequirementInput",
- "description": "Autogenerated input type of CreateRequirement",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "Title of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirement is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateRequirementPayload",
- "description": "Autogenerated return type of CreateRequirement",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Requirement after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateSnippetInput",
- "description": "Autogenerated input type of CreateSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "captchaResponse",
- "description": "A valid CAPTCHA response value obtained by using the provided captchaSiteKey with a CAPTCHA API to present a challenge to be solved on the client. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for the operation to be completed. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "visibilityLevel",
- "description": "The visibility level of the snippet.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The project full path the snippet is associated with.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "uploadedFiles",
- "description": "The paths to files uploaded in the snippet description.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "blobActions",
- "description": "Actions to perform over the snippet repository and blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateSnippetPayload",
- "description": "Autogenerated return type of CreateSnippet",
- "fields": [
- {
- "name": "captchaSiteKey",
- "description": "The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsCaptchaResponse",
- "description": "Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spam",
- "description": "Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateTestCaseInput",
- "description": "Autogenerated input type of CreateTestCase",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "The test case title.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The test case description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the test case.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The project full path to create the test case.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateTestCasePayload",
- "description": "Autogenerated return type of CreateTestCase",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "testCase",
- "description": "The test case created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "description": null,
- "fields": [
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "description": "A custom emoji uploaded by user",
- "fields": [
- {
- "name": "external",
- "description": "Whether the emoji is an external link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CustomEmojiID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The link to file of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmojiConnection",
- "description": "The connection type for CustomEmoji.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CustomEmojiEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmojiEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "CustomEmojiID",
- "description": "Identifier of CustomEmoji.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastOnDemandScanCreateInput",
- "description": "Autogenerated input type of DastOnDemandScanCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be used for the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be used for the scan.",
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastOnDemandScanCreatePayload",
- "description": "Autogenerated return type of DastOnDemandScanCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfile",
- "description": "Represents a DAST Profile",
- "fields": [
- {
- "name": "dastScannerProfile",
- "description": "The associated scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfile",
- "description": "The associated site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "The description of the scan.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileConnection",
- "description": "The connection type for DastProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileCreateInput",
- "description": "Autogenerated input type of DastProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the profile. Defaults to an empty string.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be associated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be associated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "runAfterCreate",
- "description": "Run scan using profile after creation. Defaults to false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileCreatePayload",
- "description": "Autogenerated return type of DastProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfile",
- "description": "The created profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileDeleteInput",
- "description": "Autogenerated input type of DastProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileDeletePayload",
- "description": "Autogenerated return type of DastProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "description": "Identifier of Dast::Profile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileRunInput",
- "description": "Autogenerated input type of DastProfileRun",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full path for the project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the profile to be used for the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileRunPayload",
- "description": "Autogenerated return type of DastProfileRun",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileUpdateInput",
- "description": "Autogenerated input type of DastProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "fullPath",
- "description": "The project the profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the profile. Defaults to an empty string.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be associated.",
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be associated.",
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "runAfterUpdate",
- "description": "Run scan using profile after update. Defaults to false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileUpdatePayload",
- "description": "Autogenerated return type of DastProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfile",
- "description": "The updated profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "The URL of the pipeline that was created. Requires the input argument `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no pipeline will be created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PASSIVE",
- "description": "Passive DAST scan. This scan will not make active attacks against the target site.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACTIVE",
- "description": "Active DAST scan. This scan will make active attacks against the target site.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "description": "Represents a DAST scanner profile",
- "fields": [
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "globalId",
- "description": "ID of the DAST scanner profile. Deprecated in 13.6: Use `id`.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `id`. Deprecated in 13.6."
- },
- {
- "name": "id",
- "description": "ID of the DAST scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "profileName",
- "description": "Name of the DAST scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileConnection",
- "description": "The connection type for DastScannerProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastScannerProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileCreateInput",
- "description": "Autogenerated input type of DastScannerProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the scanner profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "defaultValue": "PASSIVE"
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileCreatePayload",
- "description": "Autogenerated return type of DastScannerProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "globalId",
- "description": "ID of the scanner profile. Deprecated in 13.6: Use `id`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `id`. Deprecated in 13.6."
- },
- {
- "name": "id",
- "description": "ID of the scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileDeleteInput",
- "description": "Autogenerated input type of DastScannerProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full path for the project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileDeletePayload",
- "description": "Autogenerated return type of DastScannerProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "description": "Identifier of DastScannerProfile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileUpdateInput",
- "description": "Autogenerated input type of DastScannerProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile to be updated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the scanner profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileUpdatePayload",
- "description": "Autogenerated return type of DastScannerProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "description": "Represents a DAST Site Profile",
- "fields": [
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be scanned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfilePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "validationStatus",
- "description": "The current validation status of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileConnection",
- "description": "The connection type for DastSiteProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileCreateInput",
- "description": "Autogenerated input type of DastSiteProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileCreatePayload",
- "description": "Autogenerated return type of DastSiteProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileDeleteInput",
- "description": "Autogenerated input type of DastSiteProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the site profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileDeletePayload",
- "description": "Autogenerated return type of DastSiteProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "description": "Identifier of DastSiteProfile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfilePermissions",
- "description": "Check permissions for the current user on site profile",
- "fields": [
- {
- "name": "createOnDemandDastScan",
- "description": "Indicates the user can perform `create_on_demand_dast_scan` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileUpdateInput",
- "description": "Autogenerated input type of DastSiteProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the site profile to be updated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileUpdatePayload",
- "description": "Autogenerated return type of DastSiteProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No site validation exists",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PENDING_VALIDATION",
- "description": "Site validation process has not started",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPROGRESS_VALIDATION",
- "description": "Site validation process is in progress",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PASSED_VALIDATION",
- "description": "Site validation process finished successfully",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED_VALIDATION",
- "description": "Site validation process finished but failed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteTokenCreateInput",
- "description": "Autogenerated input type of DastSiteTokenCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site token belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be validated.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteTokenCreatePayload",
- "description": "Autogenerated return type of DastSiteTokenCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site token.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "The current validation status of the target.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "description": "Identifier of DastSiteToken.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "description": "Represents a DAST Site Validation",
- "fields": [
- {
- "name": "id",
- "description": "Global ID of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be validated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationConnection",
- "description": "The connection type for DastSiteValidation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteValidationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationCreateInput",
- "description": "Autogenerated input type of DastSiteValidationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastSiteTokenId",
- "description": "ID of the site token.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "validationPath",
- "description": "The path to be requested during validation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "strategy",
- "description": "The validation strategy to be used.",
- "type": {
- "kind": "ENUM",
- "name": "DastSiteValidationStrategyEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationCreatePayload",
- "description": "Autogenerated return type of DastSiteValidationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "The current validation status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "description": "Identifier of DastSiteValidation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationRevokeInput",
- "description": "Autogenerated input type of DastSiteValidationRevoke",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site validation belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be revoked.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationRevokePayload",
- "description": "Autogenerated return type of DastSiteValidationRevoke",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastSiteValidationStrategyEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TEXT_FILE",
- "description": "Text file validation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HEADER",
- "description": "Header validation",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DataVisualizationColorEnum",
- "description": "Color of the data visualization palette",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "BLUE",
- "description": "Blue color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ORANGE",
- "description": "Orange color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "AQUA",
- "description": "Aqua color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GREEN",
- "description": "Green color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MAGENTA",
- "description": "Magenta color",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DataVisualizationWeightEnum",
- "description": "Weight of the data visualization palette",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "WEIGHT_50",
- "description": "50 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_100",
- "description": "100 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_200",
- "description": "200 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_300",
- "description": "300 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_400",
- "description": "400 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_500",
- "description": "500 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_600",
- "description": "600 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_700",
- "description": "700 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_800",
- "description": "800 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_900",
- "description": "900 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_950",
- "description": "950 weight",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Date",
- "description": "Date represented in ISO 8601",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DeleteAnnotationInput",
- "description": "Autogenerated input type of DeleteAnnotation",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the annotation to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "MetricsDashboardAnnotationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteAnnotationPayload",
- "description": "Autogenerated return type of DeleteAnnotation",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DeleteDevopsAdoptionSegmentInput",
- "description": "Autogenerated input type of DeleteDevopsAdoptionSegment",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the segment.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AnalyticsDevopsAdoptionSegmentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteDevopsAdoptionSegmentPayload",
- "description": "Autogenerated return type of DeleteDevopsAdoptionSegment",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteJobsResponse",
- "description": "The response from the AdminSidekiqQueuesDeleteJobs mutation",
- "fields": [
- {
- "name": "completed",
- "description": "Whether or not the entire queue was processed in time; if not, retrying the same request is safe.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletedJobs",
- "description": "The number of matching jobs deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "queueSize",
- "description": "The queue size after processing.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "description": "A single design",
- "fields": [
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "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",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "All versions related to this design ordered newest first.",
- "args": [
- {
- "name": "earlierOrEqualToSha",
- "description": "The SHA256 of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "earlierOrEqualToId",
- "description": "The Global ID of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "description": "A design pinned to a specific version. The image field reflects the design as of the associated version",
- "fields": [
- {
- "name": "design",
- "description": "The underlying design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "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",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version this design-at-versions is pinned to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersionConnection",
- "description": "The connection type for DesignAtVersion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "description": "A collection of designs",
- "fields": [
- {
- "name": "copyState",
- "description": "Copy state of the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DesignCollectionCopyState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "design",
- "description": "Find a specific design.",
- "args": [
- {
- "name": "id",
- "description": "Find a design by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filename",
- "description": "Find a design by its filename.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designAtVersion",
- "description": "Find a design as of a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the design at this version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "All designs for the design collection.",
- "args": [
- {
- "name": "ids",
- "description": "Filters designs by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "Filters designs by their filename.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "atVersion",
- "description": "Filters designs to only those that existed at the version. If argument is omitted or nil then all designs will reflect the latest version",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "Issue associated with the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project associated with the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "A specific version.",
- "args": [
- {
- "name": "sha",
- "description": "The SHA256 of a specific version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The Global ID of the version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "All versions related to all designs, ordered newest first.",
- "args": [
- {
- "name": "earlierOrEqualToSha",
- "description": "The SHA256 of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "earlierOrEqualToId",
- "description": "The Global ID of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DesignCollectionCopyState",
- "description": "Copy state of a DesignCollection",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "READY",
- "description": "The DesignCollection has no copy in progress",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IN_PROGRESS",
- "description": "The DesignCollection is being copied",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ERROR",
- "description": "The DesignCollection encountered an error during a copy",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "description": "The connection type for Design.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "description": null,
- "fields": [
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "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",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagement",
- "description": null,
- "fields": [
- {
- "name": "designAtVersion",
- "description": "Find a design as of a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the design at this version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Find a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementDeleteInput",
- "description": "Autogenerated input type of DesignManagementDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project where the issue is to upload designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to modify designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "The filenames of the designs to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementDeletePayload",
- "description": "Autogenerated return type of DesignManagementDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The new version in which the designs are deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "description": "Identifier of DesignManagement::DesignAtVersion.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "description": "Identifier of DesignManagement::Design.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementMoveInput",
- "description": "Autogenerated input type of DesignManagementMove",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the design to move.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "previous",
- "description": "ID of the immediately preceding design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "next",
- "description": "ID of the immediately following design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementMovePayload",
- "description": "Autogenerated return type of DesignManagementMove",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "The current state of the collection.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementUploadInput",
- "description": "Autogenerated input type of DesignManagementUpload",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project where the issue is to upload designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to modify designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "files",
- "description": "The files to upload.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Upload",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementUploadPayload",
- "description": "Autogenerated return type of DesignManagementUpload",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "The designs that were uploaded by the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "skippedDesigns",
- "description": "Any designs that were skipped from the upload due to there being no change to their content since their last version",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "description": "Identifier of DesignManagement::Version.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "description": "A specific version in which designs were added, modified or deleted",
- "fields": [
- {
- "name": "designAtVersion",
- "description": "A particular design as of this version, provided it is visible at this version.",
- "args": [
- {
- "name": "id",
- "description": "The ID of the DesignAtVersion.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "designId",
- "description": "The ID of a specific design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filename",
- "description": "The filename of a specific design.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "All designs that were changed in the version.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designsAtVersion",
- "description": "All designs that are visible at this version, as of this version.",
- "args": [
- {
- "name": "ids",
- "description": "Filters designs by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "Filters designs by their filename.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the design version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA of the design version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "description": "The connection type for DesignVersion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "description": "Mutation event of a design within a version",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No change",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATION",
- "description": "A creation event",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MODIFICATION",
- "description": "A modification event",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETION",
- "description": "A deletion event",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardInput",
- "description": "Autogenerated input type of DestroyBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the board to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardListInput",
- "description": "Autogenerated input type of DestroyBoardList",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "Global ID of the list to destroy. Only label lists are accepted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyBoardListPayload",
- "description": "Autogenerated return type of DestroyBoardList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "The list after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyBoardPayload",
- "description": "Autogenerated return type of DestroyBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyComplianceFrameworkInput",
- "description": "Autogenerated input type of DestroyComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the compliance framework to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyComplianceFrameworkPayload",
- "description": "Autogenerated return type of DestroyComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryInput",
- "description": "Autogenerated input type of DestroyContainerRepository",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryPayload",
- "description": "Autogenerated return type of DestroyContainerRepository",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepository",
- "description": "The container repository policy after scheduling the deletion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryTagsInput",
- "description": "Autogenerated input type of DestroyContainerRepositoryTags",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagNames",
- "description": "Container repository tag(s) to delete. Total number can't be greater than 20",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryTagsPayload",
- "description": "Autogenerated return type of DestroyContainerRepositoryTags",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletedTagNames",
- "description": "Deleted container repository tags.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyNoteInput",
- "description": "Autogenerated input type of DestroyNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyNotePayload",
- "description": "Autogenerated return type of DestroyNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroySnippetInput",
- "description": "Autogenerated input type of DestroySnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the snippet to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroySnippetPayload",
- "description": "Autogenerated return type of DestroySnippet",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "description": null,
- "fields": [
- {
- "name": "action",
- "description": "Action information for the status. This includes method, button title, icon, path, and title.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "StatusAction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailsPath",
- "description": "Path of the details for the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "favicon",
- "description": "Favicon of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasDetails",
- "description": "Indicates if the status has further details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "icon",
- "description": "Icon of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "text",
- "description": "Text of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tooltip",
- "description": "Tooltip associated with the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "description": "Segment",
- "fields": [
- {
- "name": "id",
- "description": "ID of the segment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestSnapshot",
- "description": "The latest adoption metrics for the segment.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSnapshot",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Segment namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentConnection",
- "description": "The connection type for DevopsAdoptionSegment.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSnapshot",
- "description": "Snapshot",
- "fields": [
- {
- "name": "deploySucceeded",
- "description": "At least one deployment succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endTime",
- "description": "The end time for the snapshot where the data points were collected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueOpened",
- "description": "At least one issue was opened.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestApproved",
- "description": "At least one merge request was approved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestOpened",
- "description": "At least one merge request was opened.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineSucceeded",
- "description": "At least one pipeline succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "recordedAt",
- "description": "The time the snapshot was recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerConfigured",
- "description": "At least one runner was used.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityScanSucceeded",
- "description": "At least one security scan succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startTime",
- "description": "The start time for the snapshot where the data points were collected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffImagePositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "paths",
- "description": "The paths of the file that was changed. Both of the properties of this input are optional, but at least one of them is required",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "x",
- "description": "X position of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DiffNoteID",
- "description": "Identifier of DiffNote.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "oldPath",
- "description": "The path of the file on the start sha.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newPath",
- "description": "The path of the file on the head sha.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffPosition",
- "description": null,
- "fields": [
- {
- "name": "diffRefs",
- "description": "Information about the branch, HEAD, and base at the time of commenting.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filePath",
- "description": "Path of the file that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "newLine",
- "description": "Line on HEAD SHA that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "newPath",
- "description": "Path of the file on the HEAD SHA.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oldLine",
- "description": "Line on start SHA that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oldPath",
- "description": "Path of the file on the start SHA.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "positionType",
- "description": "Type of file the position refers to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DiffPositionType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "x",
- "description": "X position of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffPositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "paths",
- "description": "The paths of the file that was changed. Both of the properties of this input are optional, but at least one of them is required",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "oldLine",
- "description": "Line on start SHA that was changed.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newLine",
- "description": "Line on HEAD SHA that was changed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DiffPositionType",
- "description": "Type of file the position refers to",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "text",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "description": null,
- "fields": [
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffStats",
- "description": "Changes to a single file",
- "fields": [
- {
- "name": "additions",
- "description": "Number of lines added to this file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletions",
- "description": "Number of lines deleted from this file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "File path, relative to repository root.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffStatsSummary",
- "description": "Aggregated summary of changes",
- "fields": [
- {
- "name": "additions",
- "description": "Number of lines added.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changes",
- "description": "Number of lines changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletions",
- "description": "Number of lines deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileCount",
- "description": "Number of files changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Discussion",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of the discussion's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of this discussion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes in the discussion.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "replyId",
- "description": "ID used to reply to this discussion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "description": "The connection type for Discussion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "description": "Identifier of Discussion.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiscussionToggleResolveInput",
- "description": "Autogenerated input type of DiscussionToggleResolve",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the discussion.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "resolve",
- "description": "Will resolve the discussion when true, and unresolve the discussion when false.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionToggleResolvePayload",
- "description": "Autogenerated return type of DiscussionToggleResolve",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussion",
- "description": "The discussion after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DismissVulnerabilityInput",
- "description": "Autogenerated input type of DismissVulnerability",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be dismissed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "comment",
- "description": "Comment why vulnerability should be dismissed.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DismissVulnerabilityPayload",
- "description": "Autogenerated return type of DismissVulnerability",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after dismissal.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- }
- ]
- },
- {
- "kind": "ENUM",
- "name": "EntryType",
- "description": "Type of a tree entry",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "tree",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blob",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Environment",
- "description": "Describes where code is deployed for a project",
- "fields": [
- {
- "name": "id",
- "description": "ID of the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestOpenedMostSevereAlert",
- "description": "The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricsDashboard",
- "description": "Metrics dashboard schema for the environment.",
- "args": [
- {
- "name": "path",
- "description": "Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Human-readable name of the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "The path to the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the environment, for example: available/stopped.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentConnection",
- "description": "The connection type for Environment.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EnvironmentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "description": "Identifier of Environment.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EnvironmentsCanaryIngressUpdateInput",
- "description": "Autogenerated input type of EnvironmentsCanaryIngressUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the environment to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the Canary Ingress.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentsCanaryIngressUpdatePayload",
- "description": "Autogenerated return type of EnvironmentsCanaryIngressUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "description": "Represents an epic",
- "fields": [
- {
- "name": "author",
- "description": "Author of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "A list of award emojis associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "children",
- "description": "Children (sub-epics) of the epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the epic was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the epic was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantCounts",
- "description": "Number of open and closed descendant epics and issues.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantWeightSum",
- "description": "Total weight of open and closed issues in the epic and its descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFixed",
- "description": "Fixed due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFromMilestones",
- "description": "Inherited due date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates if the due date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group to which the epic belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasChildren",
- "description": "Indicates if the epic has children.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasIssues",
- "description": "Indicates if the epic has direct issues.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasParent",
- "description": "Indicates if the epic has a parent epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "A list of issues associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels assigned to the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent epic of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants for the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the epic. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Indicates if the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relationship.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "The relative position of the epic in the epic tree.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFixed",
- "description": "Fixed start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFromMilestones",
- "description": "Inherited start date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates if the start date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the epic was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicAddIssueInput",
- "description": "Autogenerated input type of EpicAddIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The full path of the project the issue belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "issueIid",
- "description": "The IID of the issue to be added.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicAddIssuePayload",
- "description": "Autogenerated return type of EpicAddIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicIssue",
- "description": "The epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "description": "Represents an epic board",
- "fields": [
- {
- "name": "id",
- "description": "Global ID of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lists",
- "description": "Epic board lists.",
- "args": [
- {
- "name": "id",
- "description": "Find an epic board list by ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicListConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardConnection",
- "description": "The connection type for EpicBoard.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicBoardEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardCreateInput",
- "description": "Autogenerated input type of EpicBoardCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardCreatePayload",
- "description": "Autogenerated return type of EpicBoardCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoard",
- "description": "The created epic board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardListCreateInput",
- "description": "Autogenerated input type of EpicBoardListCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "backlog",
- "description": "Create the backlog list.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelId",
- "description": "Global ID of an existing label.",
- "type": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the issue board to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardListCreatePayload",
- "description": "Autogenerated return type of EpicBoardListCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Epic list in the epic board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "description": "The connection type for Epic.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "description": "Counts of descendent epics",
- "fields": [
- {
- "name": "closedEpics",
- "description": "Number of closed child epics.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedIssues",
- "description": "Number of closed epic issues.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedEpics",
- "description": "Number of opened child epics.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssues",
- "description": "Number of opened epic issues.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "description": "Total weight of open and closed descendant issues",
- "fields": [
- {
- "name": "closedIssues",
- "description": "Total weight of completed (closed) issues in this epic, including epic descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssues",
- "description": "Total weight of opened issues in this epic, including epic descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "description": "Health status of child issues",
- "fields": [
- {
- "name": "issuesAtRisk",
- "description": "Number of issues at risk.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesNeedingAttention",
- "description": "Number of issues that need attention.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesOnTrack",
- "description": "Number of issues on track.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EpicID",
- "description": "Identifier of Epic.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "description": "Relationship between an epic and an issue",
- "fields": [
- {
- "name": "alertManagementAlert",
- "description": "Alert associated to this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "Indicates the issue is blocked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blockedByCount",
- "description": "Count of issues blocking this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the issue was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNoteEmail",
- "description": "User specific email address for the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "Collection of design images associated with this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates discussion is locked on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a project has email notifications disabled: `true` if email notifications are disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Epic to which this issue belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicIssueId",
- "description": "ID of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTimeEstimate",
- "description": "Human-readable time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTotalTimeSpent",
- "description": "Human-readable total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricImages",
- "description": "Metric images associated to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricImage",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moved",
- "description": "Indicates if issue got moved from other project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "movedTo",
- "description": "Updated Issue after it got moved to another project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants in the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the issue. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "Relative position of the issue (used for positioning in epic tree and issue boards).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity level of the incident.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "slaDueAt",
- "description": "Timestamp of when the issue SLA expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statusPagePublishedIncident",
- "description": "Indicates whether an issue is published to the status page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Task completion status of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedBy",
- "description": "User that last updated the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "description": "The connection type for EpicIssue.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicIssueEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Total weight of issues collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssueEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicList",
- "description": "Represents an epic board list",
- "fields": [
- {
- "name": "epics",
- "description": "List epics.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the board list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "listType",
- "description": "Type of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "Position of the list within the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicListConnection",
- "description": "The connection type for EpicList.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicListEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicListEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "description": "Check permissions for the current user on an epic",
- "fields": [
- {
- "name": "adminEpic",
- "description": "Indicates the user can perform `admin_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createEpic",
- "description": "Indicates the user can perform `create_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyEpic",
- "description": "Indicates the user can perform `destroy_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readEpic",
- "description": "Indicates the user can perform `read_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readEpicIid",
- "description": "Indicates the user can perform `read_epic_iid` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateEpic",
- "description": "Indicates the user can perform `update_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicSetSubscriptionInput",
- "description": "Autogenerated input type of EpicSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicSetSubscriptionPayload",
- "description": "Autogenerated return type of EpicSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicSort",
- "description": "Roadmap sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "start_date_desc",
- "description": "Start date at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "start_date_asc",
- "description": "Start date at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "end_date_desc",
- "description": "End date at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "end_date_asc",
- "description": "End date at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicState",
- "description": "State of an epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicStateEvent",
- "description": "State event of an epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REOPEN",
- "description": "Reopen the epic",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSE",
- "description": "Close the epic",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeNodeFieldsInputType",
- "description": "A node of an epic tree.",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the epic_issue or epic that is being moved.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "adjacentReferenceId",
- "description": "The ID of the epic_issue or issue that the actual epic or issue is switched with.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relativePosition",
- "description": "The type of the switch, after or before allowed.",
- "type": {
- "kind": "ENUM",
- "name": "MoveType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newParentId",
- "description": "ID of the new parent epic.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeReorderInput",
- "description": "Autogenerated input type of EpicTreeReorder",
- "fields": null,
- "inputFields": [
- {
- "name": "baseEpicId",
- "description": "The ID of the base epic of the tree.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "moved",
- "description": "Parameters for updating the tree positions.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeNodeFieldsInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicTreeReorderPayload",
- "description": "Autogenerated return type of EpicTreeReorder",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "description": "Identifier of EpicTreeSorting.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicWildcardId",
- "description": "Epic ID wildcard values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No epic is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ANY",
- "description": "Any epic is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Event",
- "description": "Representing an event",
- "fields": [
- {
- "name": "action",
- "description": "Action of the event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EventAction",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "Author of this event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "When this event was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "When this event was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EventAction",
- "description": "Event action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": "Created action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED",
- "description": "Updated action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSED",
- "description": "Closed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REOPENED",
- "description": "Reopened action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUSHED",
- "description": "Pushed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMMENTED",
- "description": "Commented action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED",
- "description": "Merged action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JOINED",
- "description": "Joined action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LEFT",
- "description": "Left action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESTROYED",
- "description": "Destroyed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXPIRED",
- "description": "Expired action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "APPROVED",
- "description": "Approved action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARCHIVED",
- "description": "Archived action",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EventConnection",
- "description": "The connection type for Event.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EventEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Event",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EventEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Event",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "description": null,
- "fields": [
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ExportRequirementsInput",
- "description": "Autogenerated input type of ExportRequirements",
- "fields": null,
- "inputFields": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirements are associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "selectedFields",
- "description": "List of selected requirements fields to be exported.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ExportRequirementsPayload",
- "description": "Autogenerated return type of ExportRequirements",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ExternalIssue",
- "description": "Represents an external issue",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalTracker",
- "description": "Type of external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativeReference",
- "description": "Relative reference of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "URL to the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Float",
- "description": "Represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GeoNode",
- "description": null,
- "fields": [
- {
- "name": "containerRepositoriesMaxCapacity",
- "description": "The maximum concurrency of container repository sync for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this Geo node is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filesMaxCapacity",
- "description": "The maximum concurrency of LFS/attachment backfill for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of this GeoNode.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internalUrl",
- "description": "The URL defined on the primary node that secondary nodes should use to contact it.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestDiffRegistries",
- "description": "Find merge request diff registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "minimumReverificationInterval",
- "description": "The interval (in days) in which the repository verification is valid. Once expired, it will be reverified.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The unique identifier for this Geo node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageFileRegistries",
- "description": "Package file registries of the GeoNode.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageFileRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "primary",
- "description": "Indicates whether this Geo node is the primary.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reposMaxCapacity",
- "description": "The maximum concurrency of repository backfill for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncNamespaces",
- "description": "The namespaces that should be synced, if `selective_sync_type` == `namespaces`.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "NamespaceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncShards",
- "description": "The repository storages whose projects should be synced, if `selective_sync_type` == `shards`.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncType",
- "description": "Indicates if syncing is limited to only specific groups, or shards.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetRepositoryRegistries",
- "description": "Find snippet repository registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "syncObjectStorage",
- "description": "Indicates if this secondary node will replicate blobs in Object Storage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateVersionRegistries",
- "description": "Find terraform state version registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The user-facing URL for this Geo node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "verificationMaxCapacity",
- "description": "The maximum concurrency of repository verification for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "description": "Identifier of Gitlab::ErrorTracking::DetailedError.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "GitlabSubscriptionActivateInput",
- "description": "Autogenerated input type of GitlabSubscriptionActivate",
- "fields": null,
- "inputFields": [
- {
- "name": "activationCode",
- "description": "Activation code received after purchasing a GitLab subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GitlabSubscriptionActivatePayload",
- "description": "Autogenerated return type of GitlabSubscriptionActivate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GrafanaIntegration",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of the issue's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether Grafana integration is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grafanaUrl",
- "description": "URL for the Grafana host for the Grafana integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Internal ID of the Grafana integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the issue's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Group",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for repositories in the namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "additionalPurchasedStorageSize",
- "description": "Additional storage purchased for the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoDevopsEnabled",
- "description": "Indicates whether Auto DevOps is enabled for all projects within this group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "Avatar URL of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "board",
- "description": "A single board of the group.",
- "args": [
- {
- "name": "id",
- "description": "The board's ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boards",
- "description": "Boards of the group.",
- "args": [
- {
- "name": "id",
- "description": "Find a board by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "codeCoverageActivities",
- "description": "Represents the code coverage activity for this group.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch code coverage activity (maximum time window is set to 90 days).",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of a specific compliance framework to return.",
- "type": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositories",
- "description": "Container repositories of the group.",
- "args": [
- {
- "name": "name",
- "description": "Filter the container repositories by their name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort container repositories by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositoriesCount",
- "description": "Number of container repositories in the group.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containsLockedProjects",
- "description": "Includes at least one project where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "customEmoji",
- "description": "Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a group has email notifications disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Find a single epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoard",
- "description": "Find a single epic board.",
- "args": [
- {
- "name": "id",
- "description": "Find an epic board by ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoards",
- "description": "Find epic boards.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epics",
- "description": "Find epics.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicsEnabled",
- "description": "Indicates if Epics are enabled for namespace",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullName",
- "description": "Full name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMembers",
- "description": "A membership of a user within this group.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relations",
- "description": "Filter members by the given member relations.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "GroupMemberRelation",
- "ofType": null
- }
- }
- },
- "defaultValue": "[DIRECT, INHERITED]"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupTimelogsEnabled",
- "description": "Indicates if Group timelogs are enabled for namespace",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isTemporaryStorageIncreaseEnabled",
- "description": "Status of the temporary storage increase.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Issues for projects in this group.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeSubgroups",
- "description": "Include issues belonging to subgroups",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iterations",
- "description": "Find iterations.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter iterations by state.",
- "type": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Fuzzy search by title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Whether to include ancestor iterations. Defaults to true.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "A label available on this group.",
- "args": [
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels available on this group.",
- "args": [
- {
- "name": "searchTerm",
- "description": "A search term to find labels with.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestorGroups",
- "description": "Include labels from ancestor groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include labels from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "onlyGroupLabels",
- "description": "Include only group level labels.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if Large File Storage (LFS) is enabled for namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mentionsDisabled",
- "description": "Indicates if a group is disabled from getting mentioned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequests",
- "description": "Merge requests for projects in this group.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "includeSubgroups",
- "description": "Include merge requests belonging to subgroups",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones of the group.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Array of global milestone IDs, e.g., \"gid://gitlab/Milestone/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter milestones by state.",
- "type": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "searchTitle",
- "description": "A search string for the title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "containingDate",
- "description": "A date that the milestone contains.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendants",
- "description": "Also return milestones in all subgroups and subprojects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The package settings for the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectCreationLevel",
- "description": "The permission level required to create projects in the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this namespace.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include also subgroup projects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "search",
- "description": "Search project with most similar names or paths.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "sort",
- "description": "Sort projects by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "hasVulnerabilities",
- "description": "Returns only the projects which have vulnerabilities.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcessProjectCount",
- "description": "Number of projects in the root namespace where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request access to namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requireTwoFactorAuthentication",
- "description": "Indicates if all users in this group are required to set up two-factor authentication.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootStorageStatistics",
- "description": "Aggregated storage statistics of the namespace. Only available for root namespaces.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shareWithGroupLock",
- "description": "Indicates if sharing a project with another group within this group is prevented.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Group statistics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSizeLimit",
- "description": "Total storage limit of the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subgroupCreationLevel",
- "description": "The permission level required to create subgroups within the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "temporaryStorageIncreaseEndsOn",
- "description": "Date until the temporary storage increase is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timelogs",
- "description": "Time logged in issues by group members.",
- "args": [
- {
- "name": "startDate",
- "description": "List time logs within a date range where the logged date is equal to or after startDate.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List time logs within a date range where the logged date is equal to or before endDate.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startTime",
- "description": "List time-logs within a time range where the logged time is equal to or after startTime.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endTime",
- "description": "List time-logs within a time range where the logged time is equal to or before endTime.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TimelogConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySize",
- "description": "Total repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySizeExcess",
- "description": "Total excess repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "twoFactorGracePeriod",
- "description": "Time before two-factor authentication is enforced.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on the projects in the group and its subgroups.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the projects in the group and its subgroups.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDayAndSeverity",
- "description": "Number of vulnerabilities per severity level, per day, for the projects in the group and its subgroups. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3."
- },
- {
- "name": "vulnerabilityGrades",
- "description": "Represents vulnerable project counts for each grade.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include grades belonging to subgroups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity in the group and its subgroups.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "GroupID",
- "description": "Identifier of Group.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMember",
- "description": "Represents a Group Membership",
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group that a User is a member of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "description": "The connection type for GroupMember.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupMemberEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMemberEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "GroupMemberRelation",
- "description": "Group member relation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DIRECT",
- "description": "Direct members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INHERITED",
- "description": "Inherited members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCENDANTS",
- "description": "Descendants members",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "description": null,
- "fields": [
- {
- "name": "readGroup",
- "description": "Indicates the user can perform `read_group` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupReleaseStats",
- "description": "Contains release-related statistics about a group",
- "fields": [
- {
- "name": "releasesCount",
- "description": "Total number of releases in all descendant projects of the group. Will always return `null` if `group_level_release_statistics` feature flag is disabled",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releasesPercentage",
- "description": "Percentage of the group's descendant projects that have at least one release. Will always return `null` if `group_level_release_statistics` feature flag is disabled",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupStats",
- "description": "Contains statistics about a group",
- "fields": [
- {
- "name": "releaseStats",
- "description": "Statistics related to releases within the group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupReleaseStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "HealthStatus",
- "description": "Health status of an issue or epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "onTrack",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsAttention",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "atRisk",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationCreateInput",
- "description": "Autogenerated input type of HttpIntegrationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the integration in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the integration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "payloadExample",
- "description": "The example of an alert payload.",
- "type": {
- "kind": "SCALAR",
- "name": "JsonString",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadAttributeMappings",
- "description": "The custom mapping of GitLab alert attributes to fields from the payload_example.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationCreatePayload",
- "description": "Autogenerated return type of HttpIntegrationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationDestroyInput",
- "description": "Autogenerated input type of HttpIntegrationDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationDestroyPayload",
- "description": "Autogenerated return type of HttpIntegrationDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationResetTokenInput",
- "description": "Autogenerated input type of HttpIntegrationResetToken",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationResetTokenPayload",
- "description": "Autogenerated return type of HttpIntegrationResetToken",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationUpdateInput",
- "description": "Autogenerated input type of HttpIntegrationUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the integration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadExample",
- "description": "The example of an alert payload.",
- "type": {
- "kind": "SCALAR",
- "name": "JsonString",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadAttributeMappings",
- "description": "The custom mapping of GitLab alert attributes to fields from the payload_example.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationUpdatePayload",
- "description": "Autogenerated return type of HttpIntegrationUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ID",
- "description": "Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"VXNlci0xMA==\"`) or integer (such as `4`) input value will be accepted as an ID.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "description": "An ISO 8601-encoded date",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallParticipantID",
- "description": "Identifier of IncidentManagement::OncallParticipant.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "description": "Describes an incident management on-call rotation",
- "fields": [
- {
- "name": "id",
- "description": "ID of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "length",
- "description": "Length of the on-call schedule, in the units specified by lengthUnit.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lengthUnit",
- "description": "Unit of the on-call rotation length.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "Participants of the on-call rotation.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shifts",
- "description": "Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month.",
- "args": [
- {
- "name": "startTime",
- "description": "Start of timeframe to include shifts for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endTime",
- "description": "End of timeframe to include shifts for. Cannot exceed one month after start.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startsAt",
- "description": "Start date of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationConnection",
- "description": "The connection type for IncidentManagementOncallRotation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "description": "Identifier of IncidentManagement::OncallRotation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "description": "Describes an incident management on-call schedule",
- "fields": [
- {
- "name": "description",
- "description": "Description of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rotations",
- "description": "On-call rotations for the on-call schedule.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timezone",
- "description": "Time zone of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleConnection",
- "description": "The connection type for IncidentManagementOncallSchedule.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "description": "A block of time for which a participant is on-call.",
- "fields": [
- {
- "name": "endsAt",
- "description": "End time of the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participant",
- "description": "Participant assigned to the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startsAt",
- "description": "Start time of the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftConnection",
- "description": "The connection type for IncidentManagementOncallShift.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceSecurityDashboard",
- "description": null,
- "fields": [
- {
- "name": "projects",
- "description": "Projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityGrades",
- "description": "Represents vulnerable project counts for each grade.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity from projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "description": "Represents a recorded measurement (object count) for the Admins",
- "fields": [
- {
- "name": "count",
- "description": "Object count.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "identifier",
- "description": "The type of objects being measured.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "recordedAt",
- "description": "The time the measurement was recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementConnection",
- "description": "The connection type for InstanceStatisticsMeasurement.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Int",
- "description": "Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "description": "Incident severity",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNKNOWN",
- "description": "Unknown severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": "Low severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": "Medium severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": "High severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CRITICAL",
- "description": "Critical severity",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssuableState",
- "description": "State of a GitLab issue or merge request",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "description": null,
- "fields": [
- {
- "name": "alertManagementAlert",
- "description": "Alert associated to this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "Indicates the issue is blocked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blockedByCount",
- "description": "Count of issues blocking this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the issue was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNoteEmail",
- "description": "User specific email address for the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "Collection of design images associated with this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates discussion is locked on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a project has email notifications disabled: `true` if email notifications are disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Epic to which this issue belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTimeEstimate",
- "description": "Human-readable time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTotalTimeSpent",
- "description": "Human-readable total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricImages",
- "description": "Metric images associated to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricImage",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moved",
- "description": "Indicates if issue got moved from other project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "movedTo",
- "description": "Updated Issue after it got moved to another project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants in the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the issue. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "Relative position of the issue (used for positioning in epic tree and issue boards).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity level of the incident.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "slaDueAt",
- "description": "Timestamp of when the issue SLA expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statusPagePublishedIncident",
- "description": "Indicates whether an issue is published to the status page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Task completion status of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedBy",
- "description": "User that last updated the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "description": "The connection type for Issue.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssueEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Total weight of issues collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IssueID",
- "description": "Identifier of Issue.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveInput",
- "description": "Autogenerated input type of IssueMove",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetProjectPath",
- "description": "The project to move the issue to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveListInput",
- "description": "Autogenerated input type of IssueMoveList",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the board that the issue is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "fromListId",
- "description": "ID of the board list that the issue will be moved from.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "toListId",
- "description": "ID of the board list that the issue will be moved to.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "moveBeforeId",
- "description": "ID of issue that should be placed before the current issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "moveAfterId",
- "description": "ID of issue that should be placed after the current issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueMoveListPayload",
- "description": "Autogenerated return type of IssueMoveList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueMovePayload",
- "description": "Autogenerated return type of IssueMove",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "description": "Check permissions for the current user on a issue",
- "fields": [
- {
- "name": "adminIssue",
- "description": "Indicates the user can perform `admin_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDesign",
- "description": "Indicates the user can perform `create_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyDesign",
- "description": "Indicates the user can perform `destroy_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readDesign",
- "description": "Indicates the user can perform `read_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readIssue",
- "description": "Indicates the user can perform `read_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reopenIssue",
- "description": "Indicates the user can perform `reopen_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIssue",
- "description": "Indicates the user can perform `update_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetAssigneesInput",
- "description": "Autogenerated input type of IssueSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the resource. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetAssigneesPayload",
- "description": "Autogenerated return type of IssueSetAssignees",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetConfidentialInput",
- "description": "Autogenerated input type of IssueSetConfidential",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Whether or not to set the issue as a confidential.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetConfidentialPayload",
- "description": "Autogenerated return type of IssueSetConfidential",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetDueDateInput",
- "description": "Autogenerated input type of IssueSetDueDate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "The desired due date for the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetDueDatePayload",
- "description": "Autogenerated return type of IssueSetDueDate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetEpicInput",
- "description": "Autogenerated input type of IssueSetEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Global ID of the epic to be assigned to the issue, epic will be removed if absent or set to null",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetEpicPayload",
- "description": "Autogenerated return type of IssueSetEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetIterationInput",
- "description": "Autogenerated input type of IssueSetIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The iteration to assign to the issue.\n",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetIterationPayload",
- "description": "Autogenerated return type of IssueSetIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetLockedInput",
- "description": "Autogenerated input type of IssueSetLocked",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Whether or not to lock discussion on the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetLockedPayload",
- "description": "Autogenerated return type of IssueSetLocked",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSeverityInput",
- "description": "Autogenerated input type of IssueSetSeverity",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Set the incident severity level.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetSeverityPayload",
- "description": "Autogenerated return type of IssueSetSeverity",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSubscriptionInput",
- "description": "Autogenerated input type of IssueSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetSubscriptionPayload",
- "description": "Autogenerated return type of IssueSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetWeightInput",
- "description": "Autogenerated input type of IssueSetWeight",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The desired weight for the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetWeightPayload",
- "description": "Autogenerated return type of IssueSetWeight",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueSort",
- "description": "Values for sorting issues",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_ASC",
- "description": "Priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_DESC",
- "description": "Priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_ASC",
- "description": "Label priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_DESC",
- "description": "Label priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_ASC",
- "description": "Milestone due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_DESC",
- "description": "Milestone due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DUE_DATE_ASC",
- "description": "Due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DUE_DATE_DESC",
- "description": "Due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELATIVE_POSITION_ASC",
- "description": "Relative position by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_ASC",
- "description": "Severity from less critical to more critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_DESC",
- "description": "Severity from more critical to less critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_ASC",
- "description": "Weight by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_DESC",
- "description": "Weight by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUBLISHED_ASC",
- "description": "Published issues shown last",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUBLISHED_DESC",
- "description": "Published issues shown first",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLA_DUE_AT_ASC",
- "description": "Issues with earliest SLA due time shown first",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLA_DUE_AT_DESC",
- "description": "Issues with latest SLA due time shown first",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueState",
- "description": "State of a GitLab issue",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueStateEvent",
- "description": "Values for issue state events",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REOPEN",
- "description": "Reopens the issue",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSE",
- "description": "Closes the issue",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueStatusCountsType",
- "description": "Represents total number of issues for the represented statuses",
- "fields": [
- {
- "name": "all",
- "description": "Number of issues with status ALL for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": "Number of issues with status CLOSED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": "Number of issues with status OPENED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueType",
- "description": "Issue type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ISSUE",
- "description": "Issue issue type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INCIDENT",
- "description": "Incident issue type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEST_CASE",
- "description": "Test Case issue type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Iteration",
- "description": "Represents an iteration object",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of iteration creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Timestamp of the iteration due date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopedPath",
- "description": "Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopedUrl",
- "description": "Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Timestamp of the iteration start date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of last iteration update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "description": "The connection type for Iteration.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IterationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IterationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IterationID",
- "description": "Identifier of Iteration.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IterationState",
- "description": "State of a GitLab iteration",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "upcoming",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "started",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IterationWildcardId",
- "description": "Iteration ID wildcard values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No iteration is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ANY",
- "description": "An iteration is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CURRENT",
- "description": "Current iteration",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "JSON",
- "description": "Represents untyped JSON",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImport",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of when the Jira import was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "failedToImportCount",
- "description": "Count of issues that failed to import.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "importedIssuesCount",
- "description": "Count of issues that were successfully imported.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraProjectKey",
- "description": "Project key for the imported Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledAt",
- "description": "Timestamp of when the Jira import was scheduled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledBy",
- "description": "User that started the Jira import.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalIssueCount",
- "description": "Total count of issues that were attempted to import.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportConnection",
- "description": "The connection type for JiraImport.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraImportEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportStartInput",
- "description": "Autogenerated input type of JiraImportStart",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to import the Jira project into.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "jiraProjectKey",
- "description": "Project key of the importer Jira project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "jiraProjectName",
- "description": "Project name of the importer Jira project.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "usersMapping",
- "description": "The mapping of Jira to GitLab users.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraUsersMappingInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportStartPayload",
- "description": "Autogenerated return type of JiraImportStart",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImport",
- "description": "The Jira import data after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportUsersInput",
- "description": "Autogenerated input type of JiraImportUsers",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to import the Jira users into.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startAt",
- "description": "The index of the record the import should started at, default 0 (50 records returned).",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportUsersPayload",
- "description": "Autogenerated return type of JiraImportUsers",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraUsers",
- "description": "Users returned from Jira, matched by email and name if possible.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraUser",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProject",
- "description": null,
- "fields": [
- {
- "name": "key",
- "description": "Key of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectId",
- "description": "ID of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProjectConnection",
- "description": "The connection type for JiraProject.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraProjectEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraProject",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProjectEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraProject",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraService",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "List of all Jira projects fetched through Jira REST API.",
- "args": [
- {
- "name": "name",
- "description": "Project name or key.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraUser",
- "description": null,
- "fields": [
- {
- "name": "gitlabId",
- "description": "ID of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabName",
- "description": "Name of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabUsername",
- "description": "Username of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraAccountId",
- "description": "Account ID of the Jira user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraDisplayName",
- "description": "Display name of the Jira user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraEmail",
- "description": "Email of the Jira user, returned only for users with public emails.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraUsersMappingInputType",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "jiraAccountId",
- "description": "Jira account ID of the user.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "gitlabId",
- "description": "Id of the GitLab user.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "JobArtifactFileType",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ARCHIVE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METADATA",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TRACE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JUNIT",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METRICS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METRICS_REFEREE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NETWORK_REFEREE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DOTENV",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COBERTURA",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLUSTER_APPLICATIONS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LSIF",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LICENSE_MANAGEMENT",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LICENSE_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACCESSIBILITY",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CODEQUALITY",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BROWSER_PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOAD_PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TERRAFORM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REQUIREMENTS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "JsonString",
- "description": "JSON object as raw string",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Label",
- "description": null,
- "fields": [
- {
- "name": "color",
- "description": "Background color of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the label (Markdown rendered as HTML for caching).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Label ID.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "textColor",
- "description": "Text color of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Content of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "description": "The connection type for Label.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "LabelEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "LabelCreateInput",
- "description": "Autogenerated input type of LabelCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the label.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "color",
- "description": "The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the CSS color names in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"#6699cc\""
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelCreatePayload",
- "description": "Autogenerated return type of LabelCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "The label after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "LabelID",
- "description": "Identifier of Label.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ListID",
- "description": "Identifier of List.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "description": "List limit metric setting",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "all_metrics",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue_count",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue_weights",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MarkAsSpamSnippetInput",
- "description": "Autogenerated input type of MarkAsSpamSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the snippet to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MarkAsSpamSnippetPayload",
- "description": "Autogenerated return type of MarkAsSpamSnippet",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "description": "Possible identifier types for a measurement",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PROJECTS",
- "description": "Project count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "USERS",
- "description": "User count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ISSUES",
- "description": "Issue count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGE_REQUESTS",
- "description": "Merge request count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GROUPS",
- "description": "Group count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES",
- "description": "Pipeline count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_SUCCEEDED",
- "description": "Pipeline count with success status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_FAILED",
- "description": "Pipeline count with failed status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_CANCELED",
- "description": "Pipeline count with canceled status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_SKIPPED",
- "description": "Pipeline count with skipped status",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "description": null,
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "MemberInterfaceConnection",
- "description": "The connection type for MemberInterface.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MemberInterfaceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MemberInterfaceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "description": null,
- "fields": [
- {
- "name": "allowCollaboration",
- "description": "Indicates if members of the target project can push to the fork.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvalsLeft",
- "description": "Number of approvals left.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvalsRequired",
- "description": "Number of approvals required.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approved",
- "description": "Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvedBy",
- "description": "Users who approved the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User who created this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoMergeEnabled",
- "description": "Indicates if auto merge is enabled for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoMergeStrategy",
- "description": "Selected auto merge strategy.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "availableAutoMergeStrategies",
- "description": "Array of available auto merge strategies.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCount",
- "description": "Number of commits in the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitsWithoutMergeCommits",
- "description": "Merge request commits excluding merge commits.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CommitConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "conflicts",
- "description": "Indicates if the merge request has conflicts.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the merge request was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultMergeCommitMessage",
- "description": "Default merge commit message of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultMergeCommitMessageWithDescription",
- "description": "Default merge commit message of the merge request with description.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultSquashCommitMessage",
- "description": "Default squash commit message of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffHeadSha",
- "description": "Diff head SHA of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "References of the base SHA, the head SHA, and the start SHA for this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffStats",
- "description": "Details about which files were changed in this merge request.",
- "args": [
- {
- "name": "path",
- "description": "A specific file-path.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffStats",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffStatsSummary",
- "description": "Summary of which files were changed in this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffStatsSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates if comments on the merge request are locked to members only.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forceRemoveSourceBranch",
- "description": "Indicates if the project settings will lead to source branch deletion after merge.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasCi",
- "description": "Indicates if the merge request has CI.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasSecurityReports",
- "description": "Indicates if the source branch has any security reports.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headPipeline",
- "description": "The pipeline running on the branch HEAD of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "inProgressMergeCommitSha",
- "description": "Commit SHA of the merge request if merge is in progress.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeCommitSha",
- "description": "SHA of the merge request commit (set once merged).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeError",
- "description": "Error message due to a merge error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeOngoing",
- "description": "Indicates if a merge is currently occurring.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeStatus",
- "description": "Status of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeTrainsCount",
- "description": "Number of merge requests in the merge train.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeUser",
- "description": "User who merged this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeWhenPipelineSucceeds",
- "description": "Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeable",
- "description": "Indicates if the merge request is mergeable.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeableDiscussionsState",
- "description": "Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedAt",
- "description": "Timestamp of when the merge request was merged, null if not merged.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "The milestone of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines for the merge request. Note: for performance reasons, no more than the most recent 500 pipelines will be returned.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Alias for target_project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectId",
- "description": "ID of the merge request project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rebaseCommitSha",
- "description": "Rebase commit SHA of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rebaseInProgress",
- "description": "Indicates if there is a rebase currently in progress for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the merge request. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reviewers",
- "description": "Users from whom a review has been requested.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityAutoFix",
- "description": "Indicates if the merge request is created by @GitLab-Security-Bot.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shouldBeRebased",
- "description": "Indicates if the merge request will be rebased.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shouldRemoveSourceBranch",
- "description": "Indicates if the source branch of the merge request will be deleted after merge.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranch",
- "description": "Source branch of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranchExists",
- "description": "Indicates if the source branch of the merge request exists.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranchProtected",
- "description": "Indicates if the source branch is protected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceProject",
- "description": "Source project of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceProjectId",
- "description": "ID of the merge request source project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squash",
- "description": "Indicates if squash on merge is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squashOnMerge",
- "description": "Indicates if squash on merge is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates if the currently logged in user is subscribed to this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetBranchExists",
- "description": "Indicates if the target branch of the merge request exists.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetProject",
- "description": "Target project of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetProjectId",
- "description": "ID of the merge request target project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Completion status of tasks",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the merge request was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "User notes count of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "workInProgress",
- "description": "Indicates if the merge request is a work in progress (WIP).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "description": "The connection type for MergeRequest.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeToMerge",
- "description": "Total sum of time to merge, in seconds, for the collection of merge requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestCreateInput",
- "description": "Autogenerated input type of MergeRequestCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the merge request is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranch",
- "description": "Source branch of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the merge request.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestCreatePayload",
- "description": "Autogenerated return type of MergeRequestCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "description": "Represents the Geo sync and verification state of a Merge Request diff",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the MergeRequestDiffRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestDiffId",
- "description": "ID of the Merge Request diff.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the MergeRequestDiffRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryConnection",
- "description": "The connection type for MergeRequestDiffRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MergeRequestID",
- "description": "Identifier of MergeRequest.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestNewState",
- "description": "New state to apply to a merge request.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OPEN",
- "description": "Open the merge request if it is closed.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSED",
- "description": "Close the merge request if it is open.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestPermissions",
- "description": "Check permissions for the current user on a merge request",
- "fields": [
- {
- "name": "adminMergeRequest",
- "description": "Indicates the user can perform `admin_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "canMerge",
- "description": "Indicates the user can perform `can_merge` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "cherryPickOnCurrentMergeRequest",
- "description": "Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushToSourceBranch",
- "description": "Indicates the user can perform `push_to_source_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readMergeRequest",
- "description": "Indicates the user can perform `read_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeSourceBranch",
- "description": "Indicates the user can perform `remove_source_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revertOnCurrentMergeRequest",
- "description": "Indicates the user can perform `revert_on_current_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateMergeRequest",
- "description": "Indicates the user can perform `update_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestReviewerRereviewInput",
- "description": "Autogenerated input type of MergeRequestReviewerRereview",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "userId",
- "description": "The user ID for the user that has been requested for a new review.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestReviewerRereviewPayload",
- "description": "Autogenerated return type of MergeRequestReviewerRereview",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetAssigneesInput",
- "description": "Autogenerated input type of MergeRequestSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the resource. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetAssigneesPayload",
- "description": "Autogenerated return type of MergeRequestSetAssignees",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLabelsInput",
- "description": "Autogenerated input type of MergeRequestSetLabels",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The Label IDs to set. Replaces existing labels by default.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "Changes the operation mode. Defaults to REPLACE.\n",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetLabelsPayload",
- "description": "Autogenerated return type of MergeRequestSetLabels",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLockedInput",
- "description": "Autogenerated input type of MergeRequestSetLocked",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Whether or not to lock the merge request.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetLockedPayload",
- "description": "Autogenerated return type of MergeRequestSetLocked",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetMilestoneInput",
- "description": "Autogenerated input type of MergeRequestSetMilestone",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The milestone to assign to the merge request.\n",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetMilestonePayload",
- "description": "Autogenerated return type of MergeRequestSetMilestone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetSubscriptionInput",
- "description": "Autogenerated input type of MergeRequestSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetSubscriptionPayload",
- "description": "Autogenerated return type of MergeRequestSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetWipInput",
- "description": "Autogenerated input type of MergeRequestSetWip",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "wip",
- "description": "Whether or not to set the merge request as a WIP.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetWipPayload",
- "description": "Autogenerated return type of MergeRequestSetWip",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "description": "Values for sorting merge requests",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_ASC",
- "description": "Priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_DESC",
- "description": "Priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_ASC",
- "description": "Label priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_DESC",
- "description": "Label priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_ASC",
- "description": "Milestone due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_DESC",
- "description": "Milestone due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED_AT_ASC",
- "description": "Merge time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED_AT_DESC",
- "description": "Merge time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "description": "State of a GitLab merge request",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "merged",
- "description": "Merge Request has been merged",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestUpdateInput",
- "description": "Autogenerated input type of MergeRequestUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The action to perform to change the state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestNewState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestUpdatePayload",
- "description": "Autogenerated return type of MergeRequestUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Metadata",
- "description": null,
- "fields": [
- {
- "name": "revision",
- "description": "Revision.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricImage",
- "description": "Represents a metric image upload",
- "fields": [
- {
- "name": "fileName",
- "description": "File name of the metric image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filePath",
- "description": "File path of the metric image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the metric upload.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the metric upload.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the metric source.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboard",
- "description": null,
- "fields": [
- {
- "name": "annotations",
- "description": "Annotations added to the dashboard.",
- "args": [
- {
- "name": "from",
- "description": "Timestamp marking date and time from which annotations need to be fetched.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "to",
- "description": "Timestamp marking date and time to which annotations need to be fetched.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path to a file with the dashboard definition.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "schemaValidationWarnings",
- "description": "Dashboard schema validation warnings.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "description": null,
- "fields": [
- {
- "name": "description",
- "description": "Description of the annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endingAt",
- "description": "Timestamp marking end of annotated time span.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "panelId",
- "description": "ID of a dashboard panel to which the annotation should be scoped.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startingAt",
- "description": "Timestamp marking start of annotated time span.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationConnection",
- "description": "The connection type for MetricsDashboardAnnotation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MetricsDashboardAnnotationID",
- "description": "Identifier of Metrics::Dashboard::Annotation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Milestone",
- "description": "Represents a milestone",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of milestone creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Timestamp of the milestone due date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMilestone",
- "description": "Indicates if milestone is at group level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMilestone",
- "description": "Indicates if milestone is at project level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Timestamp of the milestone start date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Milestone statistics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subgroupMilestone",
- "description": "Indicates if milestone is at subgroup level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of last milestone update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "description": "The connection type for Milestone.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MilestoneEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "description": "Identifier of Milestone.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "description": "Current state of milestone",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "active",
- "description": "Milestone is currently active",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": "Milestone is closed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneStats",
- "description": "Contains statistics about a milestone",
- "fields": [
- {
- "name": "closedIssuesCount",
- "description": "Number of closed issues associated with the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalIssuesCount",
- "description": "Total number of issues associated with the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MoveType",
- "description": "The position to which the adjacent object should be moved",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "before",
- "description": "The adjacent object will be moved before the object that is being moved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "after",
- "description": "The adjacent object will be moved after the object that is being moved",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Mutation",
- "description": null,
- "fields": [
- {
- "name": "addAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AddAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AddAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiAdd. Deprecated in 13.2."
- },
- {
- "name": "addProjectToSecurityDashboard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AddProjectToSecurityDashboardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AddProjectToSecurityDashboardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminSidekiqQueuesDeleteJobs",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertTodoCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertTodoCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertTodoCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiFuzzingCiConfigurationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ApiFuzzingCiConfigurationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfigurationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiAdd",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiAddInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiAddPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiRemove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiRemoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiRemovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiToggle",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiToggleInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiTogglePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boardListCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "BoardListCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boardListUpdateLimitMetrics",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "BoardListUpdateLimitMetricsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListUpdateLimitMetricsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciCdSettingsUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CiCdSettingsUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiCdSettingsUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentTokenCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentTokenDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CommitCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CommitCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configureSast",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ConfigureSastInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ConfigureSastPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createAlertIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateAlertIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateAlertIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createAnnotation",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateAnnotationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateAnnotationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createBranch",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateBranchInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateBranchPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createClusterAgent",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateClusterAgentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateClusterAgentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createCustomEmoji",
- "description": " Available only when feature flag `custom_emoji` is enabled.",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateCustomEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateCustomEmojiPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDevopsAdoptionSegment",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateDevopsAdoptionSegmentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateDevopsAdoptionSegmentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDiffNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createImageDiffNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createRequirement",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateRequirementInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateRequirementPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createTestCase",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateTestCaseInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateTestCasePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastOnDemandScanCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastOnDemandScanCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastOnDemandScanCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileRun",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileRunInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileRunPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteTokenCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteTokenCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteTokenCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidationRevoke",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationRevokeInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationRevokePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deleteAnnotation",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DeleteAnnotationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteAnnotationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deleteDevopsAdoptionSegment",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DeleteDevopsAdoptionSegmentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteDevopsAdoptionSegmentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementMove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementMoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementMovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementUpload",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementUploadInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementUploadPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyBoardList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyBoardListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyContainerRepository",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyContainerRepositoryTags",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryTagsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryTagsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroySnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroySnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroySnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionToggleResolve",
- "description": "Toggles the resolved state of a discussion",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiscussionToggleResolveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiscussionToggleResolvePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissVulnerability",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DismissVulnerabilityInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DismissVulnerabilityPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use vulnerabilityDismiss. Deprecated in 13.5."
- },
- {
- "name": "environmentsCanaryIngressUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EnvironmentsCanaryIngressUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EnvironmentsCanaryIngressUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicAddIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicAddIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicAddIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoardCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoardListCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardListCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardListCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicTreeReorder",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeReorderInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicTreeReorderPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "exportRequirements",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ExportRequirementsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ExportRequirementsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabSubscriptionActivate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "GitlabSubscriptionActivateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GitlabSubscriptionActivatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationResetToken",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationResetTokenInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationResetTokenPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueMove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueMovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueMoveList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueMoveListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetConfidential",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetConfidentialInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetConfidentialPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetDueDate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetDueDateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetDueDatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetLocked",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetLockedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetLockedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetSeverity",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSeverityInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetSeverityPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetWeight",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetWeightInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetWeightPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportStart",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportStartInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportStartPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportUsers",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportUsersInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportUsersPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labelCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "LabelCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "markAsSpamSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MarkAsSpamSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MarkAsSpamSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestReviewerRereview",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestReviewerRereviewInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestReviewerRereviewPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetLabels",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLabelsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetLabelsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetLocked",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLockedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetLockedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetMilestone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetMilestoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetMilestonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetWip",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetWipInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetWipPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestUpdate",
- "description": "Update attributes of a merge request",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespaceIncreaseStorageTemporarily",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallRotationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotationDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallRotationDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineCancel",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineCancelInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineCancelPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineRetry",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineRetryInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineRetryPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationResetToken",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationResetTokenInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationResetTokenPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "promoteToEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PromoteToEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PromoteToEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RemoveAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RemoveAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiRemove. Deprecated in 13.2."
- },
- {
- "name": "removeProjectFromSecurityDashboard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RemoveProjectFromSecurityDashboardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RemoveProjectFromSecurityDashboardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositionImageDiffNote",
- "description": "Repositions a DiffNote on an image (a `Note` where the `position.positionType` is `\"image\"`)",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RepositionImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RepositionImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revertVulnerabilityToDetected",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RevertVulnerabilityToDetectedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RevertVulnerabilityToDetectedPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use vulnerabilityRevertToDetected. Deprecated in 13.5."
- },
- {
- "name": "runDastScan",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RunDASTScanInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunDASTScanPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use DastOnDemandScanCreate. Deprecated in 13.4."
- },
- {
- "name": "terraformStateDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateLock",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateLockInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateLockPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateUnlock",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateUnlockInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateUnlockPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoMarkDone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoMarkDoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoMarkDonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoRestore",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoRestorePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoRestoreMany",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreManyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoRestoreManyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todosMarkAllDone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodosMarkAllDoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodosMarkAllDonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggleAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ToggleAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ToggleAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiToggle. Deprecated in 13.2."
- },
- {
- "name": "updateAlertStatus",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateAlertStatusInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateAlertStatusPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoardEpicUserPreferences",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardEpicUserPreferencesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardEpicUserPreferencesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoardList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateContainerExpirationPolicy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateContainerExpirationPolicyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateContainerExpirationPolicyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateImageDiffNote",
- "description": "Updates a DiffNote on an image (a `Note` where the `position.positionType` is `\"image\"`). If the body of the Note contains only quick actions, the Note will be destroyed during the update, and no Note will be returned",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateNamespacePackageSettings",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNamespacePackageSettingsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateNamespacePackageSettingsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateNote",
- "description": "Updates a Note. If the body of the Note contains only quick actions, the Note will be destroyed during the update, and no Note will be returned",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateRequirement",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateRequirementInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateRequirementPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityConfirm",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityConfirmInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConfirmPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityDismiss",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityDismissInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityDismissPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityExternalIssueLinkCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityExternalIssueLinkDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityResolve",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityResolveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityResolvePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityRevertToDetected",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityRevertToDetectedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityRevertToDetectedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "description": "Different toggles for changing mutator behavior",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REPLACE",
- "description": "Performs a replace operation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "APPEND",
- "description": "Performs an append operation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REMOVE",
- "description": "Performs a removal operation",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Namespace",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for repositories in the namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "additionalPurchasedStorageSize",
- "description": "Additional storage purchased for the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of a specific compliance framework to return.",
- "type": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containsLockedProjects",
- "description": "Includes at least one project where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullName",
- "description": "Full name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isTemporaryStorageIncreaseEnabled",
- "description": "Status of the temporary storage increase.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if Large File Storage (LFS) is enabled for namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The package settings for the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this namespace.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include also subgroup projects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "search",
- "description": "Search project with most similar names or paths.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "sort",
- "description": "Sort projects by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "hasVulnerabilities",
- "description": "Returns only the projects which have vulnerabilities.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcessProjectCount",
- "description": "Number of projects in the root namespace where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request access to namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootStorageStatistics",
- "description": "Aggregated storage statistics of the namespace. Only available for root namespaces.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSizeLimit",
- "description": "Total storage limit of the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "temporaryStorageIncreaseEndsOn",
- "description": "Date until the temporary storage increase is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySize",
- "description": "Total repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySizeExcess",
- "description": "Total excess repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceConnection",
- "description": "The connection type for Namespace.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NamespaceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "description": "Identifier of Namespace.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyInput",
- "description": "Autogenerated input type of NamespaceIncreaseStorageTemporarily",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the namespace to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyPayload",
- "description": "Autogenerated return type of NamespaceIncreaseStorageTemporarily",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "The namespace after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "description": "Values for sorting projects",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SIMILARITY",
- "description": "Most similar to the search query",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STORAGE",
- "description": "Sort by storage size",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "NegatedBoardIssueInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "labelName",
- "description": "Filter by label name.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter by milestone title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Filter by assignee username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter by author username.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releaseTag",
- "description": "Filter by release tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "myReactionEmoji",
- "description": "Filter by reaction emoji.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Filter by epic ID. Incompatible with epicWildcardId.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationTitle",
- "description": "Filter by iteration title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "Filter by weight.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Note",
- "description": null,
- "fields": [
- {
- "name": "author",
- "description": "User who wrote this note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "bodyHtml",
- "description": "The GitLab Flavored Markdown rendering of `note`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if this note is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the note creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussion",
- "description": "The discussion this note is a part of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffPosition",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project associated with the note.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "system",
- "description": "Indicates whether this note was created by the system or by a user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "systemNoteIconName",
- "description": "Name of the icon corresponding to a system note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the note's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL to view this Note in the Web UI.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NotePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "description": "The connection type for Note.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NoteEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "NoteID",
- "description": "Identifier of Note.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NotePermissions",
- "description": null,
- "fields": [
- {
- "name": "adminNote",
- "description": "Indicates the user can perform `admin_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readNote",
- "description": "Indicates the user can perform `read_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositionNote",
- "description": "Indicates the user can perform `reposition_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolveNote",
- "description": "Indicates the user can perform `resolve_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "description": null,
- "fields": [
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- }
- ]
- },
- {
- "kind": "SCALAR",
- "name": "NoteableID",
- "description": "Identifier of Noteable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "description": "The rotation participant and color palette",
- "fields": [
- {
- "name": "colorPalette",
- "description": "The color palette to assign to the on-call user. For example \"blue\".",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "colorWeight",
- "description": "The color weight to assign to for the on-call user, for example \"500\". Max 4 chars. For easy identification of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the on-call participant.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallParticipantID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user who is participating.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeConnection",
- "description": "The connection type for OncallParticipantType.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationCreateInput",
- "description": "Autogenerated input type of OncallRotationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scheduleIid",
- "description": "The IID of the on-call schedule to create the on-call rotation in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startsAt",
- "description": "The start date and time of the on-call rotation, in the timezone of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDateInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "rotationLength",
- "description": "The rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationLengthInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "participants",
- "description": "The usernames of users participating in the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallUserInputType",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallRotationCreatePayload",
- "description": "Autogenerated return type of OncallRotationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotation",
- "description": "The on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDateInputType",
- "description": "Date input type for on-call rotation",
- "fields": null,
- "inputFields": [
- {
- "name": "date",
- "description": "The date component of the date in YYYY-MM-DD format.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "time",
- "description": "The time component of the date in 24hr HH:MM format.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDestroyInput",
- "description": "Autogenerated input type of OncallRotationDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to remove the on-call schedule from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scheduleIid",
- "description": "The IID of the on-call schedule to the on-call rotation belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The ID of the on-call rotation to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallRotationDestroyPayload",
- "description": "Autogenerated return type of OncallRotationDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotation",
- "description": "The on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationLengthInputType",
- "description": "The rotation length of the on-call rotation",
- "fields": null,
- "inputFields": [
- {
- "name": "length",
- "description": "The rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "unit",
- "description": "The unit of the rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "description": "Rotation length unit of an on-call rotation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "HOURS",
- "description": "Hours",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAYS",
- "description": "Days",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEEKS",
- "description": "Weeks",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleCreateInput",
- "description": "Autogenerated input type of OncallScheduleCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timezone",
- "description": "The timezone of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleCreatePayload",
- "description": "Autogenerated return type of OncallScheduleCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleDestroyInput",
- "description": "Autogenerated input type of OncallScheduleDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to remove the on-call schedule from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The on-call schedule internal ID to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleDestroyPayload",
- "description": "Autogenerated return type of OncallScheduleDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleUpdateInput",
- "description": "Autogenerated input type of OncallScheduleUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to update the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The on-call schedule internal ID to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timezone",
- "description": "The timezone of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleUpdatePayload",
- "description": "Autogenerated return type of OncallScheduleUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallUserInputType",
- "description": "The rotation user and color palette",
- "fields": null,
- "inputFields": [
- {
- "name": "username",
- "description": "The username of the user to participate in the on-call rotation, such as `user_one`.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "colorPalette",
- "description": "A value of DataVisualizationColorEnum. The color from the palette to assign to the on-call user.",
- "type": {
- "kind": "ENUM",
- "name": "DataVisualizationColorEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "colorWeight",
- "description": "A value of DataVisualizationWeightEnum. The color weight to assign to for the on-call user.",
- "type": {
- "kind": "ENUM",
- "name": "DataVisualizationWeightEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Package",
- "description": "Represents a package in the Package Registry",
- "fields": [
- {
- "name": "createdAt",
- "description": "Date of creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Package metadata.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "PackageMetadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageType",
- "description": "Package type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines that built the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project where the package is stored.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Package tags.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date of most recent update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "The other versions of the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageComposerJsonType",
- "description": "Represents a composer JSON file",
- "fields": [
- {
- "name": "license",
- "description": "The license set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "The type set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageConnection",
- "description": "The connection type for Package.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "description": "Represents the Geo sync and verification state of a package file",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the PackageFileRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageFileId",
- "description": "ID of the PackageFile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the PackageFileRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistryConnection",
- "description": "The connection type for PackageFileRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageFileRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "PackageMetadata",
- "description": "Represents metadata associated with a Package",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "ComposerMetadata",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "description": "Namespace-level Package Registry settings",
- "fields": [
- {
- "name": "mavenDuplicateExceptionRegex",
- "description": "When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mavenDuplicatesAllowed",
- "description": "Indicates whether duplicate Maven packages are allowed for this namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTag",
- "description": "Represents a package tag",
- "fields": [
- {
- "name": "createdAt",
- "description": "The created date.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "The updated date.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "description": "The connection type for PackageTag.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageTagEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageTag",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTagEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTag",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "MAVEN",
- "description": "Packages from the Maven package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NPM",
- "description": "Packages from the npm package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONAN",
- "description": "Packages from the Conan package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NUGET",
- "description": "Packages from the Nuget package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PYPI",
- "description": "Packages from the PyPI package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMPOSER",
- "description": "Packages from the Composer package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GENERIC",
- "description": "Packages from the Generic package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GOLANG",
- "description": "Packages from the Golang package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEBIAN",
- "description": "Packages from the Debian package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUBYGEMS",
- "description": "Packages from the Rubygems package manager",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "description": "Represents a version of a package in the Package Registry",
- "fields": [
- {
- "name": "createdAt",
- "description": "Date of creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Package metadata.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "PackageMetadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageType",
- "description": "Package type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines that built the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project where the package is stored.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Package tags.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date of most recent update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsConnection",
- "description": "The connection type for PackageWithoutVersions.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "description": "Identifier of Packages::Package.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PageInfo",
- "description": "Information about pagination in a connection.",
- "fields": [
- {
- "name": "endCursor",
- "description": "When paginating forwards, the cursor to continue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasNextPage",
- "description": "When paginating forwards, are there more items?",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasPreviousPage",
- "description": "When paginating backwards, are there more items?",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startCursor",
- "description": "When paginating backwards, the cursor to continue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Pipeline",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the pipeline is active.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "beforeSha",
- "description": "Base SHA of the source branch.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "cancelable",
- "description": "Specifies if a pipeline can be canceled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "committedAt",
- "description": "Timestamp of the pipeline's commit.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configSource",
- "description": "Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "PipelineConfigSourceEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverage",
- "description": "Coverage percentage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the pipeline's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailedStatus",
- "description": "Detailed status of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downstream",
- "description": "Pipelines this pipeline will trigger.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "duration",
- "description": "Duration of the pipeline in seconds.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "finishedAt",
- "description": "Timestamp of the pipeline's completion.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobs",
- "description": "Jobs belonging to the pipeline.",
- "args": [
- {
- "name": "securityReportTypes",
- "description": "Filter jobs by the type of security report they produce.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityReportTypeEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Relative path to the pipeline's page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project the pipeline belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryable",
- "description": "Specifies if a pipeline can be retried.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityReportSummary",
- "description": "Vulnerability and scanned resource counts for each security scanner of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA of the pipeline's commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceJob",
- "description": "Job where pipeline was triggered from.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stages",
- "description": "Stages of the pipeline.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiStageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startedAt",
- "description": "Timestamp when the pipeline was started.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED)",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the pipeline's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upstream",
- "description": "Pipeline that triggered the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "Pipeline user.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PipelinePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "warnings",
- "description": "Indicates if a pipeline has warnings.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineAnalytics",
- "description": null,
- "fields": [
- {
- "name": "monthPipelinesLabels",
- "description": "Labels for the monthly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monthPipelinesSuccessful",
- "description": "Total monthly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monthPipelinesTotals",
- "description": "Total monthly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineTimesLabels",
- "description": "Pipeline times labels.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineTimesValues",
- "description": "Pipeline times.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesLabels",
- "description": "Labels for the weekly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesSuccessful",
- "description": "Total weekly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesTotals",
- "description": "Total weekly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesLabels",
- "description": "Labels for the yearly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesSuccessful",
- "description": "Total yearly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesTotals",
- "description": "Total yearly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineCancelInput",
- "description": "Autogenerated input type of PipelineCancel",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineCancelPayload",
- "description": "Autogenerated return type of PipelineCancel",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PipelineConfigSourceEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNKNOWN_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REPOSITORY_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "AUTO_DEVOPS_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEBIDE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REMOTE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXTERNAL_PROJECT_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BRIDGE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PARAMETER_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMPLIANCE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "description": "The connection type for Pipeline.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PipelineEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineDestroyInput",
- "description": "Autogenerated input type of PipelineDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineDestroyPayload",
- "description": "Autogenerated return type of PipelineDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelinePermissions",
- "description": null,
- "fields": [
- {
- "name": "adminPipeline",
- "description": "Indicates the user can perform `admin_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyPipeline",
- "description": "Indicates the user can perform `destroy_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatePipeline",
- "description": "Indicates the user can perform `update_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineRetryInput",
- "description": "Autogenerated input type of PipelineRetry",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineRetryPayload",
- "description": "Autogenerated return type of PipelineRetry",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "The pipeline after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WAITING_FOR_RESOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PREPARING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PENDING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUNNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SUCCESS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CANCELED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SKIPPED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MANUAL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEDULED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Project",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for the repository in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlert",
- "description": "A single Alert Management alert of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the alert. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "statuses",
- "description": "Alerts with the specified statues. For example, [TRIGGERED].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort alerts by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "domain",
- "description": "Filter query for given domain.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "ofType": null
- }
- },
- "defaultValue": "operations"
- },
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlertStatusCounts",
- "description": "Counts of alerts by status for the project.",
- "args": [
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertStatusCountsType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlerts",
- "description": "Alert Management alerts of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the alert. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "statuses",
- "description": "Alerts with the specified statues. For example, [TRIGGERED].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort alerts by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "domain",
- "description": "Filter query for given domain.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "ofType": null
- }
- },
- "defaultValue": "operations"
- },
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementIntegrations",
- "description": "Integrations which can receive alerts for the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementPayloadFields",
- "description": "Extract alert fields from payload for custom mapping.",
- "args": [
- {
- "name": "payloadExample",
- "description": "Sample payload for extracting alert fields for custom mappings.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementPayloadAlertField",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "allowMergeOnSkippedPipeline",
- "description": "If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge requests of the project can also be merged with skipped jobs.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiFuzzingCiConfiguration",
- "description": "API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfiguration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "archived",
- "description": "Indicates the archived status of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autocloseReferencedIssues",
- "description": "Indicates if issues referenced by merge requests and commits within the default branch are closed automatically.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "URL to avatar image file of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "board",
- "description": "A single board of the project.",
- "args": [
- {
- "name": "id",
- "description": "The board's ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boards",
- "description": "Boards of the project.",
- "args": [
- {
- "name": "id",
- "description": "Find a board by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciCdSettings",
- "description": "CI/CD settings for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectCiCdSetting",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgent",
- "description": "Find a single cluster agent by name.",
- "args": [
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgents",
- "description": "Cluster agents associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "codeCoverageSummary",
- "description": "Code coverage summary associated with the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerExpirationPolicy",
- "description": "The container expiration policy of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRegistryEnabled",
- "description": "Indicates if the project stores Docker container images in a container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositories",
- "description": "Container repositories of the project.",
- "args": [
- {
- "name": "name",
- "description": "Filter the container repositories by their name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort container repositories by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositoriesCount",
- "description": "Number of container repositories in the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the project creation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfiles",
- "description": "DAST Profiles associated with the project. Always returns no nodes if `dast_saved_scans` is disabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfiles",
- "description": "The DAST scanner profiles associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfile",
- "description": "DAST Site Profile associated with the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfiles",
- "description": "DAST Site Profiles associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidations",
- "description": "DAST Site Validations associated with the project. Always returns no nodes if `security_on_demand_scans_site_validation` is disabled.",
- "args": [
- {
- "name": "normalizedTargetUrls",
- "description": "Normalized URL of the target to be scanned.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Short description of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "A single environment of the project.",
- "args": [
- {
- "name": "name",
- "description": "Name of the environment.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for environment name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "states",
- "description": "States of environments that should be included in result.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environments",
- "description": "Environments of the project.",
- "args": [
- {
- "name": "name",
- "description": "Name of the environment.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for environment name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "states",
- "description": "States of environments that should be included in result.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EnvironmentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forksCount",
- "description": "Number of times the project has been forked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grafanaIntegration",
- "description": "Grafana integration details for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GrafanaIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpUrlToRepo",
- "description": "URL to connect to the project via HTTPS.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "importStatus",
- "description": "Status of import background job of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "incidentManagementOncallSchedules",
- "description": "Incident Management On-call schedules of the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "A single issue of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueStatusCounts",
- "description": "Counts of issues by status for the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueStatusCountsType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Issues of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesEnabled",
- "description": "Indicates if Issues are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iterations",
- "description": "Find iterations.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter iterations by state.",
- "type": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Fuzzy search by title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Whether to include ancestor iterations. Defaults to true.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportStatus",
- "description": "Status of Jira import background job of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImports",
- "description": "Jira imports into the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobsEnabled",
- "description": "Indicates if CI/CD pipeline jobs are enabled for the current user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "A label available on this project.",
- "args": [
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels available on this project.",
- "args": [
- {
- "name": "searchTerm",
- "description": "A search term to find labels with.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestorGroups",
- "description": "Include labels from ancestor groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastActivityAt",
- "description": "Timestamp of the project last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if the project has Large File Storage (LFS) enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "A single merge request of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the merge request, for example `1`.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequests",
- "description": "Merge requests of the project.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestsEnabled",
- "description": "Indicates if Merge Requests are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestsFfOnlyEnabled",
- "description": "Indicates if no merge commits should be created and all merges should instead be fast-forwarded, which means that merging is only allowed if the branch could be fast-forwarded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones of the project.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Array of global milestone IDs, e.g., \"gid://gitlab/Milestone/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter milestones by state.",
- "type": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "searchTitle",
- "description": "A search string for the title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "containingDate",
- "description": "A date that the milestone contains.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Also return milestones in the project's parent group and its ancestors.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the project (without namespace).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameWithNamespace",
- "description": "Full name of the project with its namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Namespace of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onlyAllowMergeIfAllDiscussionsAreResolved",
- "description": "Indicates if merge requests of the project can only be merged when all the discussions are resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onlyAllowMergeIfPipelineSucceeds",
- "description": "Indicates if merge requests of the project can only be merged with successful jobs.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openIssuesCount",
- "description": "Number of open issues for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packages",
- "description": "Packages of the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "Build pipeline of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the Pipeline, e.g., \"1\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineAnalytics",
- "description": "Pipeline analytics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineAnalytics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Build pipelines of the project.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "printingMergeRequestLinkEnabled",
- "description": "Indicates if a link to create or view a merge request should display after a push to Git repositories of the project from the command line.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMembers",
- "description": "Members of the project.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relations",
- "description": "Filter members by the given member relations.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ProjectMemberRelation",
- "ofType": null
- }
- }
- },
- "defaultValue": "[DIRECT, INHERITED]"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MemberInterfaceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "publicJobs",
- "description": "Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "A single release of the project.",
- "args": [
- {
- "name": "tagName",
- "description": "The name of the tag associated to the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releases",
- "description": "Releases of the project.",
- "args": [
- {
- "name": "sort",
- "description": "Sort releases by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ReleaseSort",
- "ofType": null
- },
- "defaultValue": "RELEASED_AT_DESC"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeSourceBranchAfterMerge",
- "description": "Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repository",
- "description": "Git repository of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Repository",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcess",
- "description": "Size of repository that exceeds the limit in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request member access to the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Find a single requirement.",
- "args": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the requirement, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of requirements, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "The state of latest requirement test report.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirementStatesCount",
- "description": "Number of requirements for the project by their state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RequirementStatesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirements",
- "description": "Find requirements.",
- "args": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the requirement, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of requirements, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "The state of latest requirement test report.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RequirementConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sastCiConfiguration",
- "description": "SAST CI configuration for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfiguration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityDashboardPath",
- "description": "Path to project's security dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityScanners",
- "description": "Information about security analyzers used in the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityScanners",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryDetailedError",
- "description": "Detailed version of a Sentry error on the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryErrors",
- "description": "Paginated collection of Sentry errors on the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serviceDeskAddress",
- "description": "E-mail address of the service desk.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serviceDeskEnabled",
- "description": "Indicates if the project has service desk enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "services",
- "description": "Project services.",
- "args": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "type": {
- "kind": "ENUM",
- "name": "ServiceType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ServiceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sharedRunnersEnabled",
- "description": "Indicates if shared runners are enabled for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Snippets of the project.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsEnabled",
- "description": "Indicates if Snippets are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squashReadOnly",
- "description": "Indicates if `squashReadOnly` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sshUrlToRepo",
- "description": "URL to connect to the project via SSH.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "starCount",
- "description": "Number of times the project has been starred.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statistics",
- "description": "Statistics of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "suggestionCommitMessage",
- "description": "The commit message used to apply merge request suggestions.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagList",
- "description": "List of project topics (not Git tags).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformState",
- "description": "Find a single Terraform state by name.",
- "args": [
- {
- "name": "name",
- "description": "Name of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStates",
- "description": "Terraform states associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on the project.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the project.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the project vulnerabilities.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity in the project.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiEnabled",
- "description": "Indicates if Wikis are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectCiCdSetting",
- "description": null,
- "fields": [
- {
- "name": "keepLatestArtifact",
- "description": "Whether to keep the latest builds artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergePipelinesEnabled",
- "description": "Whether merge pipelines are enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeTrainsEnabled",
- "description": "Whether merge trains are enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project the CI/CD settings belong to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "description": "The connection type for Project.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ProjectID",
- "description": "Identifier of Project.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "description": "Represents a Project Membership",
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project that User is a member of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMemberConnection",
- "description": "The connection type for ProjectMember.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectMemberEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMemberEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ProjectMemberRelation",
- "description": "Project member relation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DIRECT",
- "description": "Direct members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INHERITED",
- "description": "Inherited members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCENDANTS",
- "description": "Descendants members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INVITED_GROUPS",
- "description": "Invited Groups members",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "description": null,
- "fields": [
- {
- "name": "adminOperations",
- "description": "Indicates the user can perform `admin_operations` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminProject",
- "description": "Indicates the user can perform `admin_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminRemoteMirror",
- "description": "Indicates the user can perform `admin_remote_mirror` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminWiki",
- "description": "Indicates the user can perform `admin_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "archiveProject",
- "description": "Indicates the user can perform `archive_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changeNamespace",
- "description": "Indicates the user can perform `change_namespace` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changeVisibilityLevel",
- "description": "Indicates the user can perform `change_visibility_level` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDeployment",
- "description": "Indicates the user can perform `create_deployment` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDesign",
- "description": "Indicates the user can perform `create_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIssue",
- "description": "Indicates the user can perform `create_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createLabel",
- "description": "Indicates the user can perform `create_label` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createMergeRequestFrom",
- "description": "Indicates the user can perform `create_merge_request_from` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createMergeRequestIn",
- "description": "Indicates the user can perform `create_merge_request_in` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPages",
- "description": "Indicates the user can perform `create_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPipeline",
- "description": "Indicates the user can perform `create_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPipelineSchedule",
- "description": "Indicates the user can perform `create_pipeline_schedule` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createSnippet",
- "description": "Indicates the user can perform `create_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createWiki",
- "description": "Indicates the user can perform `create_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyDesign",
- "description": "Indicates the user can perform `destroy_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyPages",
- "description": "Indicates the user can perform `destroy_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyWiki",
- "description": "Indicates the user can perform `destroy_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadCode",
- "description": "Indicates the user can perform `download_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadWikiCode",
- "description": "Indicates the user can perform `download_wiki_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forkProject",
- "description": "Indicates the user can perform `fork_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushCode",
- "description": "Indicates the user can perform `push_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushToDeleteProtectedBranch",
- "description": "Indicates the user can perform `push_to_delete_protected_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readCommitStatus",
- "description": "Indicates the user can perform `read_commit_status` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readCycleAnalytics",
- "description": "Indicates the user can perform `read_cycle_analytics` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readDesign",
- "description": "Indicates the user can perform `read_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readMergeRequest",
- "description": "Indicates the user can perform `read_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readPagesContent",
- "description": "Indicates the user can perform `read_pages_content` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readProject",
- "description": "Indicates the user can perform `read_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readProjectMember",
- "description": "Indicates the user can perform `read_project_member` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readWiki",
- "description": "Indicates the user can perform `read_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeForkProject",
- "description": "Indicates the user can perform `remove_fork_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removePages",
- "description": "Indicates the user can perform `remove_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeProject",
- "description": "Indicates the user can perform `remove_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renameProject",
- "description": "Indicates the user can perform `rename_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccess",
- "description": "Indicates the user can perform `request_access` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatePages",
- "description": "Indicates the user can perform `update_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateWiki",
- "description": "Indicates the user can perform `update_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadFile",
- "description": "Indicates the user can perform `upload_file` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectStatistics",
- "description": null,
- "fields": [
- {
- "name": "buildArtifactsSize",
- "description": "Build artifacts size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCount",
- "description": "Commit count of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsObjectsSize",
- "description": "Large File Storage (LFS) object size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packagesSize",
- "description": "Packages size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySize",
- "description": "Repository size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsSize",
- "description": "Snippets size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSize",
- "description": "Storage size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadsSize",
- "description": "Uploads size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiSize",
- "description": "Wiki size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusAlert",
- "description": "The alert condition for Prometheus",
- "fields": [
- {
- "name": "humanizedText",
- "description": "The human-readable text of the alert condition.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the alert condition.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationCreateInput",
- "description": "Autogenerated input type of PrometheusIntegrationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the integration in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "apiUrl",
- "description": "Endpoint at which prometheus can be queried.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationCreatePayload",
- "description": "Autogenerated return type of PrometheusIntegrationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationResetTokenInput",
- "description": "Autogenerated input type of PrometheusIntegrationResetToken",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationResetTokenPayload",
- "description": "Autogenerated return type of PrometheusIntegrationResetToken",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationUpdateInput",
- "description": "Autogenerated input type of PrometheusIntegrationUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "apiUrl",
- "description": "Endpoint at which prometheus can be queried.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationUpdatePayload",
- "description": "Autogenerated return type of PrometheusIntegrationUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "description": "Identifier of PrometheusService.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PromoteToEpicInput",
- "description": "Autogenerated input type of PromoteToEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the promoted epic will belong to.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PromoteToEpicPayload",
- "description": "Autogenerated return type of PromoteToEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after issue promotion.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Query",
- "description": null,
- "fields": [
- {
- "name": "ciApplicationSettings",
- "description": "CI related settings that apply to the entire instance.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiApplicationSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciConfig",
- "description": "Get linted and processed contents of a CI config. Should not be requested more than once per request.",
- "args": [
- {
- "name": "projectPath",
- "description": "The project of the CI config.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Contents of '.gitlab-ci.yml'.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dryRun",
- "description": "Run pipeline creation simulation, or only do static check.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfig",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepository",
- "description": "Find a container repository.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryDetails",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUser",
- "description": "Get information about current user.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagement",
- "description": "Fields related to design management.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignManagement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "devopsAdoptionSegments",
- "description": "Get configured DevOps adoption segments on the instance.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "echo",
- "description": "Text to echo back.",
- "args": [
- {
- "name": "text",
- "description": "Text to echo back.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "geoNode",
- "description": "Find a Geo node.",
- "args": [
- {
- "name": "name",
- "description": "The name of the Geo node. Defaults to the current Geo node name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GeoNode",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Find a group.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "instanceSecurityDashboard",
- "description": "Fields related to Instance Security Dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceSecurityDashboard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "instanceStatisticsMeasurements",
- "description": "Get statistics on the instance.",
- "args": [
- {
- "name": "identifier",
- "description": "The type of measurement/statistics to retrieve.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "recordedAfter",
- "description": "Measurement recorded after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "recordedBefore",
- "description": "Measurement recorded before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "Find an issue.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the Issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IssueID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Find an iteration.",
- "args": [
- {
- "name": "id",
- "description": "Find an iteration by its ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Metadata about GitLab.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Metadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Find a milestone.",
- "args": [
- {
- "name": "id",
- "description": "Find a milestone by its ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Find a namespace.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "package",
- "description": "Find a package.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the package.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Find a project.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Find projects visible to the current user.",
- "args": [
- {
- "name": "membership",
- "description": "Limit projects that the current user is a member of.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for project name, path, or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Filter projects by IDs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "searchNamespaces",
- "description": "Include namespace in project search.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort order of results.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerPlatforms",
- "description": "Supported runner platforms.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerPlatformConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerSetup",
- "description": "Get runner setup instructions.",
- "args": [
- {
- "name": "platform",
- "description": "Platform to generate the instructions for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "architecture",
- "description": "Architecture to generate the instructions for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "Project to register the runner for.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "Group to register the runner for.",
- "type": {
- "kind": "SCALAR",
- "name": "GroupID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerSetup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Find Snippets visible to the current user.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of snippet.",
- "type": {
- "kind": "ENUM",
- "name": "TypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "explore",
- "description": "Explore personal snippets.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "Find a user.",
- "args": [
- {
- "name": "id",
- "description": "ID of the User.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "username",
- "description": "Username of the User.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "users",
- "description": "Find users.",
- "args": [
- {
- "name": "ids",
- "description": "List of user Global IDs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "usernames",
- "description": "List of usernames.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort users by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "search",
- "description": "Query to search users by name, username, or primary email.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "admins",
- "description": "Return only admin users.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on projects on the current user's instance security dashboard.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the projects on the current user's instance security dashboard.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDayAndSeverity",
- "description": "Number of vulnerabilities per severity level, per day, for the projects on the current user's instance security dashboard. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3."
- },
- {
- "name": "vulnerability",
- "description": "Find a vulnerability.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the Vulnerability.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "RegistryState",
- "description": "State of a Geo registry",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PENDING",
- "description": "Registry waiting to be synced",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED",
- "description": "Registry currently syncing",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SYNCED",
- "description": "Registry that is synced",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": "Registry that failed to sync",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Release",
- "description": "Represents a release",
- "fields": [
- {
- "name": "assets",
- "description": "Assets of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssets",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": "The commit associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the release was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description (also known as \"release notes\") of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "evidences",
- "description": "Evidence for the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "links",
- "description": "Links of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseLinks",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones associated to the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releasedAt",
- "description": "Timestamp of when the release was released.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagPath",
- "description": "Relative web path to the tag associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upcomingRelease",
- "description": "Indicates the release is an upcoming release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "description": "Represents an asset link associated with a release",
- "fields": [
- {
- "name": "directAssetUrl",
- "description": "Direct asset URL of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "external",
- "description": "Indicates the link points to an external resource.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkConnection",
- "description": "The connection type for ReleaseAssetLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetLinkInput",
- "description": "Fields that are available when modifying a release asset link",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "Name of the asset link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "url",
- "description": "URL of the asset link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "directAssetPath",
- "description": "Relative path for a direct asset link.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "linkType",
- "description": "The type of the asset link.",
- "type": {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "ofType": null
- },
- "defaultValue": "OTHER"
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "description": "Type of the link: `other`, `runbook`, `image`, `package`",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OTHER",
- "description": "Other link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUNBOOK",
- "description": "Runbook link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PACKAGE",
- "description": "Package link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IMAGE",
- "description": "Image link type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssets",
- "description": "A container for all assets associated with a release",
- "fields": [
- {
- "name": "count",
- "description": "Number of assets of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "links",
- "description": "Asset links of the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sources",
- "description": "Sources of the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseSourceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetsInput",
- "description": "Fields that are available when modifying release assets",
- "fields": null,
- "inputFields": [
- {
- "name": "links",
- "description": "A list of asset links to associate to the release.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetLinkInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseConnection",
- "description": "The connection type for Release.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseCreateInput",
- "description": "Autogenerated input type of ReleaseCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag to associate with the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "The commit SHA or branch name to use if creating a new tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description (also known as \"release notes\") of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releasedAt",
- "description": "The date when the release will be/was ready. Defaults to the current time.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestones",
- "description": "The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assets",
- "description": "Assets associated to the release.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetsInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseCreatePayload",
- "description": "Autogenerated return type of ReleaseCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The release after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseDeleteInput",
- "description": "Autogenerated input type of ReleaseDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseDeletePayload",
- "description": "Autogenerated return type of ReleaseDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The deleted release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "description": "Evidence for a release",
- "fields": [
- {
- "name": "collectedAt",
- "description": "Timestamp when the evidence was collected.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filepath",
- "description": "URL from where the evidence can be downloaded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the evidence.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA1 ID of the evidence hash.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceConnection",
- "description": "The connection type for ReleaseEvidence.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseLinks",
- "description": null,
- "fields": [
- {
- "name": "closedIssuesUrl",
- "description": "HTTP URL of the issues page, filtered by this release and `state=closed`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page , filtered by this release and `state=closed`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "editUrl",
- "description": "HTTP URL of the release's edit page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page , filtered by this release and `state=merged`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssuesUrl",
- "description": "HTTP URL of the issues page, filtered by this release and `state=open`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page, filtered by this release and `state=open`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selfUrl",
- "description": "HTTP URL of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ReleaseSort",
- "description": "Values for sorting releases",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELEASED_AT_DESC",
- "description": "Released at by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELEASED_AT_ASC",
- "description": "Released at by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "description": "Represents the source code attached to a release in a particular format",
- "fields": [
- {
- "name": "format",
- "description": "Format of the source.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Download URL of the source.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSourceConnection",
- "description": "The connection type for ReleaseSource.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseSourceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSourceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseUpdateInput",
- "description": "Autogenerated input type of ReleaseUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description (release notes) of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releasedAt",
- "description": "The release date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestones",
- "description": "The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseUpdatePayload",
- "description": "Autogenerated return type of ReleaseUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The release after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RemoveAwardEmojiInput",
- "description": "Autogenerated input type of RemoveAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RemoveAwardEmojiPayload",
- "description": "Autogenerated return type of RemoveAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RemoveProjectFromSecurityDashboardInput",
- "description": "Autogenerated input type of RemoveProjectFromSecurityDashboard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the project to remove from the Instance Security Dashboard.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RemoveProjectFromSecurityDashboardPayload",
- "description": "Autogenerated return type of RemoveProjectFromSecurityDashboard",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RepositionImageDiffNoteInput",
- "description": "Autogenerated input type of RepositionImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the DiffNote to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiffNoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RepositionImageDiffNotePayload",
- "description": "Autogenerated return type of RepositionImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Repository",
- "description": null,
- "fields": [
- {
- "name": "empty",
- "description": "Indicates repository has no visible content.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "exists",
- "description": "Indicates a corresponding Git repository exists on disk.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootRef",
- "description": "Default branch of the repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tree",
- "description": "Tree of the repository.",
- "args": [
- {
- "name": "path",
- "description": "The path to get the tree for. Default value is the root of the repository.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "ref",
- "description": "The commit ref to get the tree for. Default value is HEAD.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"head\""
- },
- {
- "name": "recursive",
- "description": "Used to get a recursive tree. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Tree",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Requirement",
- "description": "Represents a requirement",
- "fields": [
- {
- "name": "author",
- "description": "Author of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the requirement was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastTestReportManuallyCreated",
- "description": "Indicates if latest test report was created by user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastTestReportState",
- "description": "Latest requirement test report state.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project to which the requirement belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "testReports",
- "description": "Test reports of the requirement.",
- "args": [
- {
- "name": "sort",
- "description": "List test reports by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TestReportConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the requirement was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RequirementPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementConnection",
- "description": "The connection type for Requirement.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RequirementEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementPermissions",
- "description": "Check permissions for the current user on a requirement",
- "fields": [
- {
- "name": "adminRequirement",
- "description": "Indicates the user can perform `admin_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createRequirement",
- "description": "Indicates the user can perform `create_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyRequirement",
- "description": "Indicates the user can perform `destroy_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readRequirement",
- "description": "Indicates the user can perform `read_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateRequirement",
- "description": "Indicates the user can perform `update_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "RequirementState",
- "description": "State of a requirement",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OPENED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARCHIVED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementStatesCount",
- "description": "Counts of requirements by their state",
- "fields": [
- {
- "name": "archived",
- "description": "Number of archived requirements.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": "Number of opened requirements.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "description": null,
- "fields": [
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RevertVulnerabilityToDetectedInput",
- "description": "Autogenerated input type of RevertVulnerabilityToDetected",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be reverted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RevertVulnerabilityToDetectedPayload",
- "description": "Autogenerated return type of RevertVulnerabilityToDetected",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after revert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "description": null,
- "fields": [
- {
- "name": "buildArtifactsSize",
- "description": "The CI artifacts size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsObjectsSize",
- "description": "The LFS objects size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packagesSize",
- "description": "The packages size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineArtifactsSize",
- "description": "The CI pipeline artifacts size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySize",
- "description": "The Git repository size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsSize",
- "description": "The snippets size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSize",
- "description": "The total storage in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadsSize",
- "description": "The uploads size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiSize",
- "description": "The wiki size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RunDASTScanInput",
- "description": "Autogenerated input type of RunDASTScan",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the DAST scan belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "branch",
- "description": "The branch to be associated with the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "The type of scan to be run.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunDASTScanPayload",
- "description": "Autogenerated return type of RunDASTScan",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "description": null,
- "fields": [
- {
- "name": "downloadLocation",
- "description": "Download location for the runner for the platform architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the runner platform architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitectureConnection",
- "description": "The connection type for RunnerArchitecture.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerArchitectureEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitectureEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "description": null,
- "fields": [
- {
- "name": "architectures",
- "description": "Runner architectures supported for the platform.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerArchitectureConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanReadableName",
- "description": "Human readable name of the runner platform.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name slug of the runner platform.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatformConnection",
- "description": "The connection type for RunnerPlatform.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerPlatformEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatformEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerSetup",
- "description": null,
- "fields": [
- {
- "name": "installInstructions",
- "description": "Instructions for installing the runner on the specified architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "registerInstructions",
- "description": "Instructions for registering the runner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfiguration",
- "description": "Represents a CI configuration of SAST",
- "fields": [
- {
- "name": "analyzers",
- "description": "List of analyzers entities attached to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "global",
- "description": "List of global entities related to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "List of pipeline entities related to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "description": "Represents an analyzer entity in SAST CI configuration",
- "fields": [
- {
- "name": "description",
- "description": "Analyzer description that is displayed on the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether an analyzer is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Analyzer label used in the config UI.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the analyzer.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "variables",
- "description": "List of supported variables.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityConnection",
- "description": "The connection type for SastCiConfigurationAnalyzersEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityInput",
- "description": "Represents the analyzers entity in SAST CI configuration",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "Name of analyzer.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "enabled",
- "description": "State of the analyzer.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "variables",
- "description": "List of variables for the analyzer.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "description": "Represents an entity in SAST CI configuration",
- "fields": [
- {
- "name": "defaultValue",
- "description": "Default value that is used if value is empty.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Entity description that is displayed on the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "field",
- "description": "CI keyword of entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label for entity used in the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "options",
- "description": "Different possible values of the field.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the UI component.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "SastUiComponentSize",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the field value.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Current value of the entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "description": "The connection type for SastCiConfigurationEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "description": "Represents an entity in SAST CI configuration",
- "fields": null,
- "inputFields": [
- {
- "name": "field",
- "description": "CI keyword of entity.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "defaultValue",
- "description": "Default value that is used if value is empty.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "value",
- "description": "Current value of the entity.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationInput",
- "description": "Represents a CI configuration of SAST",
- "fields": null,
- "inputFields": [
- {
- "name": "global",
- "description": "List of global entities related to SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "pipeline",
- "description": "List of pipeline entities related to SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "analyzers",
- "description": "List of analyzers and related variables for the SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "description": "Represents an entity for options in SAST CI configuration",
- "fields": [
- {
- "name": "label",
- "description": "Label of option entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of option entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityConnection",
- "description": "The connection type for SastCiConfigurationOptionsEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SastUiComponentSize",
- "description": "Size of UI component in SAST configuration page",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SMALL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LARGE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "description": "Represents a resource scanned by a security scan",
- "fields": [
- {
- "name": "requestMethod",
- "description": "The HTTP request method used to access the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The URL scanned by the scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResourceConnection",
- "description": "The connection type for ScannedResource.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ScannedResourceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResourceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityReportSummary",
- "description": "Represents summary of a security report",
- "fields": [
- {
- "name": "apiFuzzing",
- "description": "Aggregated counts for the `api_fuzzing` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerScanning",
- "description": "Aggregated counts for the `container_scanning` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageFuzzing",
- "description": "Aggregated counts for the `coverage_fuzzing` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dast",
- "description": "Aggregated counts for the `dast` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dependencyScanning",
- "description": "Aggregated counts for the `dependency_scanning` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sast",
- "description": "Aggregated counts for the `sast` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "secretDetection",
- "description": "Aggregated counts for the `secret_detection` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "description": "Represents a section of a summary of a security report",
- "fields": [
- {
- "name": "scannedResources",
- "description": "A list of the first 20 scanned resources.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ScannedResourceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scannedResourcesCount",
- "description": "Total number of scanned resources.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scannedResourcesCsvPath",
- "description": "Path to download all the scanned resources in CSV format.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCount",
- "description": "Total number of vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SecurityReportTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": "SAST scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": "DAST scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": "DEPENDENCY SCANNING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": "CONTAINER SCANNING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": "SECRET DETECTION scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": "COVERAGE FUZZING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": "API FUZZING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "description": "The type of the security scanner",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityScanners",
- "description": "Represents a list of security scanners",
- "fields": [
- {
- "name": "available",
- "description": "List of analyzers which are available for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "List of analyzers which are enabled for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineRun",
- "description": "List of analyzers which ran successfully in the latest pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "description": "A Sentry error",
- "fields": [
- {
- "name": "count",
- "description": "Count of occurrences.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "culprit",
- "description": "Culprit of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalBaseUrl",
- "description": "External Base URL of the Sentry Instance.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseLastCommit",
- "description": "Commit the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseShortVersion",
- "description": "Release short version the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseVersion",
- "description": "Release version the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstSeen",
- "description": "Timestamp when the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "frequency",
- "description": "Last 24hr stats of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCommit",
- "description": "GitLab commit SHA attributed to the Error based on the release version.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCommitPath",
- "description": "Path to the GitLab page for the GitLab commit attributed to the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabIssuePath",
- "description": "URL of GitLab Issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseLastCommit",
- "description": "Commit the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseShortVersion",
- "description": "Release short version the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseVersion",
- "description": "Release version the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSeen",
- "description": "Timestamp when the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Sentry metadata message of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryId",
- "description": "ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectId",
- "description": "ID of the project (Sentry project).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectName",
- "description": "Name of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectSlug",
- "description": "Slug of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Tags associated with the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorTags",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userCount",
- "description": "Count of users affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryError",
- "description": "A Sentry error. A simplified version of SentryDetailedError",
- "fields": [
- {
- "name": "count",
- "description": "Count of occurrences.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "culprit",
- "description": "Culprit of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstSeen",
- "description": "Timestamp when the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "frequency",
- "description": "Last 24hr stats of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSeen",
- "description": "Timestamp when the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Sentry metadata message of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryId",
- "description": "ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectId",
- "description": "ID of the project (Sentry project).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectName",
- "description": "Name of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectSlug",
- "description": "Slug of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userCount",
- "description": "Count of users affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorCollection",
- "description": "An object containing a collection of Sentry errors, and a detailed error",
- "fields": [
- {
- "name": "detailedError",
- "description": "Detailed version of a Sentry error on the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errorStackTrace",
- "description": "Stack Trace of Sentry Error.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTrace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Collection of Sentry Errors.",
- "args": [
- {
- "name": "searchTerm",
- "description": "Search query for the Sentry error details.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Attribute to sort on. Options are frequency, first_seen, last_seen. last_seen is default.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL for Sentry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorConnection",
- "description": "The connection type for SentryError.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryError",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "description": null,
- "fields": [
- {
- "name": "count",
- "description": "Count of errors received since the previously recorded time.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "time",
- "description": "Time the error frequency stats were recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTrace",
- "description": "An object containing a stack trace entry for a Sentry error",
- "fields": [
- {
- "name": "dateReceived",
- "description": "Time the stack trace was received by Sentry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueId",
- "description": "ID of the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stackTraceEntries",
- "description": "Stack trace entries for the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceEntry",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceContext",
- "description": "An object context for a Sentry error stack trace",
- "fields": [
- {
- "name": "code",
- "description": "Code number of the context.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "line",
- "description": "Line number of the context.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceEntry",
- "description": "An object containing a stack trace entry for a Sentry error",
- "fields": [
- {
- "name": "col",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "function",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "line",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "traceContext",
- "description": "Context of the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceContext",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "description": "State of a Sentry error",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "RESOLVED",
- "description": "Error has been resolved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED_IN_NEXT_RELEASE",
- "description": "Error has been ignored until next release",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNRESOLVED",
- "description": "Error is unresolved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IGNORED",
- "description": "Error has been ignored",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorTags",
- "description": "State of a Sentry error",
- "fields": [
- {
- "name": "level",
- "description": "Severity level of the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "logger",
- "description": "Logger of the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Service",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BaseService",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraService",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "ServiceConnection",
- "description": "The connection type for Service.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ServiceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ServiceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ServiceType",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ASANA_SERVICE",
- "description": "AsanaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ASSEMBLA_SERVICE",
- "description": "AssemblaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BAMBOO_SERVICE",
- "description": "BambooService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUGZILLA_SERVICE",
- "description": "BugzillaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUILDKITE_SERVICE",
- "description": "BuildkiteService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CAMPFIRE_SERVICE",
- "description": "CampfireService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONFLUENCE_SERVICE",
- "description": "ConfluenceService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CUSTOM_ISSUE_TRACKER_SERVICE",
- "description": "CustomIssueTrackerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DATADOG_SERVICE",
- "description": "DatadogService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DISCORD_SERVICE",
- "description": "DiscordService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DRONE_CI_SERVICE",
- "description": "DroneCiService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EMAILS_ON_PUSH_SERVICE",
- "description": "EmailsOnPushService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EWM_SERVICE",
- "description": "EwmService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXTERNAL_WIKI_SERVICE",
- "description": "ExternalWikiService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FLOWDOCK_SERVICE",
- "description": "FlowdockService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GITHUB_SERVICE",
- "description": "GithubService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HANGOUTS_CHAT_SERVICE",
- "description": "HangoutsChatService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIPCHAT_SERVICE",
- "description": "HipchatService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IRKER_SERVICE",
- "description": "IrkerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JENKINS_SERVICE",
- "description": "JenkinsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JIRA_SERVICE",
- "description": "JiraService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MATTERMOST_SERVICE",
- "description": "MattermostService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MATTERMOST_SLASH_COMMANDS_SERVICE",
- "description": "MattermostSlashCommandsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MICROSOFT_TEAMS_SERVICE",
- "description": "MicrosoftTeamsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PACKAGIST_SERVICE",
- "description": "PackagistService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_EMAIL_SERVICE",
- "description": "PipelinesEmailService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIVOTALTRACKER_SERVICE",
- "description": "PivotaltrackerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PROMETHEUS_SERVICE",
- "description": "PrometheusService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUSHOVER_SERVICE",
- "description": "PushoverService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REDMINE_SERVICE",
- "description": "RedmineService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLACK_SERVICE",
- "description": "SlackService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLACK_SLASH_COMMANDS_SERVICE",
- "description": "SlackSlashCommandsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEAMCITY_SERVICE",
- "description": "TeamcityService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNIFY_CIRCUIT_SERVICE",
- "description": "UnifyCircuitService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEBEX_TEAMS_SERVICE",
- "description": "WebexTeamsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "YOUTRACK_SERVICE",
- "description": "YoutrackService type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Snippet",
- "description": "Represents a snippet entry",
- "fields": [
- {
- "name": "author",
- "description": "The owner of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blob",
- "description": "Snippet blob. Deprecated in 13.3: Use `blobs`.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `blobs`. Deprecated in 13.3."
- },
- {
- "name": "blobs",
- "description": "Snippet blobs.",
- "args": [
- {
- "name": "paths",
- "description": "Paths of the blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp this snippet was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File Name of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpUrlToRepo",
- "description": "HTTP URL to the snippet repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the snippet is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rawUrl",
- "description": "Raw URL of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sshUrlToRepo",
- "description": "SSH URL to the snippet repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp this snippet was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibilityLevel",
- "description": "Visibility Level of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "description": "Represents the snippet blob",
- "fields": [
- {
- "name": "binary",
- "description": "Shows whether the blob is binary.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalStorage",
- "description": "Blob external storage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mode",
- "description": "Blob mode.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Blob name.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Blob path.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "plainData",
- "description": "Blob plain highlighted data.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rawPath",
- "description": "Blob raw content endpoint path.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renderedAsText",
- "description": "Shows whether the blob is rendered as text.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "richData",
- "description": "Blob highlighted data.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "richViewer",
- "description": "Blob content rich viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "simpleViewer",
- "description": "Blob content simple viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Blob size.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SnippetBlobActionEnum",
- "description": "Type of a snippet blob input action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "create",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "update",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "delete",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "move",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "description": "Represents an action to perform over a snippet file",
- "fields": null,
- "inputFields": [
- {
- "name": "action",
- "description": "Type of input action.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SnippetBlobActionEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "previousPath",
- "description": "Previous path of the snippet file.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filePath",
- "description": "Path of the snippet file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Snippet file content.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobConnection",
- "description": "The connection type for SnippetBlob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "description": "Represents how the blob content should be displayed",
- "fields": [
- {
- "name": "collapsed",
- "description": "Shows whether the blob should be displayed collapsed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileType",
- "description": "Content file type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "loadAsync",
- "description": "Shows whether the blob content is loaded asynchronously.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "loadingPartialName",
- "description": "Loading partial name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renderError",
- "description": "Error rendering the blob content.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tooLarge",
- "description": "Shows whether the blob too large to be displayed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of blob viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "BlobViewersType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "description": "The connection type for Snippet.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "SnippetID",
- "description": "Identifier of Snippet.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetPermissions",
- "description": null,
- "fields": [
- {
- "name": "adminSnippet",
- "description": "Indicates the user can perform `admin_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readSnippet",
- "description": "Indicates the user can perform `read_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportSnippet",
- "description": "Indicates the user can perform `report_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateSnippet",
- "description": "Indicates the user can perform `update_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "description": "Represents the Geo sync and verification state of a snippet repository",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the SnippetRepositoryRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the SnippetRepositoryRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetRepositoryId",
- "description": "ID of the Snippet Repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryConnection",
- "description": "The connection type for SnippetRepositoryRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "Sort",
- "description": "Common sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "StatusAction",
- "description": null,
- "fields": [
- {
- "name": "buttonTitle",
- "description": "Title for the button, for example: Retry this job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "icon",
- "description": "Icon used in the action button.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "method",
- "description": "Method for the action, for example: :post.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path for the action.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title for the action, for example: Retry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "String",
- "description": "Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Submodule",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "treeUrl",
- "description": "Tree URL for the sub-module.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL for the sub-module.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SubmoduleConnection",
- "description": "The connection type for Submodule.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SubmoduleEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SubmoduleEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "description": "Completion status of tasks",
- "fields": [
- {
- "name": "completedCount",
- "description": "Number of completed tasks.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "count",
- "description": "Number of total tasks.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformState",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the Terraform state was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestVersion",
- "description": "The latest version of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lockedAt",
- "description": "Timestamp the Terraform state was locked.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lockedByUser",
- "description": "The user currently holding a lock on the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the Terraform state was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateConnection",
- "description": "The connection type for TerraformState.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateDeleteInput",
- "description": "Autogenerated input type of TerraformStateDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateDeletePayload",
- "description": "Autogenerated return type of TerraformStateDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "description": "Identifier of Terraform::State.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateLockInput",
- "description": "Autogenerated input type of TerraformStateLock",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateLockPayload",
- "description": "Autogenerated return type of TerraformStateLock",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateUnlockInput",
- "description": "Autogenerated input type of TerraformStateUnlock",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateUnlockPayload",
- "description": "Autogenerated return type of TerraformStateUnlock",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersion",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the version was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "The user that created this version.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadPath",
- "description": "URL for downloading the version's JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the Terraform state version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "job",
- "description": "The job that created this version.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serial",
- "description": "Serial number of the version.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the version was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "description": "Represents the Geo sync and verification state of a terraform state version",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the TerraformStateVersionRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the TerraformStateVersionRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateVersionId",
- "description": "ID of the terraform state version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryConnection",
- "description": "The connection type for TerraformStateVersionRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReport",
- "description": "Represents a requirement test report",
- "fields": [
- {
- "name": "author",
- "description": "Author of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the test report was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReportConnection",
- "description": "The connection type for TestReport.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TestReportEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TestReport",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReportEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TestReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TestReportState",
- "description": "State of a test report",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PASSED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Time",
- "description": "Time represented in ISO 8601",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeReportStats",
- "description": "Represents the time report stats for timeboxes",
- "fields": [
- {
- "name": "complete",
- "description": "Completed issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "incomplete",
- "description": "Incomplete issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "total",
- "description": "Total issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "description": "Represents measured stats metrics for timeboxes",
- "fields": [
- {
- "name": "count",
- "description": "The count metric.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "The weight metric.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "description": "Represents a historically accurate report about the timebox",
- "fields": [
- {
- "name": "burnupTimeSeries",
- "description": "Daily scope and completed totals for burnup charts.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BurnupChartDailyTotals",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Represents the time report stats for the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeReportStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "description": null,
- "fields": [
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "description": "A time-frame defined as a closed inclusive range of two dates",
- "fields": null,
- "inputFields": [
- {
- "name": "start",
- "description": "The start of the range.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "end",
- "description": "The end of the range.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Timelog",
- "description": null,
- "fields": [
- {
- "name": "issue",
- "description": "The issue that logged time was added to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note where the quick action to add the logged time was executed.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spentAt",
- "description": "Timestamp of when the time tracked was spent at.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeSpent",
- "description": "The time spent displayed in seconds.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user that logged the time.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimelogConnection",
- "description": "The connection type for Timelog.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TimelogEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Timelog",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimelogEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Timelog",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Todo",
- "description": "Representing a to-do entry",
- "fields": [
- {
- "name": "action",
- "description": "Action of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "The author of this to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "body",
- "description": "Body of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp this to-do item was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group this to-do item is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project this to-do item is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetType",
- "description": "Target type of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "assigned",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mentioned",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "build_failed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "marked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approval_required",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unmergeable",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "directly_addressed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "description": "The connection type for Todo.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoCreateInput",
- "description": "Autogenerated input type of TodoCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "targetId",
- "description": "The global ID of the to-do item's parent. Issues, merge requests, designs and epics are supported.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoCreatePayload",
- "description": "Autogenerated return type of TodoCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TodoID",
- "description": "Identifier of Todo.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoMarkDoneInput",
- "description": "Autogenerated input type of TodoMarkDone",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the to-do item to mark as done.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoMarkDonePayload",
- "description": "Autogenerated return type of TodoMarkDone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The requested to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreInput",
- "description": "Autogenerated input type of TodoRestore",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the to-do item to restore.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreManyInput",
- "description": "Autogenerated input type of TodoRestoreMany",
- "fields": null,
- "inputFields": [
- {
- "name": "ids",
- "description": "The global IDs of the to-do items to restore (a maximum of 50 is supported at once).",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoRestoreManyPayload",
- "description": "Autogenerated return type of TodoRestoreMany",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "Updated to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedIds",
- "description": "The IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use to-do items. Deprecated in 13.2."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoRestorePayload",
- "description": "Autogenerated return type of TodoRestore",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The requested to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "pending",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "done",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "COMMIT",
- "description": "A Commit",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ISSUE",
- "description": "An Issue",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGEREQUEST",
- "description": "A MergeRequest",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESIGN",
- "description": "A Design",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ALERT",
- "description": "An Alert",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EPIC",
- "description": "An Epic",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TodoableID",
- "description": "Identifier of Todoable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodosMarkAllDoneInput",
- "description": "Autogenerated input type of TodosMarkAllDone",
- "fields": null,
- "inputFields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodosMarkAllDonePayload",
- "description": "Autogenerated return type of TodosMarkAllDone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "Updated to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedIds",
- "description": "IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use to-do items. Deprecated in 13.2."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ToggleAwardEmojiInput",
- "description": "Autogenerated input type of ToggleAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ToggleAwardEmojiPayload",
- "description": "Autogenerated return type of ToggleAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggledOn",
- "description": "Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Tree",
- "description": null,
- "fields": [
- {
- "name": "blobs",
- "description": "Blobs of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BlobConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastCommit",
- "description": "Last commit for the tree.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "submodules",
- "description": "Sub-modules of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SubmoduleConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "trees",
- "description": "Trees of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntryConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "description": "Represents a directory",
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path for the tree entry (directory).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL for the tree entry (directory).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntryConnection",
- "description": "The connection type for TreeEntry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "personal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "description": "A regexp containing patterns sourced from user input",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateAlertStatusInput",
- "description": "Autogenerated input type of UpdateAlertStatus",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "status",
- "description": "The status to set the alert.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateAlertStatusPayload",
- "description": "Autogenerated return type of UpdateAlertStatus",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardEpicUserPreferencesInput",
- "description": "Autogenerated input type of UpdateBoardEpicUserPreferences",
- "fields": null,
- "inputFields": [
- {
- "name": "boardId",
- "description": "The board global ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic to set preferences for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "collapsed",
- "description": "Whether the epic should be collapsed in the board.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardEpicUserPreferencesPayload",
- "description": "Autogenerated return type of UpdateBoardEpicUserPreferences",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicUserPreferences",
- "description": "User preferences for the epic in the board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardInput",
- "description": "Autogenerated input type of UpdateBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The board global ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "The ID of user to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of milestone to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The ID of iteration to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight value to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the board.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardListInput",
- "description": "Autogenerated input type of UpdateBoardList",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "Global ID of the list.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "Position of list within the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "collapsed",
- "description": "Indicates if list is collapsed for this user.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardListPayload",
- "description": "Autogenerated return type of UpdateBoardList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Mutated list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardPayload",
- "description": "Autogenerated return type of UpdateBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateComplianceFrameworkInput",
- "description": "Autogenerated input type of UpdateComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the compliance framework to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "params",
- "description": "Parameters to update the compliance framework with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateComplianceFrameworkPayload",
- "description": "Autogenerated return type of UpdateComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFramework",
- "description": "The compliance framework after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateContainerExpirationPolicyInput",
- "description": "Autogenerated input type of UpdateContainerExpirationPolicy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project path where the container expiration policy is located.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this container expiration policy is enabled.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "cadence",
- "description": "This container expiration policy schedule.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "olderThan",
- "description": "Tags older that this will expire.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "keepN",
- "description": "Number of tags to retain.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "nameRegex",
- "description": "Tags with names matching this regex pattern will expire.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "nameRegexKeep",
- "description": "Tags with names matching this regex pattern will be preserved.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateContainerExpirationPolicyPayload",
- "description": "Autogenerated return type of UpdateContainerExpirationPolicy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerExpirationPolicy",
- "description": "The container expiration policy after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "x",
- "description": "X position of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateEpicInput",
- "description": "Autogenerated input type of UpdateEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateFixed",
- "description": "The start date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateFixed",
- "description": "The end date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "stateEvent",
- "description": "State event for the epic.",
- "type": {
- "kind": "ENUM",
- "name": "EpicStateEvent",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateEpicPayload",
- "description": "Autogenerated return type of UpdateEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateImageDiffNoteInput",
- "description": "Autogenerated input type of UpdateImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateImageDiffNotePayload",
- "description": "Autogenerated return type of UpdateImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIssueInput",
- "description": "Autogenerated input type of UpdateIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Indicates discussion is locked on the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "stateEvent",
- "description": "Close or reopen an issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssueStateEvent",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "healthStatus",
- "description": "The desired health status.",
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateIssuePayload",
- "description": "Autogenerated return type of UpdateIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIterationInput",
- "description": "Autogenerated input type of UpdateIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "Group of the iteration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the iteration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDate",
- "description": "Start date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "End date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateIterationPayload",
- "description": "Autogenerated return type of UpdateIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Updated iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNamespacePackageSettingsInput",
- "description": "Autogenerated input type of UpdateNamespacePackageSettings",
- "fields": null,
- "inputFields": [
- {
- "name": "namespacePath",
- "description": "The namespace path where the namespace package setting is located.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "mavenDuplicatesAllowed",
- "description": "Indicates whether duplicate Maven packages are allowed for this namespace.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mavenDuplicateExceptionRegex",
- "description": "When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateNamespacePackageSettingsPayload",
- "description": "Autogenerated return type of UpdateNamespacePackageSettings",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The namespace package setting after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNoteInput",
- "description": "Autogenerated input type of UpdateNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateNotePayload",
- "description": "Autogenerated return type of UpdateNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateRequirementInput",
- "description": "Autogenerated input type of UpdateRequirement",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "Title of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirement is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the requirement.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the requirement to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "Creates a test report for the requirement with the given state.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateRequirementPayload",
- "description": "Autogenerated return type of UpdateRequirement",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Requirement after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateSnippetInput",
- "description": "Autogenerated input type of UpdateSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "captchaResponse",
- "description": "A valid CAPTCHA response value obtained by using the provided captchaSiteKey with a CAPTCHA API to present a challenge to be solved on the client. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for the operation to be completed. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The global ID of the snippet to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "visibilityLevel",
- "description": "The visibility level of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "blobActions",
- "description": "Actions to perform over the snippet repository and blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateSnippetPayload",
- "description": "Autogenerated return type of UpdateSnippet",
- "fields": [
- {
- "name": "captchaSiteKey",
- "description": "The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsCaptchaResponse",
- "description": "Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spam",
- "description": "Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Upload",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "User",
- "description": null,
- "fields": [
- {
- "name": "assignedMergeRequests",
- "description": "Merge Requests assigned to the user.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authoredMergeRequests",
- "description": "Merge Requests authored by the user.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "URL of the user's avatar.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "bot",
- "description": "Indicates if the user is a bot.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "email",
- "description": "User email. Deprecated in 13.7: Use public_email.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use public_email. Deprecated in 13.7."
- },
- {
- "name": "groupCount",
- "description": "Group count for the user. Available only when feature flag `user_group_counts` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMemberships",
- "description": "Group memberships of the user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "The location of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Human-readable name of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMemberships",
- "description": "Project memberships of the user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "publicEmail",
- "description": "User's public email.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reviewRequestedMergeRequests",
- "description": "Merge Requests assigned to the user for review.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Snippets authored by the user.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of snippet.",
- "type": {
- "kind": "ENUM",
- "name": "TypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "starredProjects",
- "description": "Projects starred by the user.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "UserState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "User status.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "To-do items of the user.",
- "args": [
- {
- "name": "action",
- "description": "The action to be filtered.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "The ID of a group.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The state of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "UserPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "username",
- "description": "Username of the user. Unique within this instance of GitLab.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserConnection",
- "description": "The connection type for User.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "UserEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "UserID",
- "description": "Identifier of User.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserPermissions",
- "description": null,
- "fields": [
- {
- "name": "createSnippet",
- "description": "Indicates the user can perform `create_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "UserState",
- "description": "Possible states of a user",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "active",
- "description": "The user is active and is able to use the system",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "The user has been blocked and is prevented from using the system",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deactivated",
- "description": "The user is no longer active and is unable to use the system",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserStatus",
- "description": null,
- "fields": [
- {
- "name": "availability",
- "description": "User availability status.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AvailabilityEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emoji",
- "description": "String representation of emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "User status message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "messageHtml",
- "description": "HTML of the user status message",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "private",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "public",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "private",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "public",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "description": "Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days",
- "fields": [
- {
- "name": "critical",
- "description": "Total number of vulnerabilities on a particular day with critical severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date for the count.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "high",
- "description": "Total number of vulnerabilities on a particular day with high severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "info",
- "description": "Total number of vulnerabilities on a particular day with info severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "low",
- "description": "Total number of vulnerabilities on a particular day with low severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "medium",
- "description": "Total number of vulnerabilities on a particular day with medium severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "total",
- "description": "Total number of vulnerabilities on a particular day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unknown",
- "description": "Total number of vulnerabilities on a particular day with unknown severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "description": "Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days",
- "fields": [
- {
- "name": "count",
- "description": "Number of vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "day",
- "description": "Date for the count.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the counted vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "description": "The connection type for VulnerabilitiesCountByDayAndSeverity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "description": "The connection type for VulnerabilitiesCountByDay.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "description": "Identifier of Vulnerabilities::ExternalIssueLink.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "description": "Represents a vulnerability",
- "fields": [
- {
- "name": "confirmedAt",
- "description": "Timestamp of when the vulnerability state was changed to confirmed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confirmedBy",
- "description": "The user that confirmed the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "details",
- "description": "Details of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detectedAt",
- "description": "Timestamp of when the vulnerability was first detected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissedAt",
- "description": "Timestamp of when the vulnerability state was changed to dismissed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissedBy",
- "description": "The user that dismissed the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalIssueLinks",
- "description": "List of external issue links related to the vulnerability.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasSolutions",
- "description": "Indicates whether there is a solution available for this vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "GraphQL ID of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "identifiers",
- "description": "Identifiers of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueLinks",
- "description": "List of issue links related to the vulnerability.",
- "args": [
- {
- "name": "linkType",
- "description": "Filter issue links by link type.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "VulnerabilityLocation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "Merge request that fixes the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "primaryIdentifier",
- "description": "Primary identifier of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project on which the vulnerability was found.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportType",
- "description": "Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the vulnerability state was changed to resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "The user that resolved the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedOnDefaultBranch",
- "description": "Indicates whether the vulnerability is fixed on the default branch or not.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanner",
- "description": "Scanner metadata for the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes attached to the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityPath",
- "description": "URL to the vulnerability's details page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityConfirmInput",
- "description": "Autogenerated input type of VulnerabilityConfirm",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be confirmed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityConfirmPayload",
- "description": "Autogenerated return type of VulnerabilityConfirm",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after state change.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "description": "The connection type for Vulnerability.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "description": "Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBase",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBoolean",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCode",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCommit",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailDiff",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailFileLocation",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailInt",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailList",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailMarkdown",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailModuleLocation",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailTable",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailText",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailUrl",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBase",
- "description": "Represents the vulnerability details base",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBoolean",
- "description": "Represents the vulnerability details boolean value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCode",
- "description": "Represents the vulnerability details code field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lang",
- "description": "Language of the code.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Source code.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCommit",
- "description": "Represents the vulnerability details commit field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "The commit SHA value.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailDiff",
- "description": "Represents the vulnerability details diff field",
- "fields": [
- {
- "name": "after",
- "description": "Value of the field after the change.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "before",
- "description": "Value of the field before the change.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailFileLocation",
- "description": "Represents the vulnerability details location within a file in the project",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lineEnd",
- "description": "End line number of the file location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lineStart",
- "description": "Start line number of the file location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailInt",
- "description": "Represents the vulnerability details integer value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailList",
- "description": "Represents the vulnerability details list value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "items",
- "description": "List of details.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailMarkdown",
- "description": "Represents the vulnerability details Markdown field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the Markdown field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailModuleLocation",
- "description": "Represents the vulnerability details location within a file in the project",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moduleName",
- "description": "Module name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "offset",
- "description": "Offset of the module location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailTable",
- "description": "Represents the vulnerability details table value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headers",
- "description": "Table headers.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rows",
- "description": "Table rows.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailText",
- "description": "Represents the vulnerability details text field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the text field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailUrl",
- "description": "Represents the vulnerability details URL field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "href",
- "description": "Href of the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "text",
- "description": "Text of the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityDismissInput",
- "description": "Autogenerated input type of VulnerabilityDismiss",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be dismissed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "comment",
- "description": "Comment why vulnerability should be dismissed.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDismissPayload",
- "description": "Autogenerated return type of VulnerabilityDismiss",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after dismissal.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "description": "The dismissal reason of the Vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ACCEPTABLE_RISK",
- "description": "The likelihood of the Vulnerability occurring and its impact are deemed acceptable",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FALSE_POSITIVE",
- "description": "The Vulnerability was incorrectly identified as being present",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MITIGATING_CONTROL",
- "description": "There is a mitigating control that eliminates the Vulnerability or makes its risk acceptable",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "USED_IN_TESTS",
- "description": "The Vulnerability is used in tests and does not pose an actual risk",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NOT_APPLICABLE",
- "description": "Other reasons for dismissal",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "description": "Represents an external issue link of a vulnerability",
- "fields": [
- {
- "name": "externalIssue",
- "description": "The external issue attached to the issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ExternalIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "GraphQL ID of the external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkConnection",
- "description": "The connection type for VulnerabilityExternalIssueLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreateInput",
- "description": "Autogenerated input type of VulnerabilityExternalIssueLinkCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "linkType",
- "description": "Type of the external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "externalTracker",
- "description": "External tracker type of the external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkExternalTracker",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreatePayload",
- "description": "Autogenerated return type of VulnerabilityExternalIssueLinkCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalIssueLink",
- "description": "The created external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyInput",
- "description": "Autogenerated input type of VulnerabilityExternalIssueLinkDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the vulnerability external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyPayload",
- "description": "Autogenerated return type of VulnerabilityExternalIssueLinkDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkExternalTracker",
- "description": "The external tracker of the external issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "JIRA",
- "description": "Jira external tracker",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "description": "The type of the external issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": "Created link type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityGrade",
- "description": "The grade of the vulnerable project",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "A",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "B",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "C",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "D",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "F",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "description": "Identifier of Vulnerability.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "description": "Represents a vulnerability identifier",
- "fields": [
- {
- "name": "externalId",
- "description": "External ID of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalType",
- "description": "External type of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "description": "Represents an issue link of a vulnerability",
- "fields": [
- {
- "name": "id",
- "description": "GraphQL ID of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue attached to issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkConnection",
- "description": "The connection type for VulnerabilityIssueLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "description": "The type of the issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "RELATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "VulnerabilityLocation",
- "description": "Represents a vulnerability location. The fields with data will depend on the vulnerability report type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationContainerScanning",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationCoverageFuzzing",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDast",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDependencyScanning",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSast",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSecretDetection",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationContainerScanning",
- "description": "Represents the location of a vulnerability found by a container security scan",
- "fields": [
- {
- "name": "dependency",
- "description": "Dependency containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "Name of the vulnerable container image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "operatingSystem",
- "description": "Operating system that runs on the vulnerable container image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationCoverageFuzzing",
- "description": "Represents the location of a vulnerability found by a Coverage Fuzzing scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDast",
- "description": "Represents the location of a vulnerability found by a DAST scan",
- "fields": [
- {
- "name": "hostname",
- "description": "Domain name of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "param",
- "description": "Query parameter for the URL on which the vulnerability occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "URL path and query string of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestMethod",
- "description": "HTTP method of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDependencyScanning",
- "description": "Represents the location of a vulnerability found by a dependency security scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dependency",
- "description": "Dependency containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSast",
- "description": "Represents the location of a vulnerability found by a SAST scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSecretDetection",
- "description": "Represents the location of a vulnerability found by a secret detection scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityPermissions",
- "description": "Check permissions for the current user on a vulnerability",
- "fields": [
- {
- "name": "adminVulnerability",
- "description": "Indicates the user can perform `admin_vulnerability` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminVulnerabilityExternalIssueLink",
- "description": "Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminVulnerabilityIssueLink",
- "description": "Indicates the user can perform `admin_vulnerability_issue_link` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerability",
- "description": "Indicates the user can perform `create_vulnerability` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerabilityExport",
- "description": "Indicates the user can perform `create_vulnerability_export` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerabilityFeedback",
- "description": "Indicates the user can perform `create_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyVulnerabilityFeedback",
- "description": "Indicates the user can perform `destroy_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readVulnerabilityFeedback",
- "description": "Indicates the user can perform `read_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateVulnerabilityFeedback",
- "description": "Indicates the user can perform `update_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "description": "The type of the security scan that found the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityResolveInput",
- "description": "Autogenerated input type of VulnerabilityResolve",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be resolved.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityResolvePayload",
- "description": "Autogenerated return type of VulnerabilityResolve",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after state change.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityRevertToDetectedInput",
- "description": "Autogenerated input type of VulnerabilityRevertToDetected",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be reverted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityRevertToDetectedPayload",
- "description": "Autogenerated return type of VulnerabilityRevertToDetected",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after revert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "description": "Represents a vulnerability scanner",
- "fields": [
- {
- "name": "externalId",
- "description": "External ID of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportType",
- "description": "Type of the vulnerability report.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vendor",
- "description": "Vendor of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "description": "The connection type for VulnerabilityScanner.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "description": "Represents vulnerability counts by severity",
- "fields": [
- {
- "name": "critical",
- "description": "Number of vulnerabilities of CRITICAL severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "high",
- "description": "Number of vulnerabilities of HIGH severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "info",
- "description": "Number of vulnerabilities of INFO severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "low",
- "description": "Number of vulnerabilities of LOW severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "medium",
- "description": "Number of vulnerabilities of MEDIUM severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unknown",
- "description": "Number of vulnerabilities of UNKNOWN severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "description": "The severity of the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "INFO",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNKNOWN",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CRITICAL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "description": "Vulnerability sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "severity_desc",
- "description": "Severity in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity_asc",
- "description": "Severity in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title_desc",
- "description": "Title in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title_asc",
- "description": "Title in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detected_desc",
- "description": "Detection timestamp in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detected_asc",
- "description": "Detection timestamp in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report_type_desc",
- "description": "Report Type in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report_type_asc",
- "description": "Report Type in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state_desc",
- "description": "State in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state_asc",
- "description": "State in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "description": "The state of the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DETECTED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONFIRMED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DISMISSED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "description": "Represents a vulnerable dependency. Used in vulnerability location data",
- "fields": [
- {
- "name": "package",
- "description": "The package associated with the vulnerable dependency.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerablePackage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version of the vulnerable dependency.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerablePackage",
- "description": "Represents a vulnerable package. Used in vulnerability dependency data",
- "fields": [
- {
- "name": "name",
- "description": "The name of the vulnerable package.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "description": "Represents vulnerability letter grades with associated projects",
- "fields": [
- {
- "name": "count",
- "description": "Number of projects within this grade.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grade",
- "description": "Grade based on the highest severity vulnerability present.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityGrade",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this grade.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Directive",
- "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
- "fields": [
- {
- "name": "args",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locations",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "__DirectiveLocation",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onField",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- },
- {
- "name": "onFragment",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- },
- {
- "name": "onOperation",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "__DirectiveLocation",
- "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "QUERY",
- "description": "Location adjacent to a query operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MUTATION",
- "description": "Location adjacent to a mutation operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SUBSCRIPTION",
- "description": "Location adjacent to a subscription operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIELD",
- "description": "Location adjacent to a field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FRAGMENT_DEFINITION",
- "description": "Location adjacent to a fragment definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FRAGMENT_SPREAD",
- "description": "Location adjacent to a fragment spread.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INLINE_FRAGMENT",
- "description": "Location adjacent to an inline fragment.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEMA",
- "description": "Location adjacent to a schema definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCALAR",
- "description": "Location adjacent to a scalar definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OBJECT",
- "description": "Location adjacent to an object type definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIELD_DEFINITION",
- "description": "Location adjacent to a field definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARGUMENT_DEFINITION",
- "description": "Location adjacent to an argument definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INTERFACE",
- "description": "Location adjacent to an interface definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNION",
- "description": "Location adjacent to a union definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM",
- "description": "Location adjacent to an enum definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM_VALUE",
- "description": "Location adjacent to an enum value definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_OBJECT",
- "description": "Location adjacent to an input object type definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_FIELD_DEFINITION",
- "description": "Location adjacent to an input object field definition.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__EnumValue",
- "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
- "fields": [
- {
- "name": "deprecationReason",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isDeprecated",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Field",
- "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
- "fields": [
- {
- "name": "args",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deprecationReason",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isDeprecated",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__InputValue",
- "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
- "fields": [
- {
- "name": "defaultValue",
- "description": "A GraphQL-formatted string representing the default value for this input value.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Schema",
- "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
- "fields": [
- {
- "name": "directives",
- "description": "A list of all directives supported by this server.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Directive",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mutationType",
- "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "queryType",
- "description": "The type that query operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscriptionType",
- "description": "If this server support subscription, the type that subscription operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "types",
- "description": "A list of all types supported by this server.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Type",
- "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
- "fields": [
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enumValues",
- "description": null,
- "args": [
- {
- "name": "includeDeprecated",
- "description": null,
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__EnumValue",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fields",
- "description": null,
- "args": [
- {
- "name": "includeDeprecated",
- "description": null,
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Field",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "inputFields",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "interfaces",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "kind",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "__TypeKind",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ofType",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "possibleTypes",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "__TypeKind",
- "description": "An enum describing what kind of type a given `__Type` is.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SCALAR",
- "description": "Indicates this type is a scalar.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OBJECT",
- "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INTERFACE",
- "description": "Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNION",
- "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM",
- "description": "Indicates this type is an enum. `enumValues` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_OBJECT",
- "description": "Indicates this type is an input object. `inputFields` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LIST",
- "description": "Indicates this type is a list. `ofType` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NON_NULL",
- "description": "Indicates this type is a non-null. `ofType` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- }
- ],
- "directives": [
- {
- "name": "include",
- "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
- "locations": [
- "FIELD",
- "FRAGMENT_SPREAD",
- "INLINE_FRAGMENT"
- ],
- "args": [
- {
- "name": "if",
- "description": "Included when true.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ]
- },
- {
- "name": "skip",
- "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
- "locations": [
- "FIELD",
- "FRAGMENT_SPREAD",
- "INLINE_FRAGMENT"
- ],
- "args": [
- {
- "name": "if",
- "description": "Skipped when true.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ]
- },
- {
- "name": "deprecated",
- "description": "Marks an element of a GraphQL schema as no longer supported.",
- "locations": [
- "FIELD_DEFINITION",
- "ENUM_VALUE"
- ],
- "args": [
- {
- "name": "reason",
- "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"No longer supported\""
- }
- ]
- }
- ]
- }
- }
-} \ No newline at end of file
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index f49a12568ed..b395dc19681 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -21,11 +21,405 @@ fields and methods on a model are available via GraphQL.
WARNING:
Fields that are deprecated are marked with **{warning-solid}**.
-Items (fields, enums, etc) that have been removed according to our [deprecation process](../index.md#deprecation-process) can be found
+Items (fields, enums, etc) that have been removed according to our [deprecation process](../index.md#deprecation-and-removal-process) can be found
in [Removed Items](../removed_items.md).
<!-- vale gitlab.Spelling = NO -->
+## `Query` type
+
+The `Query` type contains the API's top-level entry points for all executable queries.
+
+### `ciApplicationSettings`
+
+CI related settings that apply to the entire instance.
+
+Returns [`CiApplicationSettings`](#ciapplicationsettings).
+
+### `ciConfig`
+
+Get linted and processed contents of a CI config. Should not be requested more than once per request.
+
+Returns [`CiConfig`](#ciconfig).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `content` | [`String!`](#string) | Contents of `.gitlab-ci.yml`. |
+| `dryRun` | [`Boolean`](#boolean) | Run pipeline creation simulation, or only do static check. |
+| `projectPath` | [`ID!`](#id) | The project of the CI config. |
+
+### `containerRepository`
+
+Find a container repository.
+
+Returns [`ContainerRepositoryDetails`](#containerrepositorydetails).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | [`ContainerRepositoryID!`](#containerrepositoryid) | The global ID of the container repository. |
+
+### `currentUser`
+
+Get information about current user.
+
+Returns [`User`](#user).
+
+### `designManagement`
+
+Fields related to design management.
+
+Returns [`DesignManagement!`](#designmanagement).
+
+### `devopsAdoptionSegments`
+
+Get configured DevOps adoption segments on the instance.
+
+Returns [`DevopsAdoptionSegmentConnection`](#devopsadoptionsegmentconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `directDescendantsOnly` | [`Boolean`](#boolean) | Limits segments to direct descendants of specified parent. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `parentNamespaceId` | [`NamespaceID`](#namespaceid) | Filter by ancestor namespace. |
+
+### `echo`
+
+Text to echo back.
+
+Returns [`String!`](#string).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `text` | [`String!`](#string) | Text to echo back. |
+
+### `geoNode`
+
+Find a Geo node.
+
+Returns [`GeoNode`](#geonode).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `name` | [`String`](#string) | The name of the Geo node. Defaults to the current Geo node name. |
+
+### `group`
+
+Find a group.
+
+Returns [`Group`](#group).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `fullPath` | [`ID!`](#id) | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. |
+
+### `instanceSecurityDashboard`
+
+Fields related to Instance Security Dashboard.
+
+Returns [`InstanceSecurityDashboard`](#instancesecuritydashboard).
+
+### `instanceStatisticsMeasurements`
+
+Get statistics on the instance. Deprecated in 13.10: This field was renamed. Use the `usageTrendsMeasurements` field instead.
+
+Returns [`UsageTrendsMeasurementConnection`](#usagetrendsmeasurementconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `identifier` | [`MeasurementIdentifier!`](#measurementidentifier) | The type of measurement/statistics to retrieve. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `recordedAfter` | [`Time`](#time) | Measurement recorded after this date. |
+| `recordedBefore` | [`Time`](#time) | Measurement recorded before this date. |
+
+### `issue`
+
+Find an Issue.
+
+Returns [`Issue`](#issue).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | [`IssueID!`](#issueid) | The global ID of the Issue. |
+
+### `iteration`
+
+Find an iteration.
+
+Returns [`Iteration`](#iteration).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | [`IterationID!`](#iterationid) | Find an iteration by its ID. |
+
+### `metadata`
+
+Metadata about GitLab.
+
+Returns [`Metadata`](#metadata).
+
+### `milestone`
+
+Find a milestone.
+
+Returns [`Milestone`](#milestone).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | [`MilestoneID!`](#milestoneid) | Find a milestone by its ID. |
+
+### `namespace`
+
+Find a namespace.
+
+Returns [`Namespace`](#namespace).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `fullPath` | [`ID!`](#id) | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. |
+
+### `package`
+
+Find a package.
+
+Returns [`Package`](#package).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | [`PackagesPackageID!`](#packagespackageid) | The global ID of the package. |
+
+### `project`
+
+Find a project.
+
+Returns [`Project`](#project).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `fullPath` | [`ID!`](#id) | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. |
+
+### `projects`
+
+Find projects visible to the current user.
+
+Returns [`ProjectConnection`](#projectconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `ids` | [`[ID!]`](#id) | Filter projects by IDs. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `membership` | [`Boolean`](#boolean) | Limit projects that the current user is a member of. |
+| `search` | [`String`](#string) | Search query for project name, path, or description. |
+| `searchNamespaces` | [`Boolean`](#boolean) | Include namespace in project search. |
+| `sort` | [`String`](#string) | Sort order of results. |
+
+### `runnerPlatforms`
+
+Supported runner platforms.
+
+Returns [`RunnerPlatformConnection`](#runnerplatformconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+
+### `runnerSetup`
+
+Get runner setup instructions.
+
+Returns [`RunnerSetup`](#runnersetup).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `architecture` | [`String!`](#string) | Architecture to generate the instructions for. |
+| `groupId` | [`GroupID`](#groupid) | Group to register the runner for. |
+| `platform` | [`String!`](#string) | Platform to generate the instructions for. |
+| `projectId` | [`ProjectID`](#projectid) | Project to register the runner for. |
+
+### `snippets`
+
+Find Snippets visible to the current user.
+
+Returns [`SnippetConnection`](#snippetconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `authorId` | [`UserID`](#userid) | The ID of an author. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `explore` | [`Boolean`](#boolean) | Explore personal snippets. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `ids` | [`[SnippetID!]`](#snippetid) | Array of global snippet IDs. For example, `gid://gitlab/ProjectSnippet/1`. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `projectId` | [`ProjectID`](#projectid) | The ID of a project. |
+| `type` | [`TypeEnum`](#typeenum) | The type of snippet. |
+| `visibility` | [`VisibilityScopesEnum`](#visibilityscopesenum) | The visibility of the snippet. |
+
+### `usageTrendsMeasurements`
+
+Get statistics on the instance.
+
+Returns [`UsageTrendsMeasurementConnection`](#usagetrendsmeasurementconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `identifier` | [`MeasurementIdentifier!`](#measurementidentifier) | The type of measurement/statistics to retrieve. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `recordedAfter` | [`Time`](#time) | Measurement recorded after this date. |
+| `recordedBefore` | [`Time`](#time) | Measurement recorded before this date. |
+
+### `user`
+
+Find a user.
+
+Returns [`User`](#user).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | [`UserID`](#userid) | ID of the User. |
+| `username` | [`String`](#string) | Username of the User. |
+
+### `users`
+
+Find users.
+
+Returns [`UserConnection`](#userconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `admins` | [`Boolean`](#boolean) | Return only admin users. |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `ids` | [`[ID!]`](#id) | List of user Global IDs. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `search` | [`String`](#string) | Query to search users by name, username, or primary email. |
+| `sort` | [`Sort`](#sort) | Sort users by this criteria. |
+| `usernames` | [`[String!]`](#string) | List of usernames. |
+
+### `vulnerabilities`
+
+Vulnerabilities reported on projects on the current user's instance security dashboard.
+
+Returns [`VulnerabilityConnection`](#vulnerabilityconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
+| `hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `projectId` | [`[ID!]`](#id) | Filter vulnerabilities by project. |
+| `reportType` | [`[VulnerabilityReportType!]`](#vulnerabilityreporttype) | Filter vulnerabilities by report type. |
+| `scanner` | [`[String!]`](#string) | Filter vulnerabilities by VulnerabilityScanner.externalId. |
+| `severity` | [`[VulnerabilitySeverity!]`](#vulnerabilityseverity) | Filter vulnerabilities by severity. |
+| `sort` | [`VulnerabilitySort`](#vulnerabilitysort) | List vulnerabilities by sort order. |
+| `state` | [`[VulnerabilityState!]`](#vulnerabilitystate) | Filter vulnerabilities by state. |
+
+### `vulnerabilitiesCountByDay`
+
+Number of vulnerabilities per day for the projects on the current user's instance security dashboard.
+
+Returns [`VulnerabilitiesCountByDayConnection`](#vulnerabilitiescountbydayconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `endDate` | [`ISO8601Date!`](#iso8601date) | Last day for which to fetch vulnerability history. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `startDate` | [`ISO8601Date!`](#iso8601date) | First day for which to fetch vulnerability history. |
+
+### `vulnerabilitiesCountByDayAndSeverity`
+
+Number of vulnerabilities per severity level, per day, for the projects on the current user's instance security dashboard. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.
+
+Returns [`VulnerabilitiesCountByDayAndSeverityConnection`](#vulnerabilitiescountbydayandseverityconnection).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | [`String`](#string) | Returns the elements in the list that come after the specified cursor. |
+| `before` | [`String`](#string) | Returns the elements in the list that come before the specified cursor. |
+| `endDate` | [`ISO8601Date!`](#iso8601date) | Last day for which to fetch vulnerability history. |
+| `first` | [`Int`](#int) | Returns the first _n_ elements from the list. |
+| `last` | [`Int`](#int) | Returns the last _n_ elements from the list. |
+| `startDate` | [`ISO8601Date!`](#iso8601date) | First day for which to fetch vulnerability history. |
+
+### `vulnerability`
+
+Find a vulnerability.
+
+Returns [`Vulnerability`](#vulnerability).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | [`VulnerabilityID!`](#vulnerabilityid) | The Global ID of the Vulnerability. |
+
## Object types
Object types represent the resources that the GitLab GraphQL API can return.
@@ -37,4500 +431,6639 @@ For more information, see
[Object Types and Fields](https://graphql.org/learn/schema/#object-types-and-fields)
on `graphql.org`.
-### AccessLevel
+### `AccessLevel`
Represents the access level of a relationship between a User and object that it is related to.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `integerValue` | Int | Integer representation of access level. |
-| `stringValue` | AccessLevelEnum | String representation of access level. |
+| `integerValue` | [`Int`](#int) | Integer representation of access level. |
+| `stringValue` | [`AccessLevelEnum`](#accesslevelenum) | String representation of access level. |
-### AddAwardEmojiPayload
+### `AddAwardEmojiPayload`
Autogenerated return type of AddAwardEmoji.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `awardEmoji` | AwardEmoji | The award emoji after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `awardEmoji` | [`AwardEmoji`](#awardemoji) | The award emoji after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### AddProjectToSecurityDashboardPayload
+### `AddProjectToSecurityDashboardPayload`
Autogenerated return type of AddProjectToSecurityDashboard.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `project` | Project | Project that was added to the Instance Security Dashboard. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `project` | [`Project`](#project) | Project that was added to the Instance Security Dashboard. |
-### AdminSidekiqQueuesDeleteJobsPayload
+### `AdminSidekiqQueuesDeleteJobsPayload`
Autogenerated return type of AdminSidekiqQueuesDeleteJobs.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `result` | DeleteJobsResponse | Information about the status of the deletion request. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `result` | [`DeleteJobsResponse`](#deletejobsresponse) | Information about the status of the deletion request. |
-### AlertManagementAlert
+### `AlertManagementAlert`
Describes an alert from the project's Alert Management.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `assignees` | UserConnection | Assignees of the alert. |
-| `createdAt` | Time | Timestamp the alert was created. |
-| `description` | String | Description of the alert. |
-| `details` | JSON | Alert details. |
-| `detailsUrl` | String! | The URL of the alert detail page. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `endedAt` | Time | Timestamp the alert ended. |
-| `environment` | Environment | Environment for the alert. |
-| `eventCount` | Int | Number of events of this alert. |
-| `hosts` | String! => Array | List of hosts the alert came from. |
-| `iid` | ID! | Internal ID of the alert. |
-| `issueIid` | ID | Internal ID of the GitLab issue attached to the alert. |
-| `metricsDashboardUrl` | String | URL for metrics embed for the alert. |
-| `monitoringTool` | String | Monitoring tool the alert came from. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `prometheusAlert` | PrometheusAlert | The alert condition for Prometheus. |
-| `runbook` | String | Runbook for the alert as defined in alert details. |
-| `service` | String | Service the alert came from. |
-| `severity` | AlertManagementSeverity | Severity of the alert. |
-| `startedAt` | Time | Timestamp the alert was raised. |
-| `status` | AlertManagementStatus | Status of the alert. |
-| `title` | String | Title of the alert. |
-| `todos` | TodoConnection | To-do items of the current user for the alert. |
-| `updatedAt` | Time | Timestamp the alert was last updated. |
-
-### AlertManagementAlertStatusCountsType
+| `assignees` | [`UserConnection`](#userconnection) | Assignees of the alert. |
+| `createdAt` | [`Time`](#time) | Timestamp the alert was created. |
+| `description` | [`String`](#string) | Description of the alert. |
+| `details` | [`JSON`](#json) | Alert details. |
+| `detailsUrl` | [`String!`](#string) | The URL of the alert detail page. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `endedAt` | [`Time`](#time) | Timestamp the alert ended. |
+| `environment` | [`Environment`](#environment) | Environment for the alert. |
+| `eventCount` | [`Int`](#int) | Number of events of this alert. |
+| `hosts` | [`[String!]`](#string) | List of hosts the alert came from. |
+| `iid` | [`ID!`](#id) | Internal ID of the alert. |
+| `issue` | [`Issue`](#issue) | Issue attached to the alert. |
+| `issueIid` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use issue field. Deprecated in 13.10. |
+| `metricsDashboardUrl` | [`String`](#string) | URL for metrics embed for the alert. |
+| `monitoringTool` | [`String`](#string) | Monitoring tool the alert came from. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `prometheusAlert` | [`PrometheusAlert`](#prometheusalert) | The alert condition for Prometheus. |
+| `runbook` | [`String`](#string) | Runbook for the alert as defined in alert details. |
+| `service` | [`String`](#string) | Service the alert came from. |
+| `severity` | [`AlertManagementSeverity`](#alertmanagementseverity) | Severity of the alert. |
+| `startedAt` | [`Time`](#time) | Timestamp the alert was raised. |
+| `status` | [`AlertManagementStatus`](#alertmanagementstatus) | Status of the alert. |
+| `title` | [`String`](#string) | Title of the alert. |
+| `todos` | [`TodoConnection`](#todoconnection) | To-do items of the current user for the alert. |
+| `updatedAt` | [`Time`](#time) | Timestamp the alert was last updated. |
+
+### `AlertManagementAlertConnection`
+
+The connection type for AlertManagementAlert.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[AlertManagementAlertEdge]`](#alertmanagementalertedge) | A list of edges. |
+| `nodes` | [`[AlertManagementAlert]`](#alertmanagementalert) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `AlertManagementAlertEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`AlertManagementAlert`](#alertmanagementalert) | The item at the end of the edge. |
+
+### `AlertManagementAlertStatusCountsType`
Represents total number of alerts for the represented categories.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `acknowledged` | Int | Number of alerts with status ACKNOWLEDGED for the project |
-| `all` | Int | Total number of alerts for the project. |
-| `ignored` | Int | Number of alerts with status IGNORED for the project |
-| `open` | Int | Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project. |
-| `resolved` | Int | Number of alerts with status RESOLVED for the project |
-| `triggered` | Int | Number of alerts with status TRIGGERED for the project |
+| `acknowledged` | [`Int`](#int) | Number of alerts with status ACKNOWLEDGED for the project |
+| `all` | [`Int`](#int) | Total number of alerts for the project. |
+| `ignored` | [`Int`](#int) | Number of alerts with status IGNORED for the project |
+| `open` | [`Int`](#int) | Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project. |
+| `resolved` | [`Int`](#int) | Number of alerts with status RESOLVED for the project |
+| `triggered` | [`Int`](#int) | Number of alerts with status TRIGGERED for the project |
-### AlertManagementHttpIntegration
+### `AlertManagementHttpIntegration`
An endpoint and credentials used to accept alerts for a project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `active` | Boolean | Whether the endpoint is currently accepting alerts. |
-| `apiUrl` | String | URL at which Prometheus metrics can be queried to populate the metrics dashboard. |
-| `id` | ID! | ID of the integration. |
-| `name` | String | Name of the integration. |
-| `token` | String | Token used to authenticate alert notification requests. |
-| `type` | AlertManagementIntegrationType! | Type of integration. |
-| `url` | String | Endpoint which accepts alert notifications. |
+| `active` | [`Boolean`](#boolean) | Whether the endpoint is currently accepting alerts. |
+| `apiUrl` | [`String`](#string) | URL at which Prometheus metrics can be queried to populate the metrics dashboard. |
+| `id` | [`ID!`](#id) | ID of the integration. |
+| `name` | [`String`](#string) | Name of the integration. |
+| `payloadAlertFields` | [`[AlertManagementPayloadAlertField!]`](#alertmanagementpayloadalertfield) | Extract alert fields from payload example for custom mapping. |
+| `payloadAttributeMappings` | [`[AlertManagementPayloadAlertMappingField!]`](#alertmanagementpayloadalertmappingfield) | The custom mapping of GitLab alert attributes to fields from the payload_example. |
+| `payloadExample` | [`JsonString`](#jsonstring) | The example of an alert payload. |
+| `token` | [`String`](#string) | Token used to authenticate alert notification requests. |
+| `type` | [`AlertManagementIntegrationType!`](#alertmanagementintegrationtype) | Type of integration. |
+| `url` | [`String`](#string) | Endpoint which accepts alert notifications. |
+
+### `AlertManagementHttpIntegrationConnection`
+
+The connection type for AlertManagementHttpIntegration.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[AlertManagementHttpIntegrationEdge]`](#alertmanagementhttpintegrationedge) | A list of edges. |
+| `nodes` | [`[AlertManagementHttpIntegration]`](#alertmanagementhttpintegration) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `AlertManagementHttpIntegrationEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`AlertManagementHttpIntegration`](#alertmanagementhttpintegration) | The item at the end of the edge. |
+
+### `AlertManagementIntegrationConnection`
+
+The connection type for AlertManagementIntegration.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[AlertManagementIntegrationEdge]`](#alertmanagementintegrationedge) | A list of edges. |
+| `nodes` | [`[AlertManagementIntegration]`](#alertmanagementintegration) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `AlertManagementIntegrationEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`AlertManagementIntegration`](#alertmanagementintegration) | The item at the end of the edge. |
-### AlertManagementPayloadAlertField
+### `AlertManagementPayloadAlertField`
Parsed field from an alert used for custom mappings.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `label` | String | Human-readable label of the payload path. |
-| `path` | String! => Array | Path to value inside payload JSON. |
-| `type` | AlertManagementPayloadAlertFieldType | Type of the parsed value. |
+| `label` | [`String`](#string) | Human-readable label of the payload path. |
+| `path` | [`[String!]`](#string) | Path to value inside payload JSON. |
+| `type` | [`AlertManagementPayloadAlertFieldType`](#alertmanagementpayloadalertfieldtype) | Type of the parsed value. |
+
+### `AlertManagementPayloadAlertMappingField`
+
+Parsed field (with its name) from an alert used for custom mappings.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `fieldName` | [`AlertManagementPayloadAlertFieldName`](#alertmanagementpayloadalertfieldname) | A GitLab alert field name. |
+| `label` | [`String`](#string) | Human-readable label of the payload path. |
+| `path` | [`[String!]`](#string) | Path to value inside payload JSON. |
+| `type` | [`AlertManagementPayloadAlertFieldType`](#alertmanagementpayloadalertfieldtype) | Type of the parsed value. |
-### AlertManagementPrometheusIntegration
+### `AlertManagementPrometheusIntegration`
An endpoint and credentials used to accept Prometheus alerts for a project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `active` | Boolean | Whether the endpoint is currently accepting alerts. |
-| `apiUrl` | String | URL at which Prometheus metrics can be queried to populate the metrics dashboard. |
-| `id` | ID! | ID of the integration. |
-| `name` | String | Name of the integration. |
-| `token` | String | Token used to authenticate alert notification requests. |
-| `type` | AlertManagementIntegrationType! | Type of integration. |
-| `url` | String | Endpoint which accepts alert notifications. |
+| `active` | [`Boolean`](#boolean) | Whether the endpoint is currently accepting alerts. |
+| `apiUrl` | [`String`](#string) | URL at which Prometheus metrics can be queried to populate the metrics dashboard. |
+| `id` | [`ID!`](#id) | ID of the integration. |
+| `name` | [`String`](#string) | Name of the integration. |
+| `token` | [`String`](#string) | Token used to authenticate alert notification requests. |
+| `type` | [`AlertManagementIntegrationType!`](#alertmanagementintegrationtype) | Type of integration. |
+| `url` | [`String`](#string) | Endpoint which accepts alert notifications. |
-### AlertSetAssigneesPayload
+### `AlertSetAssigneesPayload`
Autogenerated return type of AlertSetAssignees.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `alert` | AlertManagementAlert | The alert after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue created after mutation. |
-| `todo` | Todo | The to-do item after mutation. |
+| `alert` | [`AlertManagementAlert`](#alertmanagementalert) | The alert after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue created after mutation. |
+| `todo` | [`Todo`](#todo) | The to-do item after mutation. |
-### AlertTodoCreatePayload
+### `AlertTodoCreatePayload`
Autogenerated return type of AlertTodoCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `alert` | AlertManagementAlert | The alert after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue created after mutation. |
-| `todo` | Todo | The to-do item after mutation. |
+| `alert` | [`AlertManagementAlert`](#alertmanagementalert) | The alert after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue created after mutation. |
+| `todo` | [`Todo`](#todo) | The to-do item after mutation. |
-### ApiFuzzingCiConfiguration
+### `ApiFuzzingCiConfiguration`
Data associated with configuring API fuzzing scans in GitLab CI.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `scanModes` | ApiFuzzingScanMode! => Array | All available scan modes. |
-| `scanProfiles` | ApiFuzzingScanProfile! => Array | All default scan profiles. |
+| `scanModes` | [`[ApiFuzzingScanMode!]`](#apifuzzingscanmode) | All available scan modes. |
+| `scanProfiles` | [`[ApiFuzzingScanProfile!]`](#apifuzzingscanprofile) | All default scan profiles. |
-### ApiFuzzingCiConfigurationCreatePayload
+### `ApiFuzzingCiConfigurationCreatePayload`
Autogenerated return type of ApiFuzzingCiConfigurationCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `configurationYaml` | String | A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `gitlabCiYamlEditPath` | String | The location at which the project's `.gitlab-ci.yml` file can be edited in the browser. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `configurationYaml` | [`String`](#string) | A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `gitlabCiYamlEditPath` | [`String`](#string) | The location at which the project's `.gitlab-ci.yml` file can be edited in the browser. |
-### ApiFuzzingScanProfile
+### `ApiFuzzingScanProfile`
-An API Fuzzing scan profile..
+An API Fuzzing scan profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String | A short description of the profile. |
-| `name` | String | The unique name of the profile. |
-| `yaml` | String | A syntax highlit HTML representation of the YAML. |
+| `description` | [`String`](#string) | A short description of the profile. |
+| `name` | [`String`](#string) | The unique name of the profile. |
+| `yaml` | [`String`](#string) | A syntax highlit HTML representation of the YAML. |
-### AwardEmoji
+### `AwardEmoji`
An emoji awarded by a user.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | The emoji description. |
-| `emoji` | String! | The emoji as an icon. |
-| `name` | String! | The emoji name. |
-| `unicode` | String! | The emoji in Unicode. |
-| `unicodeVersion` | String! | The Unicode version for this emoji. |
-| `user` | User! | The user who awarded the emoji. |
+| `description` | [`String!`](#string) | The emoji description. |
+| `emoji` | [`String!`](#string) | The emoji as an icon. |
+| `name` | [`String!`](#string) | The emoji name. |
+| `unicode` | [`String!`](#string) | The emoji in Unicode. |
+| `unicodeVersion` | [`String!`](#string) | The Unicode version for this emoji. |
+| `user` | [`User!`](#user) | The user who awarded the emoji. |
-### AwardEmojiAddPayload
+### `AwardEmojiAddPayload`
Autogenerated return type of AwardEmojiAdd.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `awardEmoji` | AwardEmoji | The award emoji after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `awardEmoji` | [`AwardEmoji`](#awardemoji) | The award emoji after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### AwardEmojiRemovePayload
+### `AwardEmojiConnection`
+
+The connection type for AwardEmoji.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[AwardEmojiEdge]`](#awardemojiedge) | A list of edges. |
+| `nodes` | [`[AwardEmoji]`](#awardemoji) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `AwardEmojiEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`AwardEmoji`](#awardemoji) | The item at the end of the edge. |
+
+### `AwardEmojiRemovePayload`
Autogenerated return type of AwardEmojiRemove.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `awardEmoji` | AwardEmoji | The award emoji after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `awardEmoji` | [`AwardEmoji`](#awardemoji) | The award emoji after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### AwardEmojiTogglePayload
+### `AwardEmojiTogglePayload`
Autogenerated return type of AwardEmojiToggle.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `awardEmoji` | AwardEmoji | The award emoji after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `toggledOn` | Boolean! | Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji. |
+| `awardEmoji` | [`AwardEmoji`](#awardemoji) | The award emoji after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `toggledOn` | [`Boolean!`](#boolean) | Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji. |
+
+### `BaseService`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `active` | [`Boolean`](#boolean) | Indicates if the service is active. |
+| `type` | [`String`](#string) | Class name of the service. |
-### BaseService
+### `Blob`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `active` | Boolean | Indicates if the service is active. |
-| `type` | String | Class name of the service. |
+| `flatPath` | [`String!`](#string) | Flat path of the entry. |
+| `id` | [`ID!`](#id) | ID of the entry. |
+| `lfsOid` | [`String`](#string) | LFS ID of the blob. |
+| `mode` | [`String`](#string) | Blob mode in numeric format. |
+| `name` | [`String!`](#string) | Name of the entry. |
+| `path` | [`String!`](#string) | Path of the entry. |
+| `sha` | [`String!`](#string) | Last commit SHA for the entry. |
+| `type` | [`EntryType!`](#entrytype) | Type of tree entry. |
+| `webPath` | [`String`](#string) | Web path of the blob. |
+| `webUrl` | [`String`](#string) | Web URL of the blob. |
-### Blob
+### `BlobConnection`
+
+The connection type for Blob.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[BlobEdge]`](#blobedge) | A list of edges. |
+| `nodes` | [`[Blob]`](#blob) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `BlobEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Blob`](#blob) | The item at the end of the edge. |
+
+### `Board`
+
+Represents a project or group issue board.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `assignee` | [`User`](#user) | The board assignee. |
+| `epics` | [`BoardEpicConnection`](#boardepicconnection) | Epics associated with board issues. |
+| `hideBacklogList` | [`Boolean`](#boolean) | Whether or not backlog list is hidden. |
+| `hideClosedList` | [`Boolean`](#boolean) | Whether or not closed list is hidden. |
+| `id` | [`ID!`](#id) | ID (global ID) of the board. |
+| `iteration` | [`Iteration`](#iteration) | The board iteration. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels of the board. |
+| `lists` | [`BoardListConnection`](#boardlistconnection) | Lists of the board. |
+| `milestone` | [`Milestone`](#milestone) | The board milestone. |
+| `name` | [`String`](#string) | Name of the board. |
+| `webPath` | [`String!`](#string) | Web path of the board. |
+| `webUrl` | [`String!`](#string) | Web URL of the board. |
+| `weight` | [`Int`](#int) | Weight of the board. |
+
+### `BoardConnection`
+
+The connection type for Board.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `flatPath` | String! | Flat path of the entry. |
-| `id` | ID! | ID of the entry. |
-| `lfsOid` | String | LFS ID of the blob. |
-| `mode` | String | Blob mode in numeric format. |
-| `name` | String! | Name of the entry. |
-| `path` | String! | Path of the entry. |
-| `sha` | String! | Last commit SHA for the entry. |
-| `type` | EntryType! | Type of tree entry. |
-| `webPath` | String | Web path of the blob. |
-| `webUrl` | String | Web URL of the blob. |
+| `edges` | [`[BoardEdge]`](#boardedge) | A list of edges. |
+| `nodes` | [`[Board]`](#board) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### Board
+### `BoardEdge`
-Represents a project or group board.
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `assignee` | User | The board assignee. |
-| `epics` | BoardEpicConnection | Epics associated with board issues. |
-| `hideBacklogList` | Boolean | Whether or not backlog list is hidden. |
-| `hideClosedList` | Boolean | Whether or not closed list is hidden. |
-| `id` | ID! | ID (global ID) of the board. |
-| `iteration` | Iteration | The board iteration. |
-| `labels` | LabelConnection | Labels of the board. |
-| `lists` | BoardListConnection | Lists of the board. |
-| `milestone` | Milestone | The board milestone. |
-| `name` | String | Name of the board. |
-| `webPath` | String! | Web path of the board. |
-| `webUrl` | String! | Web URL of the board. |
-| `weight` | Int | Weight of the board. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Board`](#board) | The item at the end of the edge. |
-### BoardEpic
+### `BoardEpic`
Represents an epic on an issue board.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `author` | User! | Author of the epic. |
-| `awardEmoji` | AwardEmojiConnection | A list of award emojis associated with the epic. |
-| `children` | EpicConnection | Children (sub-epics) of the epic. |
-| `closedAt` | Time | Timestamp of when the epic was closed. |
-| `confidential` | Boolean | Indicates if the epic is confidential. |
-| `createdAt` | Time | Timestamp of when the epic was created. |
-| `currentUserTodos` | TodoConnection! | To-do items for the current user. |
-| `descendantCounts` | EpicDescendantCount | Number of open and closed descendant epics and issues. |
-| `descendantWeightSum` | EpicDescendantWeights | Total weight of open and closed issues in the epic and its descendants. |
-| `description` | String | Description of the epic. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `downvotes` | Int! | Number of downvotes the epic has received. |
-| `dueDate` | Time | Due date of the epic. |
-| `dueDateFixed` | Time | Fixed due date of the epic. |
-| `dueDateFromMilestones` | Time | Inherited due date of the epic from milestones. |
-| `dueDateIsFixed` | Boolean | Indicates if the due date has been manually set. |
-| `events` | EventConnection | A list of events associated with the object. |
-| `group` | Group! | Group to which the epic belongs. |
-| `hasChildren` | Boolean! | Indicates if the epic has children. |
-| `hasIssues` | Boolean! | Indicates if the epic has direct issues. |
-| `hasParent` | Boolean! | Indicates if the epic has a parent epic. |
-| `healthStatus` | EpicHealthStatus | Current health status of the epic. |
-| `id` | ID! | ID of the epic. |
-| `iid` | ID! | Internal ID of the epic. |
-| `issues` | EpicIssueConnection | A list of issues associated with the epic. |
-| `labels` | LabelConnection | Labels assigned to the epic. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `parent` | Epic | Parent epic of the epic. |
-| `participants` | UserConnection | List of participants for the epic. |
-| `reference` | String! | Internal reference of the epic. Returned in shortened format by default. |
-| `relationPath` | String | URI path of the epic-issue relationship. |
-| `relativePosition` | Int | The relative position of the epic in the epic tree. |
-| `startDate` | Time | Start date of the epic. |
-| `startDateFixed` | Time | Fixed start date of the epic. |
-| `startDateFromMilestones` | Time | Inherited start date of the epic from milestones. |
-| `startDateIsFixed` | Boolean | Indicates if the start date has been manually set. |
-| `state` | EpicState! | State of the epic. |
-| `subscribed` | Boolean! | Indicates the currently logged in user is subscribed to the epic. |
-| `title` | String | Title of the epic. |
-| `updatedAt` | Time | Timestamp of when the epic was updated. |
-| `upvotes` | Int! | Number of upvotes the epic has received. |
-| `userDiscussionsCount` | Int! | Number of user discussions in the epic. |
-| `userNotesCount` | Int! | Number of user notes of the epic. |
-| `userPermissions` | EpicPermissions! | Permissions for the current user on the resource |
-| `userPreferences` | BoardEpicUserPreferences | User preferences for the epic on the issue board. |
-| `webPath` | String! | Web path of the epic. |
-| `webUrl` | String! | Web URL of the epic. |
-
-### BoardEpicUserPreferences
+| `author` | [`User!`](#user) | Author of the epic. |
+| `awardEmoji` | [`AwardEmojiConnection`](#awardemojiconnection) | A list of award emojis associated with the epic. |
+| `children` | [`EpicConnection`](#epicconnection) | Children (sub-epics) of the epic. |
+| `closedAt` | [`Time`](#time) | Timestamp of when the epic was closed. |
+| `confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
+| `createdAt` | [`Time`](#time) | Timestamp of when the epic was created. |
+| `currentUserTodos` | [`TodoConnection!`](#todoconnection) | To-do items for the current user. |
+| `descendantCounts` | [`EpicDescendantCount`](#epicdescendantcount) | Number of open and closed descendant epics and issues. |
+| `descendantWeightSum` | [`EpicDescendantWeights`](#epicdescendantweights) | Total weight of open and closed issues in the epic and its descendants. |
+| `description` | [`String`](#string) | Description of the epic. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `downvotes` | [`Int!`](#int) | Number of downvotes the epic has received. |
+| `dueDate` | [`Time`](#time) | Due date of the epic. |
+| `dueDateFixed` | [`Time`](#time) | Fixed due date of the epic. |
+| `dueDateFromMilestones` | [`Time`](#time) | Inherited due date of the epic from milestones. |
+| `dueDateIsFixed` | [`Boolean`](#boolean) | Indicates if the due date has been manually set. |
+| `events` | [`EventConnection`](#eventconnection) | A list of events associated with the object. |
+| `group` | [`Group!`](#group) | Group to which the epic belongs. |
+| `hasChildren` | [`Boolean!`](#boolean) | Indicates if the epic has children. |
+| `hasIssues` | [`Boolean!`](#boolean) | Indicates if the epic has direct issues. |
+| `hasParent` | [`Boolean!`](#boolean) | Indicates if the epic has a parent epic. |
+| `healthStatus` | [`EpicHealthStatus`](#epichealthstatus) | Current health status of the epic. |
+| `id` | [`ID!`](#id) | ID of the epic. |
+| `iid` | [`ID!`](#id) | Internal ID of the epic. |
+| `issues` | [`EpicIssueConnection`](#epicissueconnection) | A list of issues associated with the epic. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels assigned to the epic. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `parent` | [`Epic`](#epic) | Parent epic of the epic. |
+| `participants` | [`UserConnection`](#userconnection) | List of participants for the epic. |
+| `reference` | [`String!`](#string) | Internal reference of the epic. Returned in shortened format by default. |
+| `relationPath` | [`String`](#string) | URI path of the epic-issue relationship. |
+| `relativePosition` | [`Int`](#int) | The relative position of the epic in the epic tree. |
+| `startDate` | [`Time`](#time) | Start date of the epic. |
+| `startDateFixed` | [`Time`](#time) | Fixed start date of the epic. |
+| `startDateFromMilestones` | [`Time`](#time) | Inherited start date of the epic from milestones. |
+| `startDateIsFixed` | [`Boolean`](#boolean) | Indicates if the start date has been manually set. |
+| `state` | [`EpicState!`](#epicstate) | State of the epic. |
+| `subscribed` | [`Boolean!`](#boolean) | Indicates the currently logged in user is subscribed to the epic. |
+| `title` | [`String`](#string) | Title of the epic. |
+| `updatedAt` | [`Time`](#time) | Timestamp of when the epic was updated. |
+| `upvotes` | [`Int!`](#int) | Number of upvotes the epic has received. |
+| `userDiscussionsCount` | [`Int!`](#int) | Number of user discussions in the epic. |
+| `userNotesCount` | [`Int!`](#int) | Number of user notes of the epic. |
+| `userPermissions` | [`EpicPermissions!`](#epicpermissions) | Permissions for the current user on the resource |
+| `userPreferences` | [`BoardEpicUserPreferences`](#boardepicuserpreferences) | User preferences for the epic on the issue board. |
+| `webPath` | [`String!`](#string) | Web path of the epic. |
+| `webUrl` | [`String!`](#string) | Web URL of the epic. |
+
+### `BoardEpicConnection`
+
+The connection type for BoardEpic.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[BoardEpicEdge]`](#boardepicedge) | A list of edges. |
+| `nodes` | [`[BoardEpic]`](#boardepic) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `BoardEpicEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`BoardEpic`](#boardepic) | The item at the end of the edge. |
+
+### `BoardEpicUserPreferences`
Represents user preferences for a board epic.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `collapsed` | Boolean! | Indicates epic should be displayed as collapsed. |
+| `collapsed` | [`Boolean!`](#boolean) | Indicates epic should be displayed as collapsed. |
-### BoardList
+### `BoardList`
Represents a list for an issue board.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `assignee` | User | Assignee in the list. |
-| `collapsed` | Boolean | Indicates if list is collapsed for this user. |
-| `id` | ID! | ID (global ID) of the list. |
-| `issues` | IssueConnection | Board issues. |
-| `issuesCount` | Int | Count of issues in the list. |
-| `iteration` | Iteration | Iteration of the list. |
-| `label` | Label | Label of the list. |
-| `limitMetric` | ListLimitMetric | The current limit metric for the list. |
-| `listType` | String! | Type of the list. |
-| `maxIssueCount` | Int | Maximum number of issues in the list. |
-| `maxIssueWeight` | Int | Maximum weight of issues in the list. |
-| `milestone` | Milestone | Milestone of the list. |
-| `position` | Int | Position of list within the board. |
-| `title` | String! | Title of the list. |
-| `totalWeight` | Int | Total weight of all issues in the list. |
+| `assignee` | [`User`](#user) | Assignee in the list. |
+| `collapsed` | [`Boolean`](#boolean) | Indicates if the list is collapsed for this user. |
+| `id` | [`ID!`](#id) | ID (global ID) of the list. |
+| `issues` | [`IssueConnection`](#issueconnection) | Board issues. |
+| `issuesCount` | [`Int`](#int) | Count of issues in the list. |
+| `iteration` | [`Iteration`](#iteration) | Iteration of the list. |
+| `label` | [`Label`](#label) | Label of the list. |
+| `limitMetric` | [`ListLimitMetric`](#listlimitmetric) | The current limit metric for the list. |
+| `listType` | [`String!`](#string) | Type of the list. |
+| `maxIssueCount` | [`Int`](#int) | Maximum number of issues in the list. |
+| `maxIssueWeight` | [`Int`](#int) | Maximum weight of issues in the list. |
+| `milestone` | [`Milestone`](#milestone) | Milestone of the list. |
+| `position` | [`Int`](#int) | Position of list within the board. |
+| `title` | [`String!`](#string) | Title of the list. |
+| `totalWeight` | [`Int`](#int) | Total weight of all issues in the list. |
+
+### `BoardListConnection`
+
+The connection type for BoardList.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[BoardListEdge]`](#boardlistedge) | A list of edges. |
+| `nodes` | [`[BoardList]`](#boardlist) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### BoardListCreatePayload
+### `BoardListCreatePayload`
Autogenerated return type of BoardListCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `list` | BoardList | Issue list in the issue board. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `list` | [`BoardList`](#boardlist) | Issue list in the issue board. |
-### BoardListUpdateLimitMetricsPayload
+### `BoardListEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`BoardList`](#boardlist) | The item at the end of the edge. |
+
+### `BoardListUpdateLimitMetricsPayload`
Autogenerated return type of BoardListUpdateLimitMetrics.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `list` | BoardList | The updated list. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `list` | [`BoardList`](#boardlist) | The updated list. |
+
+### `Branch`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `commit` | [`Commit`](#commit) | Commit for the branch. |
+| `name` | [`String!`](#string) | Name of the branch. |
-### Branch
+### `BulkFindOrCreateDevopsAdoptionSegmentsPayload`
+
+Autogenerated return type of BulkFindOrCreateDevopsAdoptionSegments.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `commit` | Commit | Commit for the branch. |
-| `name` | String! | Name of the branch. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `segments` | [`[DevopsAdoptionSegment!]`](#devopsadoptionsegment) | Created segments after mutation. |
-### BurnupChartDailyTotals
+### `BurnupChartDailyTotals`
Represents the total number of issues and their weights for a particular day.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `completedCount` | Int! | Number of closed issues as of this day. |
-| `completedWeight` | Int! | Total weight of closed issues as of this day. |
-| `date` | ISO8601Date! | Date for burnup totals. |
-| `scopeCount` | Int! | Number of issues as of this day. |
-| `scopeWeight` | Int! | Total weight of issues as of this day. |
+| `completedCount` | [`Int!`](#int) | Number of closed issues as of this day. |
+| `completedWeight` | [`Int!`](#int) | Total weight of closed issues as of this day. |
+| `date` | [`ISO8601Date!`](#iso8601date) | Date for burnup totals. |
+| `scopeCount` | [`Int!`](#int) | Number of issues as of this day. |
+| `scopeWeight` | [`Int!`](#int) | Total weight of issues as of this day. |
+
+### `CiApplicationSettings`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `keepLatestArtifact` | [`Boolean`](#boolean) | Whether to keep the latest jobs artifacts. |
-### CiApplicationSettings
+### `CiBuildNeed`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `keepLatestArtifact` | Boolean | Whether to keep the latest jobs artifacts. |
+| `name` | [`String`](#string) | Name of the job we need to complete. |
+
+### `CiBuildNeedConnection`
-### CiBuildNeed
+The connection type for CiBuildNeed.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `name` | String | Name of the job we need to complete. |
+| `edges` | [`[CiBuildNeedEdge]`](#cibuildneededge) | A list of edges. |
+| `nodes` | [`[CiBuildNeed]`](#cibuildneed) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### CiCdSettingsUpdatePayload
+### `CiBuildNeedEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiBuildNeed`](#cibuildneed) | The item at the end of the edge. |
+
+### `CiCdSettingsUpdatePayload`
Autogenerated return type of CiCdSettingsUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `CiConfig`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `errors` | [`[String!]`](#string) | Linting errors. |
+| `mergedYaml` | [`String`](#string) | Merged CI configuration YAML. |
+| `stages` | [`CiConfigStageConnection`](#ciconfigstageconnection) | Stages of the pipeline. |
+| `status` | [`CiConfigStatus`](#ciconfigstatus) | Status of linting, can be either valid or invalid. |
+
+### `CiConfigGroup`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `jobs` | [`CiConfigJobConnection`](#ciconfigjobconnection) | Jobs in group. |
+| `name` | [`String`](#string) | Name of the job group. |
+| `size` | [`Int`](#int) | Size of the job group. |
+
+### `CiConfigGroupConnection`
+
+The connection type for CiConfigGroup.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CiConfigGroupEdge]`](#ciconfiggroupedge) | A list of edges. |
+| `nodes` | [`[CiConfigGroup]`](#ciconfiggroup) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CiConfigGroupEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiConfigGroup`](#ciconfiggroup) | The item at the end of the edge. |
-### CiConfig
+### `CiConfigJob`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `errors` | String! => Array | Linting errors. |
-| `mergedYaml` | String | Merged CI configuration YAML. |
-| `stages` | CiConfigStageConnection | Stages of the pipeline. |
-| `status` | CiConfigStatus | Status of linting, can be either valid or invalid. |
+| `afterScript` | [`[String!]`](#string) | Override a set of commands that are executed after the job. |
+| `allowFailure` | [`Boolean`](#boolean) | Allow job to fail. |
+| `beforeScript` | [`[String!]`](#string) | Override a set of commands that are executed before the job. |
+| `environment` | [`String`](#string) | Name of an environment to which the job deploys. |
+| `except` | [`CiConfigJobRestriction`](#ciconfigjobrestriction) | Limit when jobs are not created. |
+| `groupName` | [`String`](#string) | Name of the job group. |
+| `name` | [`String`](#string) | Name of the job. |
+| `needs` | [`CiConfigNeedConnection`](#ciconfigneedconnection) | Builds that must complete before the jobs run. |
+| `only` | [`CiConfigJobRestriction`](#ciconfigjobrestriction) | Jobs are created when these conditions do not apply. |
+| `script` | [`[String!]`](#string) | Shell script that is executed by a runner. |
+| `stage` | [`String`](#string) | Name of the job stage. |
+| `tags` | [`[String!]`](#string) | List of tags that are used to select a runner. |
+| `when` | [`String`](#string) | When to run the job. |
-### CiConfigGroup
+### `CiConfigJobConnection`
+
+The connection type for CiConfigJob.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CiConfigJobEdge]`](#ciconfigjobedge) | A list of edges. |
+| `nodes` | [`[CiConfigJob]`](#ciconfigjob) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CiConfigJobEdge`
+
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `jobs` | CiConfigJobConnection | Jobs in group. |
-| `name` | String | Name of the job group. |
-| `size` | Int | Size of the job group. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiConfigJob`](#ciconfigjob) | The item at the end of the edge. |
-### CiConfigJob
+### `CiConfigJobRestriction`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `afterScript` | String! => Array | Override a set of commands that are executed after the job. |
-| `allowFailure` | Boolean | Allow job to fail. |
-| `beforeScript` | String! => Array | Override a set of commands that are executed before the job. |
-| `environment` | String | Name of an environment to which the job deploys. |
-| `except` | CiConfigJobRestriction | Limit when jobs are not created. |
-| `groupName` | String | Name of the job group. |
-| `name` | String | Name of the job. |
-| `needs` | CiConfigNeedConnection | Builds that must complete before the jobs run. |
-| `only` | CiConfigJobRestriction | Jobs are created when these conditions do not apply. |
-| `script` | String! => Array | Shell script that is executed by a runner. |
-| `stage` | String | Name of the job stage. |
-| `tags` | String! => Array | List of tags that are used to select a runner. |
-| `when` | String | When to run the job. |
+| `refs` | [`[String!]`](#string) | The Git refs the job restriction applies to. |
-### CiConfigJobRestriction
+### `CiConfigNeed`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `refs` | String! => Array | The Git refs the job restriction applies to. |
+| `name` | [`String`](#string) | Name of the need. |
-### CiConfigNeed
+### `CiConfigNeedConnection`
+
+The connection type for CiConfigNeed.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `name` | String | Name of the need. |
+| `edges` | [`[CiConfigNeedEdge]`](#ciconfigneededge) | A list of edges. |
+| `nodes` | [`[CiConfigNeed]`](#ciconfigneed) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CiConfigNeedEdge`
-### CiConfigStage
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `groups` | CiConfigGroupConnection | Groups of jobs for the stage. |
-| `name` | String | Name of the stage. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiConfigNeed`](#ciconfigneed) | The item at the end of the edge. |
-### CiGroup
+### `CiConfigStage`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `detailedStatus` | DetailedStatus | Detailed status of the group. |
-| `jobs` | CiJobConnection | Jobs in group. |
-| `name` | String | Name of the job group. |
-| `size` | Int | Size of the group. |
+| `groups` | [`CiConfigGroupConnection`](#ciconfiggroupconnection) | Groups of jobs for the stage. |
+| `name` | [`String`](#string) | Name of the stage. |
+
+### `CiConfigStageConnection`
-### CiJob
+The connection type for CiConfigStage.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `artifacts` | CiJobArtifactConnection | Artifacts generated by the job. |
-| `detailedStatus` | DetailedStatus | Detailed status of the job. |
-| `name` | String | Name of the job. |
-| `needs` | CiBuildNeedConnection | References to builds that must complete before the jobs run. |
-| `pipeline` | Pipeline | Pipeline the job belongs to. |
-| `scheduledAt` | Time | Schedule for the build. |
+| `edges` | [`[CiConfigStageEdge]`](#ciconfigstageedge) | A list of edges. |
+| `nodes` | [`[CiConfigStage]`](#ciconfigstage) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### CiJobArtifact
+### `CiConfigStageEdge`
+
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `downloadPath` | String | URL for downloading the artifact's file. |
-| `fileType` | JobArtifactFileType | File type of the artifact. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiConfigStage`](#ciconfigstage) | The item at the end of the edge. |
-### CiStage
+### `CiGroup`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `detailedStatus` | DetailedStatus | Detailed status of the stage. |
-| `groups` | CiGroupConnection | Group of jobs for the stage. |
-| `name` | String | Name of the stage. |
+| `detailedStatus` | [`DetailedStatus`](#detailedstatus) | Detailed status of the group. |
+| `jobs` | [`CiJobConnection`](#cijobconnection) | Jobs in group. |
+| `name` | [`String`](#string) | Name of the job group. |
+| `size` | [`Int`](#int) | Size of the group. |
+
+### `CiGroupConnection`
-### ClusterAgent
+The connection type for CiGroup.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time | Timestamp the cluster agent was created. |
-| `createdByUser` | User | User object, containing information about the person who created the agent. |
-| `id` | ID! | ID of the cluster agent. |
-| `name` | String | Name of the cluster agent. |
-| `project` | Project | The project this cluster agent is associated with. |
-| `tokens` | ClusterAgentTokenConnection | Tokens associated with the cluster agent. |
-| `updatedAt` | Time | Timestamp the cluster agent was updated. |
+| `edges` | [`[CiGroupEdge]`](#cigroupedge) | A list of edges. |
+| `nodes` | [`[CiGroup]`](#cigroup) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CiGroupEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiGroup`](#cigroup) | The item at the end of the edge. |
+
+### `CiJob`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `artifacts` | [`CiJobArtifactConnection`](#cijobartifactconnection) | Artifacts generated by the job. |
+| `detailedStatus` | [`DetailedStatus`](#detailedstatus) | Detailed status of the job. |
+| `duration` | [`Int`](#int) | Duration of the job in seconds. |
+| `finishedAt` | [`Time`](#time) | When a job has finished running. |
+| `name` | [`String`](#string) | Name of the job. |
+| `needs` | [`CiBuildNeedConnection`](#cibuildneedconnection) | References to builds that must complete before the jobs run. |
+| `pipeline` | [`Pipeline`](#pipeline) | Pipeline the job belongs to. |
+| `scheduledAt` | [`Time`](#time) | Schedule for the build. |
+
+### `CiJobArtifact`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `downloadPath` | [`String`](#string) | URL for downloading the artifact's file. |
+| `fileType` | [`JobArtifactFileType`](#jobartifactfiletype) | File type of the artifact. |
+
+### `CiJobArtifactConnection`
+
+The connection type for CiJobArtifact.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CiJobArtifactEdge]`](#cijobartifactedge) | A list of edges. |
+| `nodes` | [`[CiJobArtifact]`](#cijobartifact) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CiJobArtifactEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiJobArtifact`](#cijobartifact) | The item at the end of the edge. |
+
+### `CiJobConnection`
-### ClusterAgentDeletePayload
+The connection type for CiJob.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CiJobEdge]`](#cijobedge) | A list of edges. |
+| `nodes` | [`[CiJob]`](#cijob) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CiJobEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiJob`](#cijob) | The item at the end of the edge. |
+
+### `CiStage`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `detailedStatus` | [`DetailedStatus`](#detailedstatus) | Detailed status of the stage. |
+| `groups` | [`CiGroupConnection`](#cigroupconnection) | Group of jobs for the stage. |
+| `name` | [`String`](#string) | Name of the stage. |
+
+### `CiStageConnection`
+
+The connection type for CiStage.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CiStageEdge]`](#cistageedge) | A list of edges. |
+| `nodes` | [`[CiStage]`](#cistage) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CiStageEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CiStage`](#cistage) | The item at the end of the edge. |
+
+### `ClusterAgent`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `createdAt` | [`Time`](#time) | Timestamp the cluster agent was created. |
+| `createdByUser` | [`User`](#user) | User object, containing information about the person who created the agent. |
+| `id` | [`ID!`](#id) | ID of the cluster agent. |
+| `name` | [`String`](#string) | Name of the cluster agent. |
+| `project` | [`Project`](#project) | The project this cluster agent is associated with. |
+| `tokens` | [`ClusterAgentTokenConnection`](#clusteragenttokenconnection) | Tokens associated with the cluster agent. |
+| `updatedAt` | [`Time`](#time) | Timestamp the cluster agent was updated. |
+| `webPath` | [`String`](#string) | Web path of the cluster agent. |
+
+### `ClusterAgentConnection`
+
+The connection type for ClusterAgent.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[ClusterAgentEdge]`](#clusteragentedge) | A list of edges. |
+| `nodes` | [`[ClusterAgent]`](#clusteragent) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ClusterAgentDeletePayload`
Autogenerated return type of ClusterAgentDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `ClusterAgentEdge`
-### ClusterAgentToken
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clusterAgent` | ClusterAgent | Cluster agent this token is associated with. |
-| `createdAt` | Time | Timestamp the token was created. |
-| `createdByUser` | User | The user who created the token. |
-| `id` | ClustersAgentTokenID! | Global ID of the token. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ClusterAgent`](#clusteragent) | The item at the end of the edge. |
-### ClusterAgentTokenCreatePayload
+### `ClusterAgentToken`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clusterAgent` | [`ClusterAgent`](#clusteragent) | Cluster agent this token is associated with. |
+| `createdAt` | [`Time`](#time) | Timestamp the token was created. |
+| `createdByUser` | [`User`](#user) | The user who created the token. |
+| `description` | [`String`](#string) | Description of the token. |
+| `id` | [`ClustersAgentTokenID!`](#clustersagenttokenid) | Global ID of the token. |
+| `name` | [`String`](#string) | Name given to the token. |
+
+### `ClusterAgentTokenConnection`
+
+The connection type for ClusterAgentToken.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[ClusterAgentTokenEdge]`](#clusteragenttokenedge) | A list of edges. |
+| `nodes` | [`[ClusterAgentToken]`](#clusteragenttoken) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ClusterAgentTokenCreatePayload`
Autogenerated return type of ClusterAgentTokenCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `secret` | String | Token secret value. Make sure you save it - you won't be able to access it again. |
-| `token` | ClusterAgentToken | Token created after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `secret` | [`String`](#string) | Token secret value. Make sure you save it - you won't be able to access it again. |
+| `token` | [`ClusterAgentToken`](#clusteragenttoken) | Token created after mutation. |
-### ClusterAgentTokenDeletePayload
+### `ClusterAgentTokenDeletePayload`
Autogenerated return type of ClusterAgentTokenDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `ClusterAgentTokenEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ClusterAgentToken`](#clusteragenttoken) | The item at the end of the edge. |
-### CodeCoverageActivity
+### `CodeCoverageActivity`
Represents the code coverage activity for a group.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `averageCoverage` | Float | Average percentage of the different code coverage results available for the group. |
-| `coverageCount` | Int | Number of different code coverage results available for the group. |
-| `date` | Date! | Date when the code coverage was created. |
-| `projectCount` | Int | Number of projects with code coverage results for the group. |
+| `averageCoverage` | [`Float`](#float) | Average percentage of the different code coverage results available for the group. |
+| `coverageCount` | [`Int`](#int) | Number of different code coverage results available for the group. |
+| `date` | [`Date!`](#date) | Date when the code coverage was created. |
+| `projectCount` | [`Int`](#int) | Number of projects with code coverage results for the group. |
-### CodeCoverageSummary
+### `CodeCoverageActivityConnection`
+
+The connection type for CodeCoverageActivity.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CodeCoverageActivityEdge]`](#codecoverageactivityedge) | A list of edges. |
+| `nodes` | [`[CodeCoverageActivity]`](#codecoverageactivity) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CodeCoverageActivityEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CodeCoverageActivity`](#codecoverageactivity) | The item at the end of the edge. |
+
+### `CodeCoverageSummary`
Represents the code coverage summary for a project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `averageCoverage` | Float | Average percentage of the different code coverage results available for the project. |
-| `coverageCount` | Int | Number of different code coverage results available. |
-| `lastUpdatedOn` | Date | Latest date when the code coverage was created for the project. |
+| `averageCoverage` | [`Float`](#float) | Average percentage of the different code coverage results available for the project. |
+| `coverageCount` | [`Int`](#int) | Number of different code coverage results available. |
+| `lastUpdatedOn` | [`Date`](#date) | Latest date when the code coverage was created for the project. |
-### Commit
+### `Commit`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `author` | User | Author of the commit. |
-| `authorGravatar` | String | Commit authors gravatar. |
-| `authorName` | String | Commit authors name. |
-| `authoredDate` | Time | Timestamp of when the commit was authored. |
-| `description` | String | Description of the commit message. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `id` | ID! | ID (global ID) of the commit. |
-| `message` | String | Raw commit message. |
-| `pipelines` | PipelineConnection | Pipelines of the commit ordered latest first. |
-| `sha` | String! | SHA1 ID of the commit. |
-| `shortId` | String! | Short SHA1 ID of the commit. |
-| `signatureHtml` | String | Rendered HTML of the commit signature. |
-| `title` | String | Title of the commit message. |
-| `titleHtml` | String | The GitLab Flavored Markdown rendering of `title` |
-| `webPath` | String! | Web path of the commit. |
-| `webUrl` | String! | Web URL of the commit. |
+| `author` | [`User`](#user) | Author of the commit. |
+| `authorGravatar` | [`String`](#string) | Commit authors gravatar. |
+| `authorName` | [`String`](#string) | Commit authors name. |
+| `authoredDate` | [`Time`](#time) | Timestamp of when the commit was authored. |
+| `description` | [`String`](#string) | Description of the commit message. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `id` | [`ID!`](#id) | ID (global ID) of the commit. |
+| `message` | [`String`](#string) | Raw commit message. |
+| `pipelines` | [`PipelineConnection`](#pipelineconnection) | Pipelines of the commit ordered latest first. |
+| `sha` | [`String!`](#string) | SHA1 ID of the commit. |
+| `shortId` | [`String!`](#string) | Short SHA1 ID of the commit. |
+| `signatureHtml` | [`String`](#string) | Rendered HTML of the commit signature. |
+| `title` | [`String`](#string) | Title of the commit message. |
+| `titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title` |
+| `webPath` | [`String!`](#string) | Web path of the commit. |
+| `webUrl` | [`String!`](#string) | Web URL of the commit. |
+
+### `CommitConnection`
-### CommitCreatePayload
+The connection type for Commit.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CommitEdge]`](#commitedge) | A list of edges. |
+| `nodes` | [`[Commit]`](#commit) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CommitCreatePayload`
Autogenerated return type of CommitCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `commit` | Commit | The commit after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `commit` | [`Commit`](#commit) | The commit after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### ComplianceFramework
+### `CommitEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Commit`](#commit) | The item at the end of the edge. |
+
+### `ComplianceFramework`
Represents a ComplianceFramework associated with a Project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `color` | String! | Hexadecimal representation of compliance framework's label color. |
-| `description` | String! | Description of the compliance framework. |
-| `id` | ID! | Compliance framework ID. |
-| `name` | String! | Name of the compliance framework. |
-| `pipelineConfigurationFullPath` | String | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`. |
+| `color` | [`String!`](#string) | Hexadecimal representation of compliance framework's label color. |
+| `description` | [`String!`](#string) | Description of the compliance framework. |
+| `id` | [`ID!`](#id) | Compliance framework ID. |
+| `name` | [`String!`](#string) | Name of the compliance framework. |
+| `pipelineConfigurationFullPath` | [`String`](#string) | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hipaa` **(ULTIMATE)**. |
+
+### `ComplianceFrameworkConnection`
+
+The connection type for ComplianceFramework.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ComplianceFrameworkEdge]`](#complianceframeworkedge) | A list of edges. |
+| `nodes` | [`[ComplianceFramework]`](#complianceframework) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ComplianceFrameworkEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ComplianceFramework`](#complianceframework) | The item at the end of the edge. |
-### ComposerMetadata
+### `ComposerMetadata`
Composer metadata.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `composerJson` | PackageComposerJsonType! | Data of the Composer JSON file. |
-| `targetSha` | String! | Target SHA of the package. |
+| `composerJson` | [`PackageComposerJsonType!`](#packagecomposerjsontype) | Data of the Composer JSON file. |
+| `targetSha` | [`String!`](#string) | Target SHA of the package. |
-### ConfigureSastPayload
+### `ConfigureSastPayload`
Autogenerated return type of ConfigureSast.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `status` | String! | Status of creating the commit for the supplied SAST CI configuration. |
-| `successPath` | String | Redirect path to use when the response is successful. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `status` | [`String!`](#string) | Status of creating the commit for the supplied SAST CI configuration. |
+| `successPath` | [`String`](#string) | Redirect path to use when the response is successful. |
-### ContainerExpirationPolicy
+### `ContainerExpirationPolicy`
A tag expiration policy designed to keep only the images that matter most.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `cadence` | ContainerExpirationPolicyCadenceEnum! | This container expiration policy schedule. |
-| `createdAt` | Time! | Timestamp of when the container expiration policy was created. |
-| `enabled` | Boolean! | Indicates whether this container expiration policy is enabled. |
-| `keepN` | ContainerExpirationPolicyKeepEnum | Number of tags to retain. |
-| `nameRegex` | UntrustedRegexp | Tags with names matching this regex pattern will expire. |
-| `nameRegexKeep` | UntrustedRegexp | Tags with names matching this regex pattern will be preserved. |
-| `nextRunAt` | Time | Next time that this container expiration policy will get executed. |
-| `olderThan` | ContainerExpirationPolicyOlderThanEnum | Tags older that this will expire. |
-| `updatedAt` | Time! | Timestamp of when the container expiration policy was updated. |
+| `cadence` | [`ContainerExpirationPolicyCadenceEnum!`](#containerexpirationpolicycadenceenum) | This container expiration policy schedule. |
+| `createdAt` | [`Time!`](#time) | Timestamp of when the container expiration policy was created. |
+| `enabled` | [`Boolean!`](#boolean) | Indicates whether this container expiration policy is enabled. |
+| `keepN` | [`ContainerExpirationPolicyKeepEnum`](#containerexpirationpolicykeepenum) | Number of tags to retain. |
+| `nameRegex` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching this regex pattern will expire. |
+| `nameRegexKeep` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching this regex pattern will be preserved. |
+| `nextRunAt` | [`Time`](#time) | Next time that this container expiration policy will get executed. |
+| `olderThan` | [`ContainerExpirationPolicyOlderThanEnum`](#containerexpirationpolicyolderthanenum) | Tags older that this will expire. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of when the container expiration policy was updated. |
-### ContainerRepository
+### `ContainerRepository`
A container repository.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `canDelete` | Boolean! | Can the current user delete the container repository. |
-| `createdAt` | Time! | Timestamp when the container repository was created. |
-| `expirationPolicyCleanupStatus` | ContainerRepositoryCleanupStatus | The tags cleanup status for the container repository. |
-| `expirationPolicyStartedAt` | Time | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
-| `id` | ID! | ID of the container repository. |
-| `location` | String! | URL of the container repository. |
-| `name` | String! | Name of the container repository. |
-| `path` | String! | Path of the container repository. |
-| `project` | Project! | Project of the container registry. |
-| `status` | ContainerRepositoryStatus | Status of the container repository. |
-| `tagsCount` | Int! | Number of tags associated with this image. |
-| `updatedAt` | Time! | Timestamp when the container repository was updated. |
+| `canDelete` | [`Boolean!`](#boolean) | Can the current user delete the container repository. |
+| `createdAt` | [`Time!`](#time) | Timestamp when the container repository was created. |
+| `expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | The tags cleanup status for the container repository. |
+| `expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
+| `id` | [`ID!`](#id) | ID of the container repository. |
+| `location` | [`String!`](#string) | URL of the container repository. |
+| `name` | [`String!`](#string) | Name of the container repository. |
+| `path` | [`String!`](#string) | Path of the container repository. |
+| `project` | [`Project!`](#project) | Project of the container registry. |
+| `status` | [`ContainerRepositoryStatus`](#containerrepositorystatus) | Status of the container repository. |
+| `tagsCount` | [`Int!`](#int) | Number of tags associated with this image. |
+| `updatedAt` | [`Time!`](#time) | Timestamp when the container repository was updated. |
+
+### `ContainerRepositoryConnection`
+
+The connection type for ContainerRepository.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ContainerRepositoryEdge]`](#containerrepositoryedge) | A list of edges. |
+| `nodes` | [`[ContainerRepository]`](#containerrepository) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### ContainerRepositoryDetails
+### `ContainerRepositoryDetails`
Details of a container repository.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `canDelete` | Boolean! | Can the current user delete the container repository. |
-| `createdAt` | Time! | Timestamp when the container repository was created. |
-| `expirationPolicyCleanupStatus` | ContainerRepositoryCleanupStatus | The tags cleanup status for the container repository. |
-| `expirationPolicyStartedAt` | Time | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
-| `id` | ID! | ID of the container repository. |
-| `location` | String! | URL of the container repository. |
-| `name` | String! | Name of the container repository. |
-| `path` | String! | Path of the container repository. |
-| `project` | Project! | Project of the container registry. |
-| `status` | ContainerRepositoryStatus | Status of the container repository. |
-| `tags` | ContainerRepositoryTagConnection | Tags of the container repository. |
-| `tagsCount` | Int! | Number of tags associated with this image. |
-| `updatedAt` | Time! | Timestamp when the container repository was updated. |
+| `canDelete` | [`Boolean!`](#boolean) | Can the current user delete the container repository. |
+| `createdAt` | [`Time!`](#time) | Timestamp when the container repository was created. |
+| `expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | The tags cleanup status for the container repository. |
+| `expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
+| `id` | [`ID!`](#id) | ID of the container repository. |
+| `location` | [`String!`](#string) | URL of the container repository. |
+| `name` | [`String!`](#string) | Name of the container repository. |
+| `path` | [`String!`](#string) | Path of the container repository. |
+| `project` | [`Project!`](#project) | Project of the container registry. |
+| `status` | [`ContainerRepositoryStatus`](#containerrepositorystatus) | Status of the container repository. |
+| `tags` | [`ContainerRepositoryTagConnection`](#containerrepositorytagconnection) | Tags of the container repository. |
+| `tagsCount` | [`Int!`](#int) | Number of tags associated with this image. |
+| `updatedAt` | [`Time!`](#time) | Timestamp when the container repository was updated. |
-### ContainerRepositoryTag
+### `ContainerRepositoryEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ContainerRepository`](#containerrepository) | The item at the end of the edge. |
+
+### `ContainerRepositoryTag`
A tag from a container repository.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `canDelete` | Boolean! | Can the current user delete this tag. |
-| `createdAt` | Time | Timestamp when the tag was created. |
-| `digest` | String | Digest of the tag. |
-| `location` | String! | URL of the tag. |
-| `name` | String! | Name of the tag. |
-| `path` | String! | Path of the tag. |
-| `revision` | String | Revision of the tag. |
-| `shortRevision` | String | Short revision of the tag. |
-| `totalSize` | BigInt | The size of the tag. |
+| `canDelete` | [`Boolean!`](#boolean) | Can the current user delete this tag. |
+| `createdAt` | [`Time`](#time) | Timestamp when the tag was created. |
+| `digest` | [`String`](#string) | Digest of the tag. |
+| `location` | [`String!`](#string) | URL of the tag. |
+| `name` | [`String!`](#string) | Name of the tag. |
+| `path` | [`String!`](#string) | Path of the tag. |
+| `revision` | [`String`](#string) | Revision of the tag. |
+| `shortRevision` | [`String`](#string) | Short revision of the tag. |
+| `totalSize` | [`BigInt`](#bigint) | The size of the tag. |
+
+### `ContainerRepositoryTagConnection`
+
+The connection type for ContainerRepositoryTag.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ContainerRepositoryTagEdge]`](#containerrepositorytagedge) | A list of edges. |
+| `nodes` | [`[ContainerRepositoryTag]`](#containerrepositorytag) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ContainerRepositoryTagEdge`
-### CreateAlertIssuePayload
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ContainerRepositoryTag`](#containerrepositorytag) | The item at the end of the edge. |
+
+### `CreateAlertIssuePayload`
Autogenerated return type of CreateAlertIssue.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `alert` | AlertManagementAlert | The alert after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue created after mutation. |
-| `todo` | Todo | The to-do item after mutation. |
+| `alert` | [`AlertManagementAlert`](#alertmanagementalert) | The alert after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue created after mutation. |
+| `todo` | [`Todo`](#todo) | The to-do item after mutation. |
-### CreateAnnotationPayload
+### `CreateAnnotationPayload`
Autogenerated return type of CreateAnnotation.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `annotation` | MetricsDashboardAnnotation | The created annotation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `annotation` | [`MetricsDashboardAnnotation`](#metricsdashboardannotation) | The created annotation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### CreateBoardPayload
+### `CreateBoardPayload`
Autogenerated return type of CreateBoard.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `board` | Board | The board after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `board` | [`Board`](#board) | The board after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### CreateBranchPayload
+### `CreateBranchPayload`
Autogenerated return type of CreateBranch.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `branch` | Branch | Branch after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `branch` | [`Branch`](#branch) | Branch after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### CreateClusterAgentPayload
+### `CreateClusterAgentPayload`
Autogenerated return type of CreateClusterAgent.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `clusterAgent` | ClusterAgent | Cluster agent created after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `clusterAgent` | [`ClusterAgent`](#clusteragent) | Cluster agent created after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### CreateComplianceFrameworkPayload
+### `CreateComplianceFrameworkPayload`
Autogenerated return type of CreateComplianceFramework.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `framework` | ComplianceFramework | The created compliance framework. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `framework` | [`ComplianceFramework`](#complianceframework) | The created compliance framework. |
-### CreateCustomEmojiPayload
+### `CreateCustomEmojiPayload`
Autogenerated return type of CreateCustomEmoji.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `customEmoji` | CustomEmoji | The new custom emoji. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `customEmoji` | [`CustomEmoji`](#customemoji) | The new custom emoji. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### CreateDevopsAdoptionSegmentPayload
+### `CreateDevopsAdoptionSegmentPayload`
Autogenerated return type of CreateDevopsAdoptionSegment.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `segment` | DevopsAdoptionSegment | The segment after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `segment` | [`DevopsAdoptionSegment`](#devopsadoptionsegment) | The segment after mutation. |
-### CreateDiffNotePayload
+### `CreateDiffNotePayload`
Autogenerated return type of CreateDiffNote.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `note` | Note | The note after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `note` | [`Note`](#note) | The note after mutation. |
-### CreateEpicPayload
+### `CreateEpicPayload`
Autogenerated return type of CreateEpic.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The created epic. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epic` | [`Epic`](#epic) | The created epic. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### CreateImageDiffNotePayload
+### `CreateImageDiffNotePayload`
Autogenerated return type of CreateImageDiffNote.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `note` | Note | The note after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `note` | [`Note`](#note) | The note after mutation. |
-### CreateIssuePayload
+### `CreateIssuePayload`
Autogenerated return type of CreateIssue.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### CreateIterationPayload
+### `CreateIterationPayload`
Autogenerated return type of CreateIteration.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `iteration` | Iteration | The created iteration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `iteration` | [`Iteration`](#iteration) | The created iteration. |
-### CreateNotePayload
+### `CreateNotePayload`
Autogenerated return type of CreateNote.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `note` | Note | The note after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `note` | [`Note`](#note) | The note after mutation. |
-### CreateRequirementPayload
+### `CreateRequirementPayload`
Autogenerated return type of CreateRequirement.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `requirement` | Requirement | Requirement after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `requirement` | [`Requirement`](#requirement) | Requirement after mutation. |
-### CreateSnippetPayload
+### `CreateSnippetPayload`
Autogenerated return type of CreateSnippet.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `captchaSiteKey` | String | The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `needsCaptchaResponse` | Boolean | Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
-| `snippet` | Snippet | The snippet after mutation. |
-| `spam` | Boolean | Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response. |
-| `spamLogId` | Int | The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+| `captchaSiteKey` | [`String`](#string) | The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `needsCaptchaResponse` | [`Boolean`](#boolean) | Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+| `snippet` | [`Snippet`](#snippet) | The snippet after mutation. |
+| `spam` | [`Boolean`](#boolean) | Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response. |
+| `spamLogId` | [`Int`](#int) | The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
-### CreateTestCasePayload
+### `CreateTestCasePayload`
Autogenerated return type of CreateTestCase.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `testCase` | Issue | The test case created. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `testCase` | [`Issue`](#issue) | The test case created. |
-### CustomEmoji
+### `CustomEmoji`
A custom emoji uploaded by user.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `external` | Boolean! | Whether the emoji is an external link. |
-| `id` | CustomEmojiID! | The ID of the emoji. |
-| `name` | String! | The name of the emoji. |
-| `url` | String! | The link to file of the emoji. |
+| `external` | [`Boolean!`](#boolean) | Whether the emoji is an external link. |
+| `id` | [`CustomEmojiID!`](#customemojiid) | The ID of the emoji. |
+| `name` | [`String!`](#string) | The name of the emoji. |
+| `url` | [`String!`](#string) | The link to file of the emoji. |
+
+### `CustomEmojiConnection`
+
+The connection type for CustomEmoji.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[CustomEmojiEdge]`](#customemojiedge) | A list of edges. |
+| `nodes` | [`[CustomEmoji]`](#customemoji) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `CustomEmojiEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`CustomEmoji`](#customemoji) | The item at the end of the edge. |
-### DastOnDemandScanCreatePayload
+### `DastOnDemandScanCreatePayload`
Autogenerated return type of DastOnDemandScanCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `pipelineUrl` | String | URL of the pipeline that was created. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `pipelineUrl` | [`String`](#string) | URL of the pipeline that was created. |
-### DastProfile
+### `DastProfile`
Represents a DAST Profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `dastScannerProfile` | DastScannerProfile | The associated scanner profile. |
-| `dastSiteProfile` | DastSiteProfile | The associated site profile. |
-| `description` | String | The description of the scan. |
-| `editPath` | String | Relative web path to the edit page of a profile. |
-| `id` | DastProfileID! | ID of the profile. |
-| `name` | String | The name of the profile. |
+| `branch` | [`DastProfileBranch`](#dastprofilebranch) | The associated branch. Will always return `null` if `dast_branch_selection` feature flag is disabled. |
+| `dastScannerProfile` | [`DastScannerProfile`](#dastscannerprofile) | The associated scanner profile. |
+| `dastSiteProfile` | [`DastSiteProfile`](#dastsiteprofile) | The associated site profile. |
+| `description` | [`String`](#string) | The description of the scan. |
+| `editPath` | [`String`](#string) | Relative web path to the edit page of a profile. |
+| `id` | [`DastProfileID!`](#dastprofileid) | ID of the profile. |
+| `name` | [`String`](#string) | The name of the profile. |
+
+### `DastProfileBranch`
+
+Represents a DAST Profile Branch.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `exists` | [`Boolean`](#boolean) | Indicates whether or not the branch exists. |
+| `name` | [`String`](#string) | The name of the branch. |
+
+### `DastProfileConnection`
+
+The connection type for DastProfile.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DastProfileEdge]`](#dastprofileedge) | A list of edges. |
+| `nodes` | [`[DastProfile]`](#dastprofile) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### DastProfileCreatePayload
+### `DastProfileCreatePayload`
Autogenerated return type of DastProfileCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `dastProfile` | DastProfile | The created profile. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `pipelineUrl` | String | The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `dastProfile` | [`DastProfile`](#dastprofile) | The created profile. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `pipelineUrl` | [`String`](#string) | The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`. |
-### DastProfileDeletePayload
+### `DastProfileDeletePayload`
Autogenerated return type of DastProfileDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DastProfileRunPayload
+### `DastProfileEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`DastProfile`](#dastprofile) | The item at the end of the edge. |
+
+### `DastProfileRunPayload`
Autogenerated return type of DastProfileRun.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `pipelineUrl` | String | URL of the pipeline that was created. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `pipelineUrl` | [`String`](#string) | URL of the pipeline that was created. |
-### DastProfileUpdatePayload
+### `DastProfileUpdatePayload`
Autogenerated return type of DastProfileUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `dastProfile` | DastProfile | The updated profile. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `pipelineUrl` | String | The URL of the pipeline that was created. Requires the input argument `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no pipeline will be created. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `dastProfile` | [`DastProfile`](#dastprofile) | The updated profile. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `pipelineUrl` | [`String`](#string) | The URL of the pipeline that was created. Requires the input argument `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no pipeline will be created. |
-### DastScannerProfile
+### `DastScannerProfile`
Represents a DAST scanner profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `editPath` | String | Relative web path to the edit page of a scanner profile. |
-| `globalId` **{warning-solid}** | DastScannerProfileID! | **Deprecated:** Use `id`. Deprecated in 13.6. |
-| `id` | DastScannerProfileID! | ID of the DAST scanner profile. |
-| `profileName` | String | Name of the DAST scanner profile. |
-| `scanType` | DastScanTypeEnum | Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan. |
-| `showDebugMessages` | Boolean! | Indicates if debug messages should be included in DAST console output. True to include the debug messages. |
-| `spiderTimeout` | Int | The maximum number of minutes allowed for the spider to traverse the site. |
-| `targetTimeout` | Int | The maximum number of seconds allowed for the site under test to respond to a request. |
-| `useAjaxSpider` | Boolean! | Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider. |
+| `editPath` | [`String`](#string) | Relative web path to the edit page of a scanner profile. |
+| `globalId` **{warning-solid}** | [`DastScannerProfileID!`](#dastscannerprofileid) | **Deprecated:** Use `id`. Deprecated in 13.6. |
+| `id` | [`DastScannerProfileID!`](#dastscannerprofileid) | ID of the DAST scanner profile. |
+| `profileName` | [`String`](#string) | Name of the DAST scanner profile. |
+| `referencedInSecurityPolicies` | [`[String!]`](#string) | List of security policy names that are referencing given project. |
+| `scanType` | [`DastScanTypeEnum`](#dastscantypeenum) | Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan. |
+| `showDebugMessages` | [`Boolean!`](#boolean) | Indicates if debug messages should be included in DAST console output. True to include the debug messages. |
+| `spiderTimeout` | [`Int`](#int) | The maximum number of minutes allowed for the spider to traverse the site. |
+| `targetTimeout` | [`Int`](#int) | The maximum number of seconds allowed for the site under test to respond to a request. |
+| `useAjaxSpider` | [`Boolean!`](#boolean) | Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider. |
+
+### `DastScannerProfileConnection`
+
+The connection type for DastScannerProfile.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DastScannerProfileEdge]`](#dastscannerprofileedge) | A list of edges. |
+| `nodes` | [`[DastScannerProfile]`](#dastscannerprofile) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### DastScannerProfileCreatePayload
+### `DastScannerProfileCreatePayload`
Autogenerated return type of DastScannerProfileCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `globalId` **{warning-solid}** | DastScannerProfileID | **Deprecated:** Use `id`. Deprecated in 13.6. |
-| `id` | DastScannerProfileID | ID of the scanner profile. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `globalId` **{warning-solid}** | [`DastScannerProfileID`](#dastscannerprofileid) | **Deprecated:** Use `id`. Deprecated in 13.6. |
+| `id` | [`DastScannerProfileID`](#dastscannerprofileid) | ID of the scanner profile. |
-### DastScannerProfileDeletePayload
+### `DastScannerProfileDeletePayload`
Autogenerated return type of DastScannerProfileDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `DastScannerProfileEdge`
-### DastScannerProfileUpdatePayload
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`DastScannerProfile`](#dastscannerprofile) | The item at the end of the edge. |
+
+### `DastScannerProfileUpdatePayload`
Autogenerated return type of DastScannerProfileUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `id` | DastScannerProfileID | ID of the scanner profile. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `id` | [`DastScannerProfileID`](#dastscannerprofileid) | ID of the scanner profile. |
-### DastSiteProfile
+### `DastSiteProfile`
Represents a DAST Site Profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `editPath` | String | Relative web path to the edit page of a site profile. |
-| `id` | DastSiteProfileID! | ID of the site profile. |
-| `normalizedTargetUrl` | String | Normalized URL of the target to be scanned. |
-| `profileName` | String | The name of the site profile. |
-| `targetUrl` | String | The URL of the target to be scanned. |
-| `userPermissions` | DastSiteProfilePermissions! | Permissions for the current user on the resource |
-| `validationStatus` | DastSiteProfileValidationStatusEnum | The current validation status of the site profile. |
+| `editPath` | [`String`](#string) | Relative web path to the edit page of a site profile. |
+| `id` | [`DastSiteProfileID!`](#dastsiteprofileid) | ID of the site profile. |
+| `normalizedTargetUrl` | [`String`](#string) | Normalized URL of the target to be scanned. |
+| `profileName` | [`String`](#string) | The name of the site profile. |
+| `referencedInSecurityPolicies` | [`[String!]`](#string) | List of security policy names that are referencing given project. |
+| `targetUrl` | [`String`](#string) | The URL of the target to be scanned. |
+| `userPermissions` | [`DastSiteProfilePermissions!`](#dastsiteprofilepermissions) | Permissions for the current user on the resource |
+| `validationStatus` | [`DastSiteProfileValidationStatusEnum`](#dastsiteprofilevalidationstatusenum) | The current validation status of the site profile. |
-### DastSiteProfileCreatePayload
+### `DastSiteProfileConnection`
+
+The connection type for DastSiteProfile.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DastSiteProfileEdge]`](#dastsiteprofileedge) | A list of edges. |
+| `nodes` | [`[DastSiteProfile]`](#dastsiteprofile) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `DastSiteProfileCreatePayload`
Autogenerated return type of DastSiteProfileCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `id` | DastSiteProfileID | ID of the site profile. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `id` | [`DastSiteProfileID`](#dastsiteprofileid) | ID of the site profile. |
-### DastSiteProfileDeletePayload
+### `DastSiteProfileDeletePayload`
Autogenerated return type of DastSiteProfileDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `DastSiteProfileEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`DastSiteProfile`](#dastsiteprofile) | The item at the end of the edge. |
-### DastSiteProfilePermissions
+### `DastSiteProfilePermissions`
Check permissions for the current user on site profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createOnDemandDastScan` | Boolean! | Indicates the user can perform `create_on_demand_dast_scan` on this resource |
+| `createOnDemandDastScan` | [`Boolean!`](#boolean) | Indicates the user can perform `create_on_demand_dast_scan` on this resource |
-### DastSiteProfileUpdatePayload
+### `DastSiteProfileUpdatePayload`
Autogenerated return type of DastSiteProfileUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `id` | DastSiteProfileID | ID of the site profile. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `id` | [`DastSiteProfileID`](#dastsiteprofileid) | ID of the site profile. |
-### DastSiteTokenCreatePayload
+### `DastSiteTokenCreatePayload`
Autogenerated return type of DastSiteTokenCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `id` | DastSiteTokenID | ID of the site token. |
-| `status` | DastSiteProfileValidationStatusEnum | The current validation status of the target. |
-| `token` | String | Token string. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `id` | [`DastSiteTokenID`](#dastsitetokenid) | ID of the site token. |
+| `status` | [`DastSiteProfileValidationStatusEnum`](#dastsiteprofilevalidationstatusenum) | The current validation status of the target. |
+| `token` | [`String`](#string) | Token string. |
-### DastSiteValidation
+### `DastSiteValidation`
Represents a DAST Site Validation.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | DastSiteValidationID! | Global ID of the site validation. |
-| `normalizedTargetUrl` | String | Normalized URL of the target to be validated. |
-| `status` | DastSiteProfileValidationStatusEnum! | Status of the site validation. |
+| `id` | [`DastSiteValidationID!`](#dastsitevalidationid) | Global ID of the site validation. |
+| `normalizedTargetUrl` | [`String`](#string) | Normalized URL of the target to be validated. |
+| `status` | [`DastSiteProfileValidationStatusEnum!`](#dastsiteprofilevalidationstatusenum) | Status of the site validation. |
+
+### `DastSiteValidationConnection`
+
+The connection type for DastSiteValidation.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DastSiteValidationEdge]`](#dastsitevalidationedge) | A list of edges. |
+| `nodes` | [`[DastSiteValidation]`](#dastsitevalidation) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### DastSiteValidationCreatePayload
+### `DastSiteValidationCreatePayload`
Autogenerated return type of DastSiteValidationCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `id` | DastSiteValidationID | ID of the site validation. |
-| `status` | DastSiteProfileValidationStatusEnum | The current validation status. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `id` | [`DastSiteValidationID`](#dastsitevalidationid) | ID of the site validation. |
+| `status` | [`DastSiteProfileValidationStatusEnum`](#dastsiteprofilevalidationstatusenum) | The current validation status. |
+
+### `DastSiteValidationEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`DastSiteValidation`](#dastsitevalidation) | The item at the end of the edge. |
-### DastSiteValidationRevokePayload
+### `DastSiteValidationRevokePayload`
Autogenerated return type of DastSiteValidationRevoke.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DeleteAnnotationPayload
+### `DeleteAnnotationPayload`
Autogenerated return type of DeleteAnnotation.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DeleteDevopsAdoptionSegmentPayload
+### `DeleteDevopsAdoptionSegmentPayload`
Autogenerated return type of DeleteDevopsAdoptionSegment.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DeleteJobsResponse
+### `DeleteJobsResponse`
The response from the AdminSidekiqQueuesDeleteJobs mutation.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `completed` | Boolean | Whether or not the entire queue was processed in time; if not, retrying the same request is safe. |
-| `deletedJobs` | Int | The number of matching jobs deleted. |
-| `queueSize` | Int | The queue size after processing. |
+| `completed` | [`Boolean`](#boolean) | Whether or not the entire queue was processed in time; if not, retrying the same request is safe. |
+| `deletedJobs` | [`Int`](#int) | The number of matching jobs deleted. |
+| `queueSize` | [`Int`](#int) | The queue size after processing. |
-### Design
+### `Design`
A single design.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `currentUserTodos` | TodoConnection! | To-do items for the current user. |
-| `diffRefs` | DiffRefs! | The diff refs for this design. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `event` | DesignVersionEvent! | How this design was changed in the current version. |
-| `filename` | String! | The filename of the design. |
-| `fullPath` | String! | The full path to the design file. |
-| `id` | ID! | The ID of this design. |
-| `image` | String! | The URL of the full-sized image. |
-| `imageV432x230` | 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 |
-| `issue` | Issue! | The issue the design belongs to. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `notesCount` | Int! | The total count of user-created notes for this design. |
-| `project` | Project! | The project the design belongs to. |
-| `versions` | DesignVersionConnection! | All versions related to this design ordered newest first. |
+| `currentUserTodos` | [`TodoConnection!`](#todoconnection) | To-do items for the current user. |
+| `diffRefs` | [`DiffRefs!`](#diffrefs) | The diff refs for this design. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `event` | [`DesignVersionEvent!`](#designversionevent) | How this design was changed in the current version. |
+| `filename` | [`String!`](#string) | The filename of the design. |
+| `fullPath` | [`String!`](#string) | The full path to the design file. |
+| `id` | [`ID!`](#id) | The ID of this design. |
+| `image` | [`String!`](#string) | The URL of the full-sized image. |
+| `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 |
+| `issue` | [`Issue!`](#issue) | The issue the design belongs to. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `notesCount` | [`Int!`](#int) | The total count of user-created notes for this design. |
+| `project` | [`Project!`](#project) | The project the design belongs to. |
+| `versions` | [`DesignVersionConnection!`](#designversionconnection) | All versions related to this design ordered newest first. |
-### DesignAtVersion
+### `DesignAtVersion`
A design pinned to a specific version. The image field reflects the design as of the associated version.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `design` | Design! | The underlying design. |
-| `diffRefs` | DiffRefs! | The diff refs for this design. |
-| `event` | DesignVersionEvent! | How this design was changed in the current version. |
-| `filename` | String! | The filename of the design. |
-| `fullPath` | String! | The full path to the design file. |
-| `id` | ID! | The ID of this design. |
-| `image` | String! | The URL of the full-sized image. |
-| `imageV432x230` | 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 |
-| `issue` | Issue! | The issue the design belongs to. |
-| `notesCount` | Int! | The total count of user-created notes for this design. |
-| `project` | Project! | The project the design belongs to. |
-| `version` | DesignVersion! | The version this design-at-versions is pinned to. |
+| `design` | [`Design!`](#design) | The underlying design. |
+| `diffRefs` | [`DiffRefs!`](#diffrefs) | The diff refs for this design. |
+| `event` | [`DesignVersionEvent!`](#designversionevent) | How this design was changed in the current version. |
+| `filename` | [`String!`](#string) | The filename of the design. |
+| `fullPath` | [`String!`](#string) | The full path to the design file. |
+| `id` | [`ID!`](#id) | The ID of this design. |
+| `image` | [`String!`](#string) | The URL of the full-sized image. |
+| `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 |
+| `issue` | [`Issue!`](#issue) | The issue the design belongs to. |
+| `notesCount` | [`Int!`](#int) | The total count of user-created notes for this design. |
+| `project` | [`Project!`](#project) | The project the design belongs to. |
+| `version` | [`DesignVersion!`](#designversion) | The version this design-at-versions is pinned to. |
-### DesignCollection
+### `DesignAtVersionConnection`
+
+The connection type for DesignAtVersion.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DesignAtVersionEdge]`](#designatversionedge) | A list of edges. |
+| `nodes` | [`[DesignAtVersion]`](#designatversion) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `DesignAtVersionEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`DesignAtVersion`](#designatversion) | The item at the end of the edge. |
+
+### `DesignCollection`
A collection of designs.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `copyState` | DesignCollectionCopyState | Copy state of the design collection. |
-| `design` | Design | Find a specific design. |
-| `designAtVersion` | DesignAtVersion | Find a design as of a version. |
-| `designs` | DesignConnection! | All designs for the design collection. |
-| `issue` | Issue! | Issue associated with the design collection. |
-| `project` | Project! | Project associated with the design collection. |
-| `version` | DesignVersion | A specific version. |
-| `versions` | DesignVersionConnection! | All versions related to all designs, ordered newest first. |
+| `copyState` | [`DesignCollectionCopyState`](#designcollectioncopystate) | Copy state of the design collection. |
+| `design` | [`Design`](#design) | Find a specific design. |
+| `designAtVersion` | [`DesignAtVersion`](#designatversion) | Find a design as of a version. |
+| `designs` | [`DesignConnection!`](#designconnection) | All designs for the design collection. |
+| `issue` | [`Issue!`](#issue) | Issue associated with the design collection. |
+| `project` | [`Project!`](#project) | Project associated with the design collection. |
+| `version` | [`DesignVersion`](#designversion) | A specific version. |
+| `versions` | [`DesignVersionConnection!`](#designversionconnection) | All versions related to all designs, ordered newest first. |
+
+### `DesignConnection`
-### DesignManagement
+The connection type for Design.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `designAtVersion` | DesignAtVersion | Find a design as of a version. |
-| `version` | DesignVersion | Find a version. |
+| `edges` | [`[DesignEdge]`](#designedge) | A list of edges. |
+| `nodes` | [`[Design]`](#design) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `DesignEdge`
-### DesignManagementDeletePayload
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Design`](#design) | The item at the end of the edge. |
+
+### `DesignManagement`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `designAtVersion` | [`DesignAtVersion`](#designatversion) | Find a design as of a version. |
+| `version` | [`DesignVersion`](#designversion) | Find a version. |
+
+### `DesignManagementDeletePayload`
Autogenerated return type of DesignManagementDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `version` | DesignVersion | The new version in which the designs are deleted. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `version` | [`DesignVersion`](#designversion) | The new version in which the designs are deleted. |
-### DesignManagementMovePayload
+### `DesignManagementMovePayload`
Autogenerated return type of DesignManagementMove.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `designCollection` | DesignCollection | The current state of the collection. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `designCollection` | [`DesignCollection`](#designcollection) | The current state of the collection. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DesignManagementUploadPayload
+### `DesignManagementUploadPayload`
Autogenerated return type of DesignManagementUpload.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `designs` | Design! => Array | The designs that were uploaded by the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `skippedDesigns` | Design! => Array | Any designs that were skipped from the upload due to there being no change to their content since their last version |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `designs` | [`[Design!]!`](#design) | The designs that were uploaded by the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `skippedDesigns` | [`[Design!]!`](#design) | Any designs that were skipped from the upload due to there being no change to their content since their last version |
-### DesignVersion
+### `DesignVersion`
A specific version in which designs were added, modified or deleted.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `designAtVersion` | DesignAtVersion! | A particular design as of this version, provided it is visible at this version. |
-| `designs` | DesignConnection! | All designs that were changed in the version. |
-| `designsAtVersion` | DesignAtVersionConnection! | All designs that are visible at this version, as of this version. |
-| `id` | ID! | ID of the design version. |
-| `sha` | ID! | SHA of the design version. |
+| `designAtVersion` | [`DesignAtVersion!`](#designatversion) | A particular design as of this version, provided it is visible at this version. |
+| `designs` | [`DesignConnection!`](#designconnection) | All designs that were changed in the version. |
+| `designsAtVersion` | [`DesignAtVersionConnection!`](#designatversionconnection) | All designs that are visible at this version, as of this version. |
+| `id` | [`ID!`](#id) | ID of the design version. |
+| `sha` | [`ID!`](#id) | SHA of the design version. |
+
+### `DesignVersionConnection`
-### DestroyBoardListPayload
+The connection type for DesignVersion.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DesignVersionEdge]`](#designversionedge) | A list of edges. |
+| `nodes` | [`[DesignVersion]`](#designversion) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `DesignVersionEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`DesignVersion`](#designversion) | The item at the end of the edge. |
+
+### `DestroyBoardListPayload`
Autogenerated return type of DestroyBoardList.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `list` | BoardList | The list after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `list` | [`BoardList`](#boardlist) | The list after mutation. |
-### DestroyBoardPayload
+### `DestroyBoardPayload`
Autogenerated return type of DestroyBoard.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `board` | Board | The board after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `board` | [`Board`](#board) | The board after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DestroyComplianceFrameworkPayload
+### `DestroyComplianceFrameworkPayload`
Autogenerated return type of DestroyComplianceFramework.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DestroyContainerRepositoryPayload
+### `DestroyContainerRepositoryPayload`
Autogenerated return type of DestroyContainerRepository.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `containerRepository` | ContainerRepository! | The container repository policy after scheduling the deletion. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `containerRepository` | [`ContainerRepository!`](#containerrepository) | The container repository policy after scheduling the deletion. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DestroyContainerRepositoryTagsPayload
+### `DestroyContainerRepositoryTagsPayload`
Autogenerated return type of DestroyContainerRepositoryTags.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `deletedTagNames` | String! => Array | Deleted container repository tags. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `deletedTagNames` | [`[String!]!`](#string) | Deleted container repository tags. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DestroyNotePayload
+### `DestroyNotePayload`
Autogenerated return type of DestroyNote.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `note` | Note | The note after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `note` | [`Note`](#note) | The note after mutation. |
-### DestroySnippetPayload
+### `DestroySnippetPayload`
Autogenerated return type of DestroySnippet.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `snippet` | Snippet | The snippet after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `snippet` | [`Snippet`](#snippet) | The snippet after mutation. |
-### DetailedStatus
+### `DetailedStatus`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `action` | StatusAction | Action information for the status. This includes method, button title, icon, path, and title. |
-| `detailsPath` | String | Path of the details for the status. |
-| `favicon` | String | Favicon of the status. |
-| `group` | String | Group of the status. |
-| `hasDetails` | Boolean | Indicates if the status has further details. |
-| `icon` | String | Icon of the status. |
-| `label` | String | Label of the status. |
-| `text` | String | Text of the status. |
-| `tooltip` | String | Tooltip associated with the status. |
+| `action` | [`StatusAction`](#statusaction) | Action information for the status. This includes method, button title, icon, path, and title. |
+| `detailsPath` | [`String`](#string) | Path of the details for the status. |
+| `favicon` | [`String`](#string) | Favicon of the status. |
+| `group` | [`String`](#string) | Group of the status. |
+| `hasDetails` | [`Boolean`](#boolean) | Indicates if the status has further details. |
+| `icon` | [`String`](#string) | Icon of the status. |
+| `label` | [`String`](#string) | Label of the status. |
+| `text` | [`String`](#string) | Text of the status. |
+| `tooltip` | [`String`](#string) | Tooltip associated with the status. |
-### DevopsAdoptionSegment
+### `DevopsAdoptionSegment`
Segment.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | ID! | ID of the segment. |
-| `latestSnapshot` | DevopsAdoptionSnapshot | The latest adoption metrics for the segment. |
-| `namespace` | Namespace | Segment namespace. |
+| `id` | [`ID!`](#id) | ID of the segment. |
+| `latestSnapshot` | [`DevopsAdoptionSnapshot`](#devopsadoptionsnapshot) | The latest adoption metrics for the segment. |
+| `namespace` | [`Namespace`](#namespace) | Segment namespace. |
+
+### `DevopsAdoptionSegmentConnection`
+
+The connection type for DevopsAdoptionSegment.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DevopsAdoptionSegmentEdge]`](#devopsadoptionsegmentedge) | A list of edges. |
+| `nodes` | [`[DevopsAdoptionSegment]`](#devopsadoptionsegment) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### DevopsAdoptionSnapshot
+### `DevopsAdoptionSegmentEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`DevopsAdoptionSegment`](#devopsadoptionsegment) | The item at the end of the edge. |
+
+### `DevopsAdoptionSnapshot`
Snapshot.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `deploySucceeded` | Boolean! | At least one deployment succeeded. |
-| `endTime` | Time! | The end time for the snapshot where the data points were collected. |
-| `issueOpened` | Boolean! | At least one issue was opened. |
-| `mergeRequestApproved` | Boolean! | At least one merge request was approved. |
-| `mergeRequestOpened` | Boolean! | At least one merge request was opened. |
-| `pipelineSucceeded` | Boolean! | At least one pipeline succeeded. |
-| `recordedAt` | Time! | The time the snapshot was recorded. |
-| `runnerConfigured` | Boolean! | At least one runner was used. |
-| `securityScanSucceeded` | Boolean! | At least one security scan succeeded. |
-| `startTime` | Time! | The start time for the snapshot where the data points were collected. |
+| `deploySucceeded` | [`Boolean!`](#boolean) | At least one deployment succeeded. |
+| `endTime` | [`Time!`](#time) | The end time for the snapshot where the data points were collected. |
+| `issueOpened` | [`Boolean!`](#boolean) | At least one issue was opened. |
+| `mergeRequestApproved` | [`Boolean!`](#boolean) | At least one merge request was approved. |
+| `mergeRequestOpened` | [`Boolean!`](#boolean) | At least one merge request was opened. |
+| `pipelineSucceeded` | [`Boolean!`](#boolean) | At least one pipeline succeeded. |
+| `recordedAt` | [`Time!`](#time) | The time the snapshot was recorded. |
+| `runnerConfigured` | [`Boolean!`](#boolean) | At least one runner was used. |
+| `securityScanSucceeded` | [`Boolean!`](#boolean) | At least one security scan succeeded. |
+| `startTime` | [`Time!`](#time) | The start time for the snapshot where the data points were collected. |
-### DiffPosition
+### `DiffPosition`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `diffRefs` | DiffRefs! | Information about the branch, HEAD, and base at the time of commenting. |
-| `filePath` | String! | Path of the file that was changed. |
-| `height` | Int | Total height of the image. |
-| `newLine` | Int | Line on HEAD SHA that was changed. |
-| `newPath` | String | Path of the file on the HEAD SHA. |
-| `oldLine` | Int | Line on start SHA that was changed. |
-| `oldPath` | String | Path of the file on the start SHA. |
-| `positionType` | DiffPositionType! | Type of file the position refers to. |
-| `width` | Int | Total width of the image. |
-| `x` | Int | X position of the note. |
-| `y` | Int | Y position of the note. |
+| `diffRefs` | [`DiffRefs!`](#diffrefs) | Information about the branch, HEAD, and base at the time of commenting. |
+| `filePath` | [`String!`](#string) | Path of the file that was changed. |
+| `height` | [`Int`](#int) | Total height of the image. |
+| `newLine` | [`Int`](#int) | Line on HEAD SHA that was changed. |
+| `newPath` | [`String`](#string) | Path of the file on the HEAD SHA. |
+| `oldLine` | [`Int`](#int) | Line on start SHA that was changed. |
+| `oldPath` | [`String`](#string) | Path of the file on the start SHA. |
+| `positionType` | [`DiffPositionType!`](#diffpositiontype) | Type of file the position refers to. |
+| `width` | [`Int`](#int) | Total width of the image. |
+| `x` | [`Int`](#int) | X position of the note. |
+| `y` | [`Int`](#int) | Y position of the note. |
-### DiffRefs
+### `DiffRefs`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `baseSha` | String | Merge base of the branch the comment was made on. |
-| `headSha` | String! | SHA of the HEAD at the time the comment was made. |
-| `startSha` | String! | SHA of the branch being compared against. |
+| `baseSha` | [`String`](#string) | Merge base of the branch the comment was made on. |
+| `headSha` | [`String!`](#string) | SHA of the HEAD at the time the comment was made. |
+| `startSha` | [`String!`](#string) | SHA of the branch being compared against. |
-### DiffStats
+### `DiffStats`
Changes to a single file.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `additions` | Int! | Number of lines added to this file. |
-| `deletions` | Int! | Number of lines deleted from this file. |
-| `path` | String! | File path, relative to repository root. |
+| `additions` | [`Int!`](#int) | Number of lines added to this file. |
+| `deletions` | [`Int!`](#int) | Number of lines deleted from this file. |
+| `path` | [`String!`](#string) | File path, relative to repository root. |
-### DiffStatsSummary
+### `DiffStatsSummary`
Aggregated summary of changes.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `additions` | Int! | Number of lines added. |
-| `changes` | Int! | Number of lines changed. |
-| `deletions` | Int! | Number of lines deleted. |
-| `fileCount` | Int! | Number of files changed. |
+| `additions` | [`Int!`](#int) | Number of lines added. |
+| `changes` | [`Int!`](#int) | Number of lines changed. |
+| `deletions` | [`Int!`](#int) | Number of lines deleted. |
+| `fileCount` | [`Int!`](#int) | Number of files changed. |
+
+### `Discussion`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `createdAt` | [`Time!`](#time) | Timestamp of the discussion's creation. |
+| `id` | [`DiscussionID!`](#discussionid) | ID of this discussion. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes in the discussion. |
+| `replyId` | [`DiscussionID!`](#discussionid) | ID used to reply to this discussion. |
+| `resolvable` | [`Boolean!`](#boolean) | Indicates if the object can be resolved. |
+| `resolved` | [`Boolean!`](#boolean) | Indicates if the object is resolved. |
+| `resolvedAt` | [`Time`](#time) | Timestamp of when the object was resolved. |
+| `resolvedBy` | [`User`](#user) | User who resolved the object. |
+
+### `DiscussionConnection`
+
+The connection type for Discussion.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[DiscussionEdge]`](#discussionedge) | A list of edges. |
+| `nodes` | [`[Discussion]`](#discussion) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `DiscussionEdge`
-### Discussion
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | Timestamp of the discussion's creation. |
-| `id` | DiscussionID! | ID of this discussion. |
-| `notes` | NoteConnection! | All notes in the discussion. |
-| `replyId` | DiscussionID! | ID used to reply to this discussion. |
-| `resolvable` | Boolean! | Indicates if the object can be resolved. |
-| `resolved` | Boolean! | Indicates if the object is resolved. |
-| `resolvedAt` | Time | Timestamp of when the object was resolved. |
-| `resolvedBy` | User | User who resolved the object. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Discussion`](#discussion) | The item at the end of the edge. |
-### DiscussionToggleResolvePayload
+### `DiscussionToggleResolvePayload`
Autogenerated return type of DiscussionToggleResolve.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `discussion` | Discussion | The discussion after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `discussion` | [`Discussion`](#discussion) | The discussion after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### DismissVulnerabilityPayload
+### `DismissVulnerabilityPayload`
Autogenerated return type of DismissVulnerability.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after dismissal. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `vulnerability` | [`Vulnerability`](#vulnerability) | The vulnerability after dismissal. |
-### Environment
+### `Environment`
Describes where code is deployed for a project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | ID! | ID of the environment. |
-| `latestOpenedMostSevereAlert` | AlertManagementAlert | The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned. |
-| `metricsDashboard` | MetricsDashboard | Metrics dashboard schema for the environment. |
-| `name` | String! | Human-readable name of the environment. |
-| `path` | String! | The path to the environment. |
-| `state` | String! | State of the environment, for example: available/stopped. |
+| `id` | [`ID!`](#id) | ID of the environment. |
+| `latestOpenedMostSevereAlert` | [`AlertManagementAlert`](#alertmanagementalert) | The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned. |
+| `metricsDashboard` | [`MetricsDashboard`](#metricsdashboard) | Metrics dashboard schema for the environment. |
+| `name` | [`String!`](#string) | Human-readable name of the environment. |
+| `path` | [`String!`](#string) | The path to the environment. |
+| `state` | [`String!`](#string) | State of the environment, for example: available/stopped. |
+
+### `EnvironmentConnection`
+
+The connection type for Environment.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[EnvironmentEdge]`](#environmentedge) | A list of edges. |
+| `nodes` | [`[Environment]`](#environment) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `EnvironmentEdge`
-### EnvironmentsCanaryIngressUpdatePayload
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Environment`](#environment) | The item at the end of the edge. |
+
+### `EnvironmentsCanaryIngressUpdatePayload`
Autogenerated return type of EnvironmentsCanaryIngressUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### Epic
+### `Epic`
Represents an epic.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `author` | User! | Author of the epic. |
-| `awardEmoji` | AwardEmojiConnection | A list of award emojis associated with the epic. |
-| `children` | EpicConnection | Children (sub-epics) of the epic. |
-| `closedAt` | Time | Timestamp of when the epic was closed. |
-| `confidential` | Boolean | Indicates if the epic is confidential. |
-| `createdAt` | Time | Timestamp of when the epic was created. |
-| `currentUserTodos` | TodoConnection! | To-do items for the current user. |
-| `descendantCounts` | EpicDescendantCount | Number of open and closed descendant epics and issues. |
-| `descendantWeightSum` | EpicDescendantWeights | Total weight of open and closed issues in the epic and its descendants. |
-| `description` | String | Description of the epic. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `downvotes` | Int! | Number of downvotes the epic has received. |
-| `dueDate` | Time | Due date of the epic. |
-| `dueDateFixed` | Time | Fixed due date of the epic. |
-| `dueDateFromMilestones` | Time | Inherited due date of the epic from milestones. |
-| `dueDateIsFixed` | Boolean | Indicates if the due date has been manually set. |
-| `events` | EventConnection | A list of events associated with the object. |
-| `group` | Group! | Group to which the epic belongs. |
-| `hasChildren` | Boolean! | Indicates if the epic has children. |
-| `hasIssues` | Boolean! | Indicates if the epic has direct issues. |
-| `hasParent` | Boolean! | Indicates if the epic has a parent epic. |
-| `healthStatus` | EpicHealthStatus | Current health status of the epic. |
-| `id` | ID! | ID of the epic. |
-| `iid` | ID! | Internal ID of the epic. |
-| `issues` | EpicIssueConnection | A list of issues associated with the epic. |
-| `labels` | LabelConnection | Labels assigned to the epic. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `parent` | Epic | Parent epic of the epic. |
-| `participants` | UserConnection | List of participants for the epic. |
-| `reference` | String! | Internal reference of the epic. Returned in shortened format by default. |
-| `relationPath` | String | URI path of the epic-issue relationship. |
-| `relativePosition` | Int | The relative position of the epic in the epic tree. |
-| `startDate` | Time | Start date of the epic. |
-| `startDateFixed` | Time | Fixed start date of the epic. |
-| `startDateFromMilestones` | Time | Inherited start date of the epic from milestones. |
-| `startDateIsFixed` | Boolean | Indicates if the start date has been manually set. |
-| `state` | EpicState! | State of the epic. |
-| `subscribed` | Boolean! | Indicates the currently logged in user is subscribed to the epic. |
-| `title` | String | Title of the epic. |
-| `updatedAt` | Time | Timestamp of when the epic was updated. |
-| `upvotes` | Int! | Number of upvotes the epic has received. |
-| `userDiscussionsCount` | Int! | Number of user discussions in the epic. |
-| `userNotesCount` | Int! | Number of user notes of the epic. |
-| `userPermissions` | EpicPermissions! | Permissions for the current user on the resource |
-| `webPath` | String! | Web path of the epic. |
-| `webUrl` | String! | Web URL of the epic. |
-
-### EpicAddIssuePayload
+| `author` | [`User!`](#user) | Author of the epic. |
+| `awardEmoji` | [`AwardEmojiConnection`](#awardemojiconnection) | A list of award emojis associated with the epic. |
+| `children` | [`EpicConnection`](#epicconnection) | Children (sub-epics) of the epic. |
+| `closedAt` | [`Time`](#time) | Timestamp of when the epic was closed. |
+| `confidential` | [`Boolean`](#boolean) | Indicates if the epic is confidential. |
+| `createdAt` | [`Time`](#time) | Timestamp of when the epic was created. |
+| `currentUserTodos` | [`TodoConnection!`](#todoconnection) | To-do items for the current user. |
+| `descendantCounts` | [`EpicDescendantCount`](#epicdescendantcount) | Number of open and closed descendant epics and issues. |
+| `descendantWeightSum` | [`EpicDescendantWeights`](#epicdescendantweights) | Total weight of open and closed issues in the epic and its descendants. |
+| `description` | [`String`](#string) | Description of the epic. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `downvotes` | [`Int!`](#int) | Number of downvotes the epic has received. |
+| `dueDate` | [`Time`](#time) | Due date of the epic. |
+| `dueDateFixed` | [`Time`](#time) | Fixed due date of the epic. |
+| `dueDateFromMilestones` | [`Time`](#time) | Inherited due date of the epic from milestones. |
+| `dueDateIsFixed` | [`Boolean`](#boolean) | Indicates if the due date has been manually set. |
+| `events` | [`EventConnection`](#eventconnection) | A list of events associated with the object. |
+| `group` | [`Group!`](#group) | Group to which the epic belongs. |
+| `hasChildren` | [`Boolean!`](#boolean) | Indicates if the epic has children. |
+| `hasIssues` | [`Boolean!`](#boolean) | Indicates if the epic has direct issues. |
+| `hasParent` | [`Boolean!`](#boolean) | Indicates if the epic has a parent epic. |
+| `healthStatus` | [`EpicHealthStatus`](#epichealthstatus) | Current health status of the epic. |
+| `id` | [`ID!`](#id) | ID of the epic. |
+| `iid` | [`ID!`](#id) | Internal ID of the epic. |
+| `issues` | [`EpicIssueConnection`](#epicissueconnection) | A list of issues associated with the epic. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels assigned to the epic. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `parent` | [`Epic`](#epic) | Parent epic of the epic. |
+| `participants` | [`UserConnection`](#userconnection) | List of participants for the epic. |
+| `reference` | [`String!`](#string) | Internal reference of the epic. Returned in shortened format by default. |
+| `relationPath` | [`String`](#string) | URI path of the epic-issue relationship. |
+| `relativePosition` | [`Int`](#int) | The relative position of the epic in the epic tree. |
+| `startDate` | [`Time`](#time) | Start date of the epic. |
+| `startDateFixed` | [`Time`](#time) | Fixed start date of the epic. |
+| `startDateFromMilestones` | [`Time`](#time) | Inherited start date of the epic from milestones. |
+| `startDateIsFixed` | [`Boolean`](#boolean) | Indicates if the start date has been manually set. |
+| `state` | [`EpicState!`](#epicstate) | State of the epic. |
+| `subscribed` | [`Boolean!`](#boolean) | Indicates the currently logged in user is subscribed to the epic. |
+| `title` | [`String`](#string) | Title of the epic. |
+| `updatedAt` | [`Time`](#time) | Timestamp of when the epic was updated. |
+| `upvotes` | [`Int!`](#int) | Number of upvotes the epic has received. |
+| `userDiscussionsCount` | [`Int!`](#int) | Number of user discussions in the epic. |
+| `userNotesCount` | [`Int!`](#int) | Number of user notes of the epic. |
+| `userPermissions` | [`EpicPermissions!`](#epicpermissions) | Permissions for the current user on the resource |
+| `webPath` | [`String!`](#string) | Web path of the epic. |
+| `webUrl` | [`String!`](#string) | Web URL of the epic. |
+
+### `EpicAddIssuePayload`
Autogenerated return type of EpicAddIssue.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after mutation. |
-| `epicIssue` | EpicIssue | The epic-issue relation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epic` | [`Epic`](#epic) | The epic after mutation. |
+| `epicIssue` | [`EpicIssue`](#epicissue) | The epic-issue relation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### EpicBoard
+### `EpicBoard`
Represents an epic board.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | BoardsEpicBoardID! | Global ID of the board. |
-| `lists` | EpicListConnection | Epic board lists. |
-| `name` | String | Name of the board. |
+| `hideBacklogList` | [`Boolean`](#boolean) | Whether or not backlog list is hidden. |
+| `hideClosedList` | [`Boolean`](#boolean) | Whether or not closed list is hidden. |
+| `id` | [`BoardsEpicBoardID!`](#boardsepicboardid) | Global ID of the epic board. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels of the board. |
+| `lists` | [`EpicListConnection`](#epiclistconnection) | Epic board lists. |
+| `name` | [`String`](#string) | Name of the epic board. |
+| `webPath` | [`String!`](#string) | Web path of the epic board. |
+| `webUrl` | [`String!`](#string) | Web URL of the epic board. |
+
+### `EpicBoardConnection`
+
+The connection type for EpicBoard.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[EpicBoardEdge]`](#epicboardedge) | A list of edges. |
+| `nodes` | [`[EpicBoard]`](#epicboard) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### EpicBoardCreatePayload
+### `EpicBoardCreatePayload`
Autogenerated return type of EpicBoardCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epicBoard` | EpicBoard | The created epic board. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epicBoard` | [`EpicBoard`](#epicboard) | The created epic board. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### EpicBoardListCreatePayload
+### `EpicBoardEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`EpicBoard`](#epicboard) | The item at the end of the edge. |
+
+### `EpicBoardListCreatePayload`
Autogenerated return type of EpicBoardListCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `list` | EpicList | Epic list in the epic board. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `list` | [`EpicList`](#epiclist) | Epic list in the epic board. |
+
+### `EpicBoardUpdatePayload`
-### EpicDescendantCount
+Autogenerated return type of EpicBoardUpdate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epicBoard` | [`EpicBoard`](#epicboard) | The updated epic board. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `EpicConnection`
+
+The connection type for Epic.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[EpicEdge]`](#epicedge) | A list of edges. |
+| `nodes` | [`[Epic]`](#epic) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `EpicDescendantCount`
Counts of descendent epics.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `closedEpics` | Int | Number of closed child epics. |
-| `closedIssues` | Int | Number of closed epic issues. |
-| `openedEpics` | Int | Number of opened child epics. |
-| `openedIssues` | Int | Number of opened epic issues. |
+| `closedEpics` | [`Int`](#int) | Number of closed child epics. |
+| `closedIssues` | [`Int`](#int) | Number of closed epic issues. |
+| `openedEpics` | [`Int`](#int) | Number of opened child epics. |
+| `openedIssues` | [`Int`](#int) | Number of opened epic issues. |
-### EpicDescendantWeights
+### `EpicDescendantWeights`
Total weight of open and closed descendant issues.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `closedIssues` | Int | Total weight of completed (closed) issues in this epic, including epic descendants. |
-| `openedIssues` | Int | Total weight of opened issues in this epic, including epic descendants. |
+| `closedIssues` | [`Int`](#int) | Total weight of completed (closed) issues in this epic, including epic descendants. |
+| `openedIssues` | [`Int`](#int) | Total weight of opened issues in this epic, including epic descendants. |
-### EpicHealthStatus
+### `EpicEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Epic`](#epic) | The item at the end of the edge. |
+
+### `EpicHealthStatus`
Health status of child issues.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `issuesAtRisk` | Int | Number of issues at risk. |
-| `issuesNeedingAttention` | Int | Number of issues that need attention. |
-| `issuesOnTrack` | Int | Number of issues on track. |
+| `issuesAtRisk` | [`Int`](#int) | Number of issues at risk. |
+| `issuesNeedingAttention` | [`Int`](#int) | Number of issues that need attention. |
+| `issuesOnTrack` | [`Int`](#int) | Number of issues on track. |
-### EpicIssue
+### `EpicIssue`
Relationship between an epic and an issue.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `alertManagementAlert` | AlertManagementAlert | Alert associated to this issue. |
-| `assignees` | UserConnection | Assignees of the issue. |
-| `author` | User! | User that created the issue. |
-| `blocked` | Boolean! | Indicates the issue is blocked. |
-| `blockedByCount` | Int | Count of issues blocking this issue. |
-| `closedAt` | Time | Timestamp of when the issue was closed. |
-| `confidential` | Boolean! | Indicates the issue is confidential. |
-| `createNoteEmail` | String | User specific email address for the issue. |
-| `createdAt` | Time! | Timestamp of when the issue was created. |
-| `currentUserTodos` | TodoConnection! | To-do items for the current user. |
-| `description` | String | Description of the issue. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `designCollection` | DesignCollection | Collection of design images associated with this issue. |
-| `discussionLocked` | Boolean! | Indicates discussion is locked on the issue. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `downvotes` | Int! | Number of downvotes the issue has received. |
-| `dueDate` | Time | Due date of the issue. |
-| `emailsDisabled` | Boolean! | Indicates if a project has email notifications disabled: `true` if email notifications are disabled. |
-| `epic` | Epic | Epic to which this issue belongs. |
-| `epicIssueId` | ID! | ID of the epic-issue relation. |
-| `healthStatus` | HealthStatus | Current health status. |
-| `humanTimeEstimate` | String | Human-readable time estimate of the issue. |
-| `humanTotalTimeSpent` | String | Human-readable total time reported as spent on the issue. |
-| `id` | ID | Global ID of the epic-issue relation. |
-| `iid` | ID! | Internal ID of the issue. |
-| `iteration` | Iteration | Iteration of the issue. |
-| `labels` | LabelConnection | Labels of the issue. |
-| `metricImages` | MetricImage! => Array | Metric images associated to the issue. |
-| `milestone` | Milestone | Milestone of the issue. |
-| `moved` | Boolean | Indicates if issue got moved from other project. |
-| `movedTo` | Issue | Updated Issue after it got moved to another project. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `participants` | UserConnection | List of participants in the issue. |
-| `reference` | String! | Internal reference of the issue. Returned in shortened format by default. |
-| `relationPath` | String | URI path of the epic-issue relation. |
-| `relativePosition` | Int | Relative position of the issue (used for positioning in epic tree and issue boards). |
-| `severity` | IssuableSeverity | Severity level of the incident. |
-| `slaDueAt` | Time | Timestamp of when the issue SLA expires. |
-| `state` | IssueState! | State of the issue. |
-| `statusPagePublishedIncident` | Boolean | Indicates whether an issue is published to the status page. |
-| `subscribed` | Boolean! | Indicates the currently logged in user is subscribed to the issue. |
-| `taskCompletionStatus` | TaskCompletionStatus! | Task completion status of the issue. |
-| `timeEstimate` | Int! | Time estimate of the issue. |
-| `title` | String! | Title of the issue. |
-| `titleHtml` | String | The GitLab Flavored Markdown rendering of `title` |
-| `totalTimeSpent` | Int! | Total time reported as spent on the issue. |
-| `type` | IssueType | Type of the issue. |
-| `updatedAt` | Time! | Timestamp of when the issue was last updated. |
-| `updatedBy` | User | User that last updated the issue. |
-| `upvotes` | Int! | Number of upvotes the issue has received. |
-| `userDiscussionsCount` | Int! | Number of user discussions in the issue. |
-| `userNotesCount` | Int! | Number of user notes of the issue. |
-| `userPermissions` | IssuePermissions! | Permissions for the current user on the resource |
-| `webPath` | String! | Web path of the issue. |
-| `webUrl` | String! | Web URL of the issue. |
-| `weight` | Int | Weight of the issue. |
-
-### EpicList
+| `alertManagementAlert` | [`AlertManagementAlert`](#alertmanagementalert) | Alert associated to this issue. |
+| `assignees` | [`UserConnection`](#userconnection) | Assignees of the issue. |
+| `author` | [`User!`](#user) | User that created the issue. |
+| `blocked` | [`Boolean!`](#boolean) | Indicates the issue is blocked. |
+| `blockedByCount` | [`Int`](#int) | Count of issues blocking this issue. |
+| `blockedByIssues` | [`IssueConnection`](#issueconnection) | Issues blocking this issue. |
+| `closedAt` | [`Time`](#time) | Timestamp of when the issue was closed. |
+| `confidential` | [`Boolean!`](#boolean) | Indicates the issue is confidential. |
+| `createNoteEmail` | [`String`](#string) | User specific email address for the issue. |
+| `createdAt` | [`Time!`](#time) | Timestamp of when the issue was created. |
+| `currentUserTodos` | [`TodoConnection!`](#todoconnection) | To-do items for the current user. |
+| `description` | [`String`](#string) | Description of the issue. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `designCollection` | [`DesignCollection`](#designcollection) | Collection of design images associated with this issue. |
+| `discussionLocked` | [`Boolean!`](#boolean) | Indicates discussion is locked on the issue. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `downvotes` | [`Int!`](#int) | Number of downvotes the issue has received. |
+| `dueDate` | [`Time`](#time) | Due date of the issue. |
+| `emailsDisabled` | [`Boolean!`](#boolean) | Indicates if a project has email notifications disabled: `true` if email notifications are disabled. |
+| `epic` | [`Epic`](#epic) | Epic to which this issue belongs. |
+| `epicIssueId` | [`ID!`](#id) | ID of the epic-issue relation. |
+| `healthStatus` | [`HealthStatus`](#healthstatus) | Current health status. |
+| `humanTimeEstimate` | [`String`](#string) | Human-readable time estimate of the issue. |
+| `humanTotalTimeSpent` | [`String`](#string) | Human-readable total time reported as spent on the issue. |
+| `id` | [`ID`](#id) | Global ID of the epic-issue relation. |
+| `iid` | [`ID!`](#id) | Internal ID of the issue. |
+| `iteration` | [`Iteration`](#iteration) | Iteration of the issue. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels of the issue. |
+| `metricImages` | [`[MetricImage!]`](#metricimage) | Metric images associated to the issue. |
+| `milestone` | [`Milestone`](#milestone) | Milestone of the issue. |
+| `moved` | [`Boolean`](#boolean) | Indicates if issue got moved from other project. |
+| `movedTo` | [`Issue`](#issue) | Updated Issue after it got moved to another project. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `participants` | [`UserConnection`](#userconnection) | List of participants in the issue. |
+| `reference` | [`String!`](#string) | Internal reference of the issue. Returned in shortened format by default. |
+| `relationPath` | [`String`](#string) | URI path of the epic-issue relation. |
+| `relativePosition` | [`Int`](#int) | Relative position of the issue (used for positioning in epic tree and issue boards). |
+| `severity` | [`IssuableSeverity`](#issuableseverity) | Severity level of the incident. |
+| `slaDueAt` | [`Time`](#time) | Timestamp of when the issue SLA expires. |
+| `state` | [`IssueState!`](#issuestate) | State of the issue. |
+| `statusPagePublishedIncident` | [`Boolean`](#boolean) | Indicates whether an issue is published to the status page. |
+| `subscribed` | [`Boolean!`](#boolean) | Indicates the currently logged in user is subscribed to the issue. |
+| `taskCompletionStatus` | [`TaskCompletionStatus!`](#taskcompletionstatus) | Task completion status of the issue. |
+| `timeEstimate` | [`Int!`](#int) | Time estimate of the issue. |
+| `title` | [`String!`](#string) | Title of the issue. |
+| `titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title` |
+| `totalTimeSpent` | [`Int!`](#int) | Total time reported as spent on the issue. |
+| `type` | [`IssueType`](#issuetype) | Type of the issue. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of when the issue was last updated. |
+| `updatedBy` | [`User`](#user) | User that last updated the issue. |
+| `upvotes` | [`Int!`](#int) | Number of upvotes the issue has received. |
+| `userDiscussionsCount` | [`Int!`](#int) | Number of user discussions in the issue. |
+| `userNotesCount` | [`Int!`](#int) | Number of user notes of the issue. |
+| `userPermissions` | [`IssuePermissions!`](#issuepermissions) | Permissions for the current user on the resource |
+| `webPath` | [`String!`](#string) | Web path of the issue. |
+| `webUrl` | [`String!`](#string) | Web URL of the issue. |
+| `weight` | [`Int`](#int) | Weight of the issue. |
+
+### `EpicIssueConnection`
+
+The connection type for EpicIssue.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[EpicIssueEdge]`](#epicissueedge) | A list of edges. |
+| `nodes` | [`[EpicIssue]`](#epicissue) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+| `weight` | [`Int!`](#int) | Total weight of issues collection. |
+
+### `EpicIssueEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`EpicIssue`](#epicissue) | The item at the end of the edge. |
+
+### `EpicList`
Represents an epic board list.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `epics` | EpicConnection | List epics. |
-| `id` | BoardsEpicListID! | Global ID of the board list. |
-| `label` | Label | Label of the list. |
-| `listType` | String! | Type of the list. |
-| `position` | Int | Position of the list within the board. |
-| `title` | String! | Title of the list. |
+| `collapsed` | [`Boolean`](#boolean) | Indicates if this list is collapsed for this user. |
+| `epics` | [`EpicConnection`](#epicconnection) | List epics. |
+| `epicsCount` | [`Int`](#int) | Count of epics in the list. |
+| `id` | [`BoardsEpicListID!`](#boardsepiclistid) | Global ID of the board list. |
+| `label` | [`Label`](#label) | Label of the list. |
+| `listType` | [`String!`](#string) | Type of the list. |
+| `position` | [`Int`](#int) | Position of the list within the board. |
+| `title` | [`String!`](#string) | Title of the list. |
+
+### `EpicListConnection`
+
+The connection type for EpicList.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[EpicListEdge]`](#epiclistedge) | A list of edges. |
+| `nodes` | [`[EpicList]`](#epiclist) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `EpicListEdge`
-### EpicPermissions
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`EpicList`](#epiclist) | The item at the end of the edge. |
+
+### `EpicMoveListPayload`
+
+Autogenerated return type of EpicMoveList.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `EpicPermissions`
Check permissions for the current user on an epic.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminEpic` | Boolean! | Indicates the user can perform `admin_epic` on this resource |
-| `awardEmoji` | Boolean! | Indicates the user can perform `award_emoji` on this resource |
-| `createEpic` | Boolean! | Indicates the user can perform `create_epic` on this resource |
-| `createNote` | Boolean! | Indicates the user can perform `create_note` on this resource |
-| `destroyEpic` | Boolean! | Indicates the user can perform `destroy_epic` on this resource |
-| `readEpic` | Boolean! | Indicates the user can perform `read_epic` on this resource |
-| `readEpicIid` | Boolean! | Indicates the user can perform `read_epic_iid` on this resource |
-| `updateEpic` | Boolean! | Indicates the user can perform `update_epic` on this resource |
+| `adminEpic` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_epic` on this resource |
+| `awardEmoji` | [`Boolean!`](#boolean) | Indicates the user can perform `award_emoji` on this resource |
+| `createEpic` | [`Boolean!`](#boolean) | Indicates the user can perform `create_epic` on this resource |
+| `createNote` | [`Boolean!`](#boolean) | Indicates the user can perform `create_note` on this resource |
+| `destroyEpic` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_epic` on this resource |
+| `readEpic` | [`Boolean!`](#boolean) | Indicates the user can perform `read_epic` on this resource |
+| `readEpicIid` | [`Boolean!`](#boolean) | Indicates the user can perform `read_epic_iid` on this resource |
+| `updateEpic` | [`Boolean!`](#boolean) | Indicates the user can perform `update_epic` on this resource |
-### EpicSetSubscriptionPayload
+### `EpicSetSubscriptionPayload`
Autogenerated return type of EpicSetSubscription.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epic` | [`Epic`](#epic) | The epic after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### EpicTreeReorderPayload
+### `EpicTreeReorderPayload`
Autogenerated return type of EpicTreeReorder.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### Event
+### `Event`
Representing an event.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `action` | EventAction! | Action of the event. |
-| `author` | User! | Author of this event. |
-| `createdAt` | Time! | When this event was created. |
-| `id` | ID! | ID of the event. |
-| `updatedAt` | Time! | When this event was updated. |
+| `action` | [`EventAction!`](#eventaction) | Action of the event. |
+| `author` | [`User!`](#user) | Author of this event. |
+| `createdAt` | [`Time!`](#time) | When this event was created. |
+| `id` | [`ID!`](#id) | ID of the event. |
+| `updatedAt` | [`Time!`](#time) | When this event was updated. |
+
+### `EventConnection`
+
+The connection type for Event.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[EventEdge]`](#eventedge) | A list of edges. |
+| `nodes` | [`[Event]`](#event) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### ExportRequirementsPayload
+### `EventEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Event`](#event) | The item at the end of the edge. |
+
+### `ExportRequirementsPayload`
Autogenerated return type of ExportRequirements.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### ExternalIssue
+### `ExternalIssue`
Represents an external issue.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time | Timestamp of when the issue was created. |
-| `externalTracker` | String | Type of external tracker. |
-| `relativeReference` | String | Relative reference of the issue in the external tracker. |
-| `status` | String | Status of the issue in the external tracker. |
-| `title` | String | Title of the issue in the external tracker. |
-| `updatedAt` | Time | Timestamp of when the issue was updated. |
-| `webUrl` | String | URL to the issue in the external tracker. |
+| `createdAt` | [`Time`](#time) | Timestamp of when the issue was created. |
+| `externalTracker` | [`String`](#string) | Type of external tracker. |
+| `relativeReference` | [`String`](#string) | Relative reference of the issue in the external tracker. |
+| `status` | [`String`](#string) | Status of the issue in the external tracker. |
+| `title` | [`String`](#string) | Title of the issue in the external tracker. |
+| `updatedAt` | [`Time`](#time) | Timestamp of when the issue was updated. |
+| `webUrl` | [`String`](#string) | URL to the issue in the external tracker. |
-### GeoNode
+### `GeoNode`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `containerRepositoriesMaxCapacity` | Int | The maximum concurrency of container repository sync for this secondary node. |
-| `enabled` | Boolean | Indicates whether this Geo node is enabled. |
-| `filesMaxCapacity` | Int | The maximum concurrency of LFS/attachment backfill for this secondary node. |
-| `id` | ID! | ID of this GeoNode. |
-| `internalUrl` | String | The URL defined on the primary node that secondary nodes should use to contact it. |
-| `mergeRequestDiffRegistries` | MergeRequestDiffRegistryConnection | Find merge request diff registries on this Geo node. |
-| `minimumReverificationInterval` | Int | The interval (in days) in which the repository verification is valid. Once expired, it will be reverified. |
-| `name` | String | The unique identifier for this Geo node. |
-| `packageFileRegistries` | PackageFileRegistryConnection | Package file registries of the GeoNode. |
-| `primary` | Boolean | Indicates whether this Geo node is the primary. |
-| `reposMaxCapacity` | Int | The maximum concurrency of repository backfill for this secondary node. |
-| `selectiveSyncNamespaces` | NamespaceConnection | The namespaces that should be synced, if `selective_sync_type` == `namespaces`. |
-| `selectiveSyncShards` | String! => Array | The repository storages whose projects should be synced, if `selective_sync_type` == `shards`. |
-| `selectiveSyncType` | String | Indicates if syncing is limited to only specific groups, or shards. |
-| `snippetRepositoryRegistries` | SnippetRepositoryRegistryConnection | Find snippet repository registries on this Geo node. |
-| `syncObjectStorage` | Boolean | Indicates if this secondary node will replicate blobs in Object Storage. |
-| `terraformStateVersionRegistries` | TerraformStateVersionRegistryConnection | Find terraform state version registries on this Geo node. |
-| `url` | String | The user-facing URL for this Geo node. |
-| `verificationMaxCapacity` | Int | The maximum concurrency of repository verification for this secondary node. |
+| `containerRepositoriesMaxCapacity` | [`Int`](#int) | The maximum concurrency of container repository sync for this secondary node. |
+| `enabled` | [`Boolean`](#boolean) | Indicates whether this Geo node is enabled. |
+| `filesMaxCapacity` | [`Int`](#int) | The maximum concurrency of LFS/attachment backfill for this secondary node. |
+| `groupWikiRepositoryRegistries` | [`GroupWikiRepositoryRegistryConnection`](#groupwikirepositoryregistryconnection) | Find group wiki repository registries on this Geo node. |
+| `id` | [`ID!`](#id) | ID of this GeoNode. |
+| `internalUrl` | [`String`](#string) | The URL defined on the primary node that secondary nodes should use to contact it. |
+| `mergeRequestDiffRegistries` | [`MergeRequestDiffRegistryConnection`](#mergerequestdiffregistryconnection) | Find merge request diff registries on this Geo node. |
+| `minimumReverificationInterval` | [`Int`](#int) | The interval (in days) in which the repository verification is valid. Once expired, it will be reverified. |
+| `name` | [`String`](#string) | The unique identifier for this Geo node. |
+| `packageFileRegistries` | [`PackageFileRegistryConnection`](#packagefileregistryconnection) | Package file registries of the GeoNode. |
+| `primary` | [`Boolean`](#boolean) | Indicates whether this Geo node is the primary. |
+| `reposMaxCapacity` | [`Int`](#int) | The maximum concurrency of repository backfill for this secondary node. |
+| `selectiveSyncNamespaces` | [`NamespaceConnection`](#namespaceconnection) | The namespaces that should be synced, if `selective_sync_type` == `namespaces`. |
+| `selectiveSyncShards` | [`[String!]`](#string) | The repository storages whose projects should be synced, if `selective_sync_type` == `shards`. |
+| `selectiveSyncType` | [`String`](#string) | Indicates if syncing is limited to only specific groups, or shards. |
+| `snippetRepositoryRegistries` | [`SnippetRepositoryRegistryConnection`](#snippetrepositoryregistryconnection) | Find snippet repository registries on this Geo node. |
+| `syncObjectStorage` | [`Boolean`](#boolean) | Indicates if this secondary node will replicate blobs in Object Storage. |
+| `terraformStateVersionRegistries` | [`TerraformStateVersionRegistryConnection`](#terraformstateversionregistryconnection) | Find terraform state version registries on this Geo node. |
+| `url` | [`String`](#string) | The user-facing URL for this Geo node. |
+| `verificationMaxCapacity` | [`Int`](#int) | The maximum concurrency of repository verification for this secondary node. |
-### GitlabSubscriptionActivatePayload
+### `GitlabSubscriptionActivatePayload`
Autogenerated return type of GitlabSubscriptionActivate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-
-### GrafanaIntegration
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `createdAt` | Time! | Timestamp of the issue's creation. |
-| `enabled` | Boolean! | Indicates whether Grafana integration is enabled. |
-| `grafanaUrl` | String! | URL for the Grafana host for the Grafana integration. |
-| `id` | ID! | Internal ID of the Grafana integration. |
-| `updatedAt` | Time! | Timestamp of the issue's last activity. |
-
-### Group
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `actualRepositorySizeLimit` | Float | Size limit for repositories in the namespace in bytes. |
-| `additionalPurchasedStorageSize` | Float | Additional storage purchased for the root namespace in bytes. |
-| `autoDevopsEnabled` | Boolean | Indicates whether Auto DevOps is enabled for all projects within this group. |
-| `avatarUrl` | String | Avatar URL of the group. |
-| `board` | Board | A single board of the group. |
-| `boards` | BoardConnection | Boards of the group. |
-| `codeCoverageActivities` | CodeCoverageActivityConnection | Represents the code coverage activity for this group. |
-| `complianceFrameworks` | ComplianceFrameworkConnection | Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled. |
-| `containerRepositories` | ContainerRepositoryConnection | Container repositories of the group. |
-| `containerRepositoriesCount` | Int! | Number of container repositories in the group. |
-| `containsLockedProjects` | Boolean! | Includes at least one project where the repository size exceeds the limit. |
-| `customEmoji` | CustomEmojiConnection | Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled. |
-| `description` | String | Description of the namespace. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `emailsDisabled` | Boolean | Indicates if a group has email notifications disabled. |
-| `epic` | Epic | Find a single epic. |
-| `epicBoard` | EpicBoard | Find a single epic board. |
-| `epicBoards` | EpicBoardConnection | Find epic boards. |
-| `epics` | EpicConnection | Find epics. |
-| `epicsEnabled` | Boolean | Indicates if Epics are enabled for namespace |
-| `fullName` | String! | Full name of the namespace. |
-| `fullPath` | ID! | Full path of the namespace. |
-| `groupMembers` | GroupMemberConnection | A membership of a user within this group. |
-| `groupTimelogsEnabled` | Boolean | Indicates if Group timelogs are enabled for namespace |
-| `id` | ID! | ID of the namespace. |
-| `isTemporaryStorageIncreaseEnabled` | Boolean! | Status of the temporary storage increase. |
-| `issues` | IssueConnection | Issues for projects in this group. |
-| `iterations` | IterationConnection | Find iterations. |
-| `label` | Label | A label available on this group. |
-| `labels` | LabelConnection | Labels available on this group. |
-| `lfsEnabled` | Boolean | Indicates if Large File Storage (LFS) is enabled for namespace. |
-| `mentionsDisabled` | Boolean | Indicates if a group is disabled from getting mentioned. |
-| `mergeRequests` | MergeRequestConnection | Merge requests for projects in this group. |
-| `milestones` | MilestoneConnection | Milestones of the group. |
-| `name` | String! | Name of the namespace. |
-| `packageSettings` | PackageSettings | The package settings for the namespace. |
-| `parent` | Group | Parent group. |
-| `path` | String! | Path of the namespace. |
-| `projectCreationLevel` | String | The permission level required to create projects in the group. |
-| `projects` | ProjectConnection! | Projects within this namespace. |
-| `repositorySizeExcessProjectCount` | Int! | Number of projects in the root namespace where the repository size exceeds the limit. |
-| `requestAccessEnabled` | Boolean | Indicates if users can request access to namespace. |
-| `requireTwoFactorAuthentication` | Boolean | Indicates if all users in this group are required to set up two-factor authentication. |
-| `rootStorageStatistics` | RootStorageStatistics | Aggregated storage statistics of the namespace. Only available for root namespaces. |
-| `shareWithGroupLock` | Boolean | Indicates if sharing a project with another group within this group is prevented. |
-| `stats` | GroupStats | Group statistics. |
-| `storageSizeLimit` | Float | Total storage limit of the root namespace in bytes. |
-| `subgroupCreationLevel` | String | The permission level required to create subgroups within the group. |
-| `temporaryStorageIncreaseEndsOn` | Time | Date until the temporary storage increase is active. |
-| `timelogs` | TimelogConnection! | Time logged in issues by group members. |
-| `totalRepositorySize` | Float | Total repository size of all projects in the root namespace in bytes. |
-| `totalRepositorySizeExcess` | Float | Total excess repository size of all projects in the root namespace in bytes. |
-| `twoFactorGracePeriod` | Int | Time before two-factor authentication is enforced. |
-| `userPermissions` | GroupPermissions! | Permissions for the current user on the resource |
-| `visibility` | String | Visibility of the namespace. |
-| `vulnerabilities` | VulnerabilityConnection | Vulnerabilities reported on the projects in the group and its subgroups. |
-| `vulnerabilitiesCountByDay` | VulnerabilitiesCountByDayConnection | Number of vulnerabilities per day for the projects in the group and its subgroups. |
-| `vulnerabilitiesCountByDayAndSeverity` **{warning-solid}** | VulnerabilitiesCountByDayAndSeverityConnection | **Deprecated:** Use `vulnerabilitiesCountByDay`. Deprecated in 13.3. |
-| `vulnerabilityGrades` | VulnerableProjectsByGrade! => Array | Represents vulnerable project counts for each grade. |
-| `vulnerabilityScanners` | VulnerabilityScannerConnection | Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups. |
-| `vulnerabilitySeveritiesCount` | VulnerabilitySeveritiesCount | Counts for each vulnerability severity in the group and its subgroups. |
-| `webUrl` | String! | Web URL of the group. |
-
-### GroupMember
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `GrafanaIntegration`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `createdAt` | [`Time!`](#time) | Timestamp of the issue's creation. |
+| `enabled` | [`Boolean!`](#boolean) | Indicates whether Grafana integration is enabled. |
+| `grafanaUrl` | [`String!`](#string) | URL for the Grafana host for the Grafana integration. |
+| `id` | [`ID!`](#id) | Internal ID of the Grafana integration. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of the issue's last activity. |
+
+### `Group`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. |
+| `additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. |
+| `autoDevopsEnabled` | [`Boolean`](#boolean) | Indicates whether Auto DevOps is enabled for all projects within this group. |
+| `avatarUrl` | [`String`](#string) | Avatar URL of the group. |
+| `board` | [`Board`](#board) | A single board of the group. |
+| `boards` | [`BoardConnection`](#boardconnection) | Boards of the group. |
+| `codeCoverageActivities` | [`CodeCoverageActivityConnection`](#codecoverageactivityconnection) | Represents the code coverage activity for this group. |
+| `complianceFrameworks` | [`ComplianceFrameworkConnection`](#complianceframeworkconnection) | Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled. |
+| `containerRepositories` | [`ContainerRepositoryConnection`](#containerrepositoryconnection) | Container repositories of the group. |
+| `containerRepositoriesCount` | [`Int!`](#int) | Number of container repositories in the group. |
+| `containsLockedProjects` | [`Boolean!`](#boolean) | Includes at least one project where the repository size exceeds the limit. |
+| `customEmoji` | [`CustomEmojiConnection`](#customemojiconnection) | Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled. |
+| `description` | [`String`](#string) | Description of the namespace. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `emailsDisabled` | [`Boolean`](#boolean) | Indicates if a group has email notifications disabled. |
+| `epic` | [`Epic`](#epic) | Find a single epic. |
+| `epicBoard` | [`EpicBoard`](#epicboard) | Find a single epic board. |
+| `epicBoards` | [`EpicBoardConnection`](#epicboardconnection) | Find epic boards. |
+| `epics` | [`EpicConnection`](#epicconnection) | Find epics. |
+| `epicsEnabled` | [`Boolean`](#boolean) | Indicates if Epics are enabled for namespace |
+| `fullName` | [`String!`](#string) | Full name of the namespace. |
+| `fullPath` | [`ID!`](#id) | Full path of the namespace. |
+| `groupMembers` | [`GroupMemberConnection`](#groupmemberconnection) | A membership of a user within this group. |
+| `groupTimelogsEnabled` | [`Boolean`](#boolean) | Indicates if Group timelogs are enabled for namespace |
+| `id` | [`ID!`](#id) | ID of the namespace. |
+| `isTemporaryStorageIncreaseEnabled` | [`Boolean!`](#boolean) | Status of the temporary storage increase. |
+| `issues` | [`IssueConnection`](#issueconnection) | Issues for projects in this group. |
+| `iterationCadences` | [`IterationCadenceConnection`](#iterationcadenceconnection) | Find iteration cadences. |
+| `iterations` | [`IterationConnection`](#iterationconnection) | Find iterations. |
+| `label` | [`Label`](#label) | A label available on this group. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels available on this group. |
+| `lfsEnabled` | [`Boolean`](#boolean) | Indicates if Large File Storage (LFS) is enabled for namespace. |
+| `mentionsDisabled` | [`Boolean`](#boolean) | Indicates if a group is disabled from getting mentioned. |
+| `mergeRequests` | [`MergeRequestConnection`](#mergerequestconnection) | Merge requests for projects in this group. |
+| `milestones` | [`MilestoneConnection`](#milestoneconnection) | Milestones of the group. |
+| `name` | [`String!`](#string) | Name of the namespace. |
+| `packageSettings` | [`PackageSettings`](#packagesettings) | The package settings for the namespace. |
+| `packages` | [`PackageConnection`](#packageconnection) | Packages of the group. |
+| `parent` | [`Group`](#group) | Parent group. |
+| `path` | [`String!`](#string) | Path of the namespace. |
+| `projectCreationLevel` | [`String`](#string) | The permission level required to create projects in the group. |
+| `projects` | [`ProjectConnection!`](#projectconnection) | Projects within this namespace. |
+| `repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. |
+| `requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request access to namespace. |
+| `requireTwoFactorAuthentication` | [`Boolean`](#boolean) | Indicates if all users in this group are required to set up two-factor authentication. |
+| `rootStorageStatistics` | [`RootStorageStatistics`](#rootstoragestatistics) | Aggregated storage statistics of the namespace. Only available for root namespaces. |
+| `shareWithGroupLock` | [`Boolean`](#boolean) | Indicates if sharing a project with another group within this group is prevented. |
+| `stats` | [`GroupStats`](#groupstats) | Group statistics. |
+| `storageSizeLimit` | [`Float`](#float) | Total storage limit of the root namespace in bytes. |
+| `subgroupCreationLevel` | [`String`](#string) | The permission level required to create subgroups within the group. |
+| `temporaryStorageIncreaseEndsOn` | [`Time`](#time) | Date until the temporary storage increase is active. |
+| `timelogs` | [`TimelogConnection!`](#timelogconnection) | Time logged in issues by group members. |
+| `totalRepositorySize` | [`Float`](#float) | Total repository size of all projects in the root namespace in bytes. |
+| `totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. |
+| `twoFactorGracePeriod` | [`Int`](#int) | Time before two-factor authentication is enforced. |
+| `userPermissions` | [`GroupPermissions!`](#grouppermissions) | Permissions for the current user on the resource |
+| `visibility` | [`String`](#string) | Visibility of the namespace. |
+| `vulnerabilities` | [`VulnerabilityConnection`](#vulnerabilityconnection) | Vulnerabilities reported on the projects in the group and its subgroups. |
+| `vulnerabilitiesCountByDay` | [`VulnerabilitiesCountByDayConnection`](#vulnerabilitiescountbydayconnection) | Number of vulnerabilities per day for the projects in the group and its subgroups. |
+| `vulnerabilitiesCountByDayAndSeverity` **{warning-solid}** | [`VulnerabilitiesCountByDayAndSeverityConnection`](#vulnerabilitiescountbydayandseverityconnection) | **Deprecated:** Use `vulnerabilitiesCountByDay`. Deprecated in 13.3. |
+| `vulnerabilityGrades` | [`[VulnerableProjectsByGrade!]!`](#vulnerableprojectsbygrade) | Represents vulnerable project counts for each grade. |
+| `vulnerabilityScanners` | [`VulnerabilityScannerConnection`](#vulnerabilityscannerconnection) | Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups. |
+| `vulnerabilitySeveritiesCount` | [`VulnerabilitySeveritiesCount`](#vulnerabilityseveritiescount) | Counts for each vulnerability severity in the group and its subgroups. |
+| `webUrl` | [`String!`](#string) | Web URL of the group. |
+
+### `GroupMember`
Represents a Group Membership.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `accessLevel` | AccessLevel | GitLab::Access level. |
-| `createdAt` | Time | Date and time the membership was created. |
-| `createdBy` | User | User that authorized membership. |
-| `expiresAt` | Time | Date and time the membership expires. |
-| `group` | Group | Group that a User is a member of. |
-| `id` | ID! | ID of the member. |
-| `updatedAt` | Time | Date and time the membership was last updated. |
-| `user` | User! | User that is associated with the member object. |
-| `userPermissions` | GroupPermissions! | Permissions for the current user on the resource |
+| `accessLevel` | [`AccessLevel`](#accesslevel) | GitLab::Access level. |
+| `createdAt` | [`Time`](#time) | Date and time the membership was created. |
+| `createdBy` | [`User`](#user) | User that authorized membership. |
+| `expiresAt` | [`Time`](#time) | Date and time the membership expires. |
+| `group` | [`Group`](#group) | Group that a User is a member of. |
+| `id` | [`ID!`](#id) | ID of the member. |
+| `updatedAt` | [`Time`](#time) | Date and time the membership was last updated. |
+| `user` | [`User!`](#user) | User that is associated with the member object. |
+| `userPermissions` | [`GroupPermissions!`](#grouppermissions) | Permissions for the current user on the resource |
+
+### `GroupMemberConnection`
+
+The connection type for GroupMember.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[GroupMemberEdge]`](#groupmemberedge) | A list of edges. |
+| `nodes` | [`[GroupMember]`](#groupmember) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `GroupMemberEdge`
-### GroupPermissions
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `readGroup` | Boolean! | Indicates the user can perform `read_group` on this resource |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`GroupMember`](#groupmember) | The item at the end of the edge. |
-### GroupReleaseStats
+### `GroupPermissions`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `readGroup` | [`Boolean!`](#boolean) | Indicates the user can perform `read_group` on this resource |
+
+### `GroupReleaseStats`
Contains release-related statistics about a group.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `releasesCount` | Int | Total number of releases in all descendant projects of the group. Will always return `null` if `group_level_release_statistics` feature flag is disabled |
-| `releasesPercentage` | Int | Percentage of the group's descendant projects that have at least one release. Will always return `null` if `group_level_release_statistics` feature flag is disabled |
+| `releasesCount` | [`Int`](#int) | Total number of releases in all descendant projects of the group. Will always return `null` if `group_level_release_statistics` feature flag is disabled |
+| `releasesPercentage` | [`Int`](#int) | Percentage of the group's descendant projects that have at least one release. Will always return `null` if `group_level_release_statistics` feature flag is disabled |
-### GroupStats
+### `GroupStats`
Contains statistics about a group.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `releaseStats` | GroupReleaseStats | Statistics related to releases within the group. |
+| `releaseStats` | [`GroupReleaseStats`](#groupreleasestats) | Statistics related to releases within the group. |
-### HttpIntegrationCreatePayload
+### `GroupWikiRepositoryRegistry`
+
+Represents the Geo sync and verification state of a group wiki repository.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `createdAt` | [`Time`](#time) | Timestamp when the GroupWikiRepositoryRegistry was created |
+| `groupWikiRepositoryId` | [`ID!`](#id) | ID of the Group Wiki Repository. |
+| `id` | [`ID!`](#id) | ID of the GroupWikiRepositoryRegistry |
+| `lastSyncFailure` | [`String`](#string) | Error message during sync of the GroupWikiRepositoryRegistry |
+| `lastSyncedAt` | [`Time`](#time) | Timestamp of the most recent successful sync of the GroupWikiRepositoryRegistry |
+| `retryAt` | [`Time`](#time) | Timestamp after which the GroupWikiRepositoryRegistry should be resynced |
+| `retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the GroupWikiRepositoryRegistry |
+| `state` | [`RegistryState`](#registrystate) | Sync state of the GroupWikiRepositoryRegistry |
+
+### `GroupWikiRepositoryRegistryConnection`
+
+The connection type for GroupWikiRepositoryRegistry.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[GroupWikiRepositoryRegistryEdge]`](#groupwikirepositoryregistryedge) | A list of edges. |
+| `nodes` | [`[GroupWikiRepositoryRegistry]`](#groupwikirepositoryregistry) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `GroupWikiRepositoryRegistryEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`GroupWikiRepositoryRegistry`](#groupwikirepositoryregistry) | The item at the end of the edge. |
+
+### `HttpIntegrationCreatePayload`
Autogenerated return type of HttpIntegrationCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `integration` | [`AlertManagementHttpIntegration`](#alertmanagementhttpintegration) | The HTTP integration. |
-### HttpIntegrationDestroyPayload
+### `HttpIntegrationDestroyPayload`
Autogenerated return type of HttpIntegrationDestroy.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `integration` | [`AlertManagementHttpIntegration`](#alertmanagementhttpintegration) | The HTTP integration. |
-### HttpIntegrationResetTokenPayload
+### `HttpIntegrationResetTokenPayload`
Autogenerated return type of HttpIntegrationResetToken.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `integration` | [`AlertManagementHttpIntegration`](#alertmanagementhttpintegration) | The HTTP integration. |
-### HttpIntegrationUpdatePayload
+### `HttpIntegrationUpdatePayload`
Autogenerated return type of HttpIntegrationUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `integration` | [`AlertManagementHttpIntegration`](#alertmanagementhttpintegration) | The HTTP integration. |
-### IncidentManagementOncallRotation
+### `IncidentManagementOncallRotation`
Describes an incident management on-call rotation.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | IncidentManagementOncallRotationID! | ID of the on-call rotation. |
-| `length` | Int | Length of the on-call schedule, in the units specified by lengthUnit. |
-| `lengthUnit` | OncallRotationUnitEnum | Unit of the on-call rotation length. |
-| `name` | String! | Name of the on-call rotation. |
-| `participants` | OncallParticipantTypeConnection | Participants of the on-call rotation. |
-| `shifts` | IncidentManagementOncallShiftConnection | Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month. |
-| `startsAt` | Time | Start date of the on-call rotation. |
+| `activePeriod` | [`OncallRotationActivePeriodType`](#oncallrotationactiveperiodtype) | Active period for the on-call rotation. |
+| `endsAt` | [`Time`](#time) | End date and time of the on-call rotation. |
+| `id` | [`IncidentManagementOncallRotationID!`](#incidentmanagementoncallrotationid) | ID of the on-call rotation. |
+| `length` | [`Int`](#int) | Length of the on-call schedule, in the units specified by lengthUnit. |
+| `lengthUnit` | [`OncallRotationUnitEnum`](#oncallrotationunitenum) | Unit of the on-call rotation length. |
+| `name` | [`String!`](#string) | Name of the on-call rotation. |
+| `participants` | [`OncallParticipantTypeConnection`](#oncallparticipanttypeconnection) | Participants of the on-call rotation. |
+| `shifts` | [`IncidentManagementOncallShiftConnection`](#incidentmanagementoncallshiftconnection) | Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month. |
+| `startsAt` | [`Time`](#time) | Start date of the on-call rotation. |
+
+### `IncidentManagementOncallRotationConnection`
+
+The connection type for IncidentManagementOncallRotation.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[IncidentManagementOncallRotationEdge]`](#incidentmanagementoncallrotationedge) | A list of edges. |
+| `nodes` | [`[IncidentManagementOncallRotation]`](#incidentmanagementoncallrotation) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### IncidentManagementOncallSchedule
+### `IncidentManagementOncallRotationEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`IncidentManagementOncallRotation`](#incidentmanagementoncallrotation) | The item at the end of the edge. |
+
+### `IncidentManagementOncallSchedule`
Describes an incident management on-call schedule.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String | Description of the on-call schedule. |
-| `iid` | ID! | Internal ID of the on-call schedule. |
-| `name` | String! | Name of the on-call schedule. |
-| `rotations` | IncidentManagementOncallRotationConnection! | On-call rotations for the on-call schedule. |
-| `timezone` | String! | Time zone of the on-call schedule. |
+| `description` | [`String`](#string) | Description of the on-call schedule. |
+| `iid` | [`ID!`](#id) | Internal ID of the on-call schedule. |
+| `name` | [`String!`](#string) | Name of the on-call schedule. |
+| `rotations` | [`IncidentManagementOncallRotationConnection!`](#incidentmanagementoncallrotationconnection) | On-call rotations for the on-call schedule. |
+| `timezone` | [`String!`](#string) | Time zone of the on-call schedule. |
+
+### `IncidentManagementOncallScheduleConnection`
+
+The connection type for IncidentManagementOncallSchedule.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[IncidentManagementOncallScheduleEdge]`](#incidentmanagementoncallscheduleedge) | A list of edges. |
+| `nodes` | [`[IncidentManagementOncallSchedule]`](#incidentmanagementoncallschedule) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### IncidentManagementOncallShift
+### `IncidentManagementOncallScheduleEdge`
-A block of time for which a participant is on-call..
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `endsAt` | Time | End time of the on-call shift. |
-| `participant` | OncallParticipantType | Participant assigned to the on-call shift. |
-| `startsAt` | Time | Start time of the on-call shift. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`IncidentManagementOncallSchedule`](#incidentmanagementoncallschedule) | The item at the end of the edge. |
+
+### `IncidentManagementOncallShift`
-### InstanceSecurityDashboard
+A block of time for which a participant is on-call.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `projects` | ProjectConnection! | Projects selected in Instance Security Dashboard. |
-| `vulnerabilityGrades` | VulnerableProjectsByGrade! => Array | Represents vulnerable project counts for each grade. |
-| `vulnerabilityScanners` | VulnerabilityScannerConnection | Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard. |
-| `vulnerabilitySeveritiesCount` | VulnerabilitySeveritiesCount | Counts for each vulnerability severity from projects selected in Instance Security Dashboard. |
+| `endsAt` | [`Time`](#time) | End time of the on-call shift. |
+| `participant` | [`OncallParticipantType`](#oncallparticipanttype) | Participant assigned to the on-call shift. |
+| `startsAt` | [`Time`](#time) | Start time of the on-call shift. |
-### InstanceStatisticsMeasurement
+### `IncidentManagementOncallShiftConnection`
-Represents a recorded measurement (object count) for the Admins.
+The connection type for IncidentManagementOncallShift.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[IncidentManagementOncallShiftEdge]`](#incidentmanagementoncallshiftedge) | A list of edges. |
+| `nodes` | [`[IncidentManagementOncallShift]`](#incidentmanagementoncallshift) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `IncidentManagementOncallShiftEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`IncidentManagementOncallShift`](#incidentmanagementoncallshift) | The item at the end of the edge. |
+
+### `InstanceSecurityDashboard`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `projects` | [`ProjectConnection!`](#projectconnection) | Projects selected in Instance Security Dashboard. |
+| `vulnerabilityGrades` | [`[VulnerableProjectsByGrade!]!`](#vulnerableprojectsbygrade) | Represents vulnerable project counts for each grade. |
+| `vulnerabilityScanners` | [`VulnerabilityScannerConnection`](#vulnerabilityscannerconnection) | Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard. |
+| `vulnerabilitySeveritiesCount` | [`VulnerabilitySeveritiesCount`](#vulnerabilityseveritiescount) | Counts for each vulnerability severity from projects selected in Instance Security Dashboard. |
+
+### `Issue`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `alertManagementAlert` | [`AlertManagementAlert`](#alertmanagementalert) | Alert associated to this issue. |
+| `assignees` | [`UserConnection`](#userconnection) | Assignees of the issue. |
+| `author` | [`User!`](#user) | User that created the issue. |
+| `blocked` | [`Boolean!`](#boolean) | Indicates the issue is blocked. |
+| `blockedByCount` | [`Int`](#int) | Count of issues blocking this issue. |
+| `blockedByIssues` | [`IssueConnection`](#issueconnection) | Issues blocking this issue. |
+| `closedAt` | [`Time`](#time) | Timestamp of when the issue was closed. |
+| `confidential` | [`Boolean!`](#boolean) | Indicates the issue is confidential. |
+| `createNoteEmail` | [`String`](#string) | User specific email address for the issue. |
+| `createdAt` | [`Time!`](#time) | Timestamp of when the issue was created. |
+| `currentUserTodos` | [`TodoConnection!`](#todoconnection) | To-do items for the current user. |
+| `description` | [`String`](#string) | Description of the issue. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `designCollection` | [`DesignCollection`](#designcollection) | Collection of design images associated with this issue. |
+| `discussionLocked` | [`Boolean!`](#boolean) | Indicates discussion is locked on the issue. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `downvotes` | [`Int!`](#int) | Number of downvotes the issue has received. |
+| `dueDate` | [`Time`](#time) | Due date of the issue. |
+| `emailsDisabled` | [`Boolean!`](#boolean) | Indicates if a project has email notifications disabled: `true` if email notifications are disabled. |
+| `epic` | [`Epic`](#epic) | Epic to which this issue belongs. |
+| `healthStatus` | [`HealthStatus`](#healthstatus) | Current health status. |
+| `humanTimeEstimate` | [`String`](#string) | Human-readable time estimate of the issue. |
+| `humanTotalTimeSpent` | [`String`](#string) | Human-readable total time reported as spent on the issue. |
+| `id` | [`ID!`](#id) | ID of the issue. |
+| `iid` | [`ID!`](#id) | Internal ID of the issue. |
+| `iteration` | [`Iteration`](#iteration) | Iteration of the issue. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels of the issue. |
+| `metricImages` | [`[MetricImage!]`](#metricimage) | Metric images associated to the issue. |
+| `milestone` | [`Milestone`](#milestone) | Milestone of the issue. |
+| `moved` | [`Boolean`](#boolean) | Indicates if issue got moved from other project. |
+| `movedTo` | [`Issue`](#issue) | Updated Issue after it got moved to another project. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `participants` | [`UserConnection`](#userconnection) | List of participants in the issue. |
+| `reference` | [`String!`](#string) | Internal reference of the issue. Returned in shortened format by default. |
+| `relativePosition` | [`Int`](#int) | Relative position of the issue (used for positioning in epic tree and issue boards). |
+| `severity` | [`IssuableSeverity`](#issuableseverity) | Severity level of the incident. |
+| `slaDueAt` | [`Time`](#time) | Timestamp of when the issue SLA expires. |
+| `state` | [`IssueState!`](#issuestate) | State of the issue. |
+| `statusPagePublishedIncident` | [`Boolean`](#boolean) | Indicates whether an issue is published to the status page. |
+| `subscribed` | [`Boolean!`](#boolean) | Indicates the currently logged in user is subscribed to the issue. |
+| `taskCompletionStatus` | [`TaskCompletionStatus!`](#taskcompletionstatus) | Task completion status of the issue. |
+| `timeEstimate` | [`Int!`](#int) | Time estimate of the issue. |
+| `title` | [`String!`](#string) | Title of the issue. |
+| `titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title` |
+| `totalTimeSpent` | [`Int!`](#int) | Total time reported as spent on the issue. |
+| `type` | [`IssueType`](#issuetype) | Type of the issue. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of when the issue was last updated. |
+| `updatedBy` | [`User`](#user) | User that last updated the issue. |
+| `upvotes` | [`Int!`](#int) | Number of upvotes the issue has received. |
+| `userDiscussionsCount` | [`Int!`](#int) | Number of user discussions in the issue. |
+| `userNotesCount` | [`Int!`](#int) | Number of user notes of the issue. |
+| `userPermissions` | [`IssuePermissions!`](#issuepermissions) | Permissions for the current user on the resource |
+| `webPath` | [`String!`](#string) | Web path of the issue. |
+| `webUrl` | [`String!`](#string) | Web URL of the issue. |
+| `weight` | [`Int`](#int) | Weight of the issue. |
+
+### `IssueConnection`
+
+The connection type for Issue.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[IssueEdge]`](#issueedge) | A list of edges. |
+| `nodes` | [`[Issue]`](#issue) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+| `weight` | [`Int!`](#int) | Total weight of issues collection. |
+
+### `IssueEdge`
+
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int! | Object count. |
-| `identifier` | MeasurementIdentifier! | The type of objects being measured. |
-| `recordedAt` | Time | The time the measurement was recorded. |
-
-### Issue
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `alertManagementAlert` | AlertManagementAlert | Alert associated to this issue. |
-| `assignees` | UserConnection | Assignees of the issue. |
-| `author` | User! | User that created the issue. |
-| `blocked` | Boolean! | Indicates the issue is blocked. |
-| `blockedByCount` | Int | Count of issues blocking this issue. |
-| `closedAt` | Time | Timestamp of when the issue was closed. |
-| `confidential` | Boolean! | Indicates the issue is confidential. |
-| `createNoteEmail` | String | User specific email address for the issue. |
-| `createdAt` | Time! | Timestamp of when the issue was created. |
-| `currentUserTodos` | TodoConnection! | To-do items for the current user. |
-| `description` | String | Description of the issue. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `designCollection` | DesignCollection | Collection of design images associated with this issue. |
-| `discussionLocked` | Boolean! | Indicates discussion is locked on the issue. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `downvotes` | Int! | Number of downvotes the issue has received. |
-| `dueDate` | Time | Due date of the issue. |
-| `emailsDisabled` | Boolean! | Indicates if a project has email notifications disabled: `true` if email notifications are disabled. |
-| `epic` | Epic | Epic to which this issue belongs. |
-| `healthStatus` | HealthStatus | Current health status. |
-| `humanTimeEstimate` | String | Human-readable time estimate of the issue. |
-| `humanTotalTimeSpent` | String | Human-readable total time reported as spent on the issue. |
-| `id` | ID! | ID of the issue. |
-| `iid` | ID! | Internal ID of the issue. |
-| `iteration` | Iteration | Iteration of the issue. |
-| `labels` | LabelConnection | Labels of the issue. |
-| `metricImages` | MetricImage! => Array | Metric images associated to the issue. |
-| `milestone` | Milestone | Milestone of the issue. |
-| `moved` | Boolean | Indicates if issue got moved from other project. |
-| `movedTo` | Issue | Updated Issue after it got moved to another project. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `participants` | UserConnection | List of participants in the issue. |
-| `reference` | String! | Internal reference of the issue. Returned in shortened format by default. |
-| `relativePosition` | Int | Relative position of the issue (used for positioning in epic tree and issue boards). |
-| `severity` | IssuableSeverity | Severity level of the incident. |
-| `slaDueAt` | Time | Timestamp of when the issue SLA expires. |
-| `state` | IssueState! | State of the issue. |
-| `statusPagePublishedIncident` | Boolean | Indicates whether an issue is published to the status page. |
-| `subscribed` | Boolean! | Indicates the currently logged in user is subscribed to the issue. |
-| `taskCompletionStatus` | TaskCompletionStatus! | Task completion status of the issue. |
-| `timeEstimate` | Int! | Time estimate of the issue. |
-| `title` | String! | Title of the issue. |
-| `titleHtml` | String | The GitLab Flavored Markdown rendering of `title` |
-| `totalTimeSpent` | Int! | Total time reported as spent on the issue. |
-| `type` | IssueType | Type of the issue. |
-| `updatedAt` | Time! | Timestamp of when the issue was last updated. |
-| `updatedBy` | User | User that last updated the issue. |
-| `upvotes` | Int! | Number of upvotes the issue has received. |
-| `userDiscussionsCount` | Int! | Number of user discussions in the issue. |
-| `userNotesCount` | Int! | Number of user notes of the issue. |
-| `userPermissions` | IssuePermissions! | Permissions for the current user on the resource |
-| `webPath` | String! | Web path of the issue. |
-| `webUrl` | String! | Web URL of the issue. |
-| `weight` | Int | Weight of the issue. |
-
-### IssueMoveListPayload
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Issue`](#issue) | The item at the end of the edge. |
+
+### `IssueMoveListPayload`
Autogenerated return type of IssueMoveList.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueMovePayload
+### `IssueMovePayload`
Autogenerated return type of IssueMove.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssuePermissions
+### `IssuePermissions`
Check permissions for the current user on a issue.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminIssue` | Boolean! | Indicates the user can perform `admin_issue` on this resource |
-| `createDesign` | Boolean! | Indicates the user can perform `create_design` on this resource |
-| `createNote` | Boolean! | Indicates the user can perform `create_note` on this resource |
-| `destroyDesign` | Boolean! | Indicates the user can perform `destroy_design` on this resource |
-| `readDesign` | Boolean! | Indicates the user can perform `read_design` on this resource |
-| `readIssue` | Boolean! | Indicates the user can perform `read_issue` on this resource |
-| `reopenIssue` | Boolean! | Indicates the user can perform `reopen_issue` on this resource |
-| `updateIssue` | Boolean! | Indicates the user can perform `update_issue` on this resource |
+| `adminIssue` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_issue` on this resource |
+| `createDesign` | [`Boolean!`](#boolean) | Indicates the user can perform `create_design` on this resource |
+| `createNote` | [`Boolean!`](#boolean) | Indicates the user can perform `create_note` on this resource |
+| `destroyDesign` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_design` on this resource |
+| `readDesign` | [`Boolean!`](#boolean) | Indicates the user can perform `read_design` on this resource |
+| `readIssue` | [`Boolean!`](#boolean) | Indicates the user can perform `read_issue` on this resource |
+| `reopenIssue` | [`Boolean!`](#boolean) | Indicates the user can perform `reopen_issue` on this resource |
+| `updateIssue` | [`Boolean!`](#boolean) | Indicates the user can perform `update_issue` on this resource |
-### IssueSetAssigneesPayload
+### `IssueSetAssigneesPayload`
Autogenerated return type of IssueSetAssignees.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetConfidentialPayload
+### `IssueSetConfidentialPayload`
Autogenerated return type of IssueSetConfidential.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetDueDatePayload
+### `IssueSetDueDatePayload`
Autogenerated return type of IssueSetDueDate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetEpicPayload
+### `IssueSetEpicPayload`
Autogenerated return type of IssueSetEpic.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetIterationPayload
+### `IssueSetIterationPayload`
Autogenerated return type of IssueSetIteration.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetLockedPayload
+### `IssueSetLockedPayload`
Autogenerated return type of IssueSetLocked.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetSeverityPayload
+### `IssueSetSeverityPayload`
Autogenerated return type of IssueSetSeverity.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetSubscriptionPayload
+### `IssueSetSubscriptionPayload`
Autogenerated return type of IssueSetSubscription.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueSetWeightPayload
+### `IssueSetWeightPayload`
Autogenerated return type of IssueSetWeight.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### IssueStatusCountsType
+### `IssueStatusCountsType`
Represents total number of issues for the represented statuses.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `all` | Int | Number of issues with status ALL for the project |
-| `closed` | Int | Number of issues with status CLOSED for the project |
-| `opened` | Int | Number of issues with status OPENED for the project |
+| `all` | [`Int`](#int) | Number of issues with status ALL for the project |
+| `closed` | [`Int`](#int) | Number of issues with status CLOSED for the project |
+| `opened` | [`Int`](#int) | Number of issues with status OPENED for the project |
-### Iteration
+### `Iteration`
Represents an iteration object.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | Timestamp of iteration creation. |
-| `description` | String | Description of the iteration. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `dueDate` | Time | Timestamp of the iteration due date. |
-| `id` | ID! | ID of the iteration. |
-| `iid` | ID! | Internal ID of the iteration. |
-| `report` | TimeboxReport | Historically accurate report about the timebox. |
-| `scopedPath` | String | Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts. |
-| `scopedUrl` | String | Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts. |
-| `startDate` | Time | Timestamp of the iteration start date. |
-| `state` | IterationState! | State of the iteration. |
-| `title` | String! | Title of the iteration. |
-| `updatedAt` | Time! | Timestamp of last iteration update. |
-| `webPath` | String! | Web path of the iteration. |
-| `webUrl` | String! | Web URL of the iteration. |
+| `createdAt` | [`Time!`](#time) | Timestamp of iteration creation. |
+| `description` | [`String`](#string) | Description of the iteration. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `dueDate` | [`Time`](#time) | Timestamp of the iteration due date. |
+| `id` | [`ID!`](#id) | ID of the iteration. |
+| `iid` | [`ID!`](#id) | Internal ID of the iteration. |
+| `report` | [`TimeboxReport`](#timeboxreport) | Historically accurate report about the timebox. |
+| `scopedPath` | [`String`](#string) | Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts. |
+| `scopedUrl` | [`String`](#string) | Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts. |
+| `startDate` | [`Time`](#time) | Timestamp of the iteration start date. |
+| `state` | [`IterationState!`](#iterationstate) | State of the iteration. |
+| `title` | [`String!`](#string) | Title of the iteration. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of last iteration update. |
+| `webPath` | [`String!`](#string) | Web path of the iteration. |
+| `webUrl` | [`String!`](#string) | Web URL of the iteration. |
+
+### `IterationCadence`
+
+Represents an iteration cadence.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `active` | [`Boolean`](#boolean) | Whether the iteration cadence is active. |
+| `automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate future iterations. |
+| `durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. |
+| `id` | [`IterationsCadenceID!`](#iterationscadenceid) | Global ID of the iteration cadence. |
+| `iterationsInAdvance` | [`Int`](#int) | Future iterations to be created when iteration cadence is set to automatic. |
+| `startDate` | [`Time`](#time) | Timestamp of the iteration cadence start date. |
+| `title` | [`String!`](#string) | Title of the iteration cadence. |
+
+### `IterationCadenceConnection`
+
+The connection type for IterationCadence.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[IterationCadenceEdge]`](#iterationcadenceedge) | A list of edges. |
+| `nodes` | [`[IterationCadence]`](#iterationcadence) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `IterationCadenceCreatePayload`
+
+Autogenerated return type of IterationCadenceCreate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `iterationCadence` | [`IterationCadence`](#iterationcadence) | The created iteration cadence. |
+
+### `IterationCadenceEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`IterationCadence`](#iterationcadence) | The item at the end of the edge. |
+
+### `IterationConnection`
+
+The connection type for Iteration.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[IterationEdge]`](#iterationedge) | A list of edges. |
+| `nodes` | [`[Iteration]`](#iteration) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `IterationEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Iteration`](#iteration) | The item at the end of the edge. |
-### JiraImport
+### `JiraImport`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time | Timestamp of when the Jira import was created. |
-| `failedToImportCount` | Int! | Count of issues that failed to import. |
-| `importedIssuesCount` | Int! | Count of issues that were successfully imported. |
-| `jiraProjectKey` | String! | Project key for the imported Jira project. |
-| `scheduledAt` | Time | Timestamp of when the Jira import was scheduled. |
-| `scheduledBy` | User | User that started the Jira import. |
-| `totalIssueCount` | Int! | Total count of issues that were attempted to import. |
+| `createdAt` | [`Time`](#time) | Timestamp of when the Jira import was created. |
+| `failedToImportCount` | [`Int!`](#int) | Count of issues that failed to import. |
+| `importedIssuesCount` | [`Int!`](#int) | Count of issues that were successfully imported. |
+| `jiraProjectKey` | [`String!`](#string) | Project key for the imported Jira project. |
+| `scheduledAt` | [`Time`](#time) | Timestamp of when the Jira import was scheduled. |
+| `scheduledBy` | [`User`](#user) | User that started the Jira import. |
+| `totalIssueCount` | [`Int!`](#int) | Total count of issues that were attempted to import. |
+
+### `JiraImportConnection`
-### JiraImportStartPayload
+The connection type for JiraImport.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[JiraImportEdge]`](#jiraimportedge) | A list of edges. |
+| `nodes` | [`[JiraImport]`](#jiraimport) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `JiraImportEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`JiraImport`](#jiraimport) | The item at the end of the edge. |
+
+### `JiraImportStartPayload`
Autogenerated return type of JiraImportStart.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `jiraImport` | JiraImport | The Jira import data after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `jiraImport` | [`JiraImport`](#jiraimport) | The Jira import data after mutation. |
-### JiraImportUsersPayload
+### `JiraImportUsersPayload`
Autogenerated return type of JiraImportUsers.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `jiraUsers` | JiraUser! => Array | Users returned from Jira, matched by email and name if possible. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `jiraUsers` | [`[JiraUser!]`](#jirauser) | Users returned from Jira, matched by email and name if possible. |
+
+### `JiraProject`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `key` | [`String!`](#string) | Key of the Jira project. |
+| `name` | [`String`](#string) | Name of the Jira project. |
+| `projectId` | [`Int!`](#int) | ID of the Jira project. |
+
+### `JiraProjectConnection`
+
+The connection type for JiraProject.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[JiraProjectEdge]`](#jiraprojectedge) | A list of edges. |
+| `nodes` | [`[JiraProject]`](#jiraproject) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `JiraProjectEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`JiraProject`](#jiraproject) | The item at the end of the edge. |
-### JiraProject
+### `JiraService`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `key` | String! | Key of the Jira project. |
-| `name` | String | Name of the Jira project. |
-| `projectId` | Int! | ID of the Jira project. |
+| `active` | [`Boolean`](#boolean) | Indicates if the service is active. |
+| `projects` | [`JiraProjectConnection`](#jiraprojectconnection) | List of all Jira projects fetched through Jira REST API. |
+| `type` | [`String`](#string) | Class name of the service. |
-### JiraService
+### `JiraUser`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `active` | Boolean | Indicates if the service is active. |
-| `projects` | JiraProjectConnection | List of all Jira projects fetched through Jira REST API. |
-| `type` | String | Class name of the service. |
+| `gitlabId` | [`Int`](#int) | ID of the matched GitLab user. |
+| `gitlabName` | [`String`](#string) | Name of the matched GitLab user. |
+| `gitlabUsername` | [`String`](#string) | Username of the matched GitLab user. |
+| `jiraAccountId` | [`String!`](#string) | Account ID of the Jira user. |
+| `jiraDisplayName` | [`String!`](#string) | Display name of the Jira user. |
+| `jiraEmail` | [`String`](#string) | Email of the Jira user, returned only for users with public emails. |
-### JiraUser
+### `Label`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `gitlabId` | Int | ID of the matched GitLab user. |
-| `gitlabName` | String | Name of the matched GitLab user. |
-| `gitlabUsername` | String | Username of the matched GitLab user. |
-| `jiraAccountId` | String! | Account ID of the Jira user. |
-| `jiraDisplayName` | String! | Display name of the Jira user. |
-| `jiraEmail` | String | Email of the Jira user, returned only for users with public emails. |
+| `color` | [`String!`](#string) | Background color of the label. |
+| `createdAt` | [`Time!`](#time) | When this label was created. |
+| `description` | [`String`](#string) | Description of the label (Markdown rendered as HTML for caching). |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `id` | [`ID!`](#id) | Label ID. |
+| `textColor` | [`String!`](#string) | Text color of the label. |
+| `title` | [`String!`](#string) | Content of the label. |
+| `updatedAt` | [`Time!`](#time) | When this label was last updated. |
-### Label
+### `LabelConnection`
+
+The connection type for Label.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `color` | String! | Background color of the label. |
-| `description` | String | Description of the label (Markdown rendered as HTML for caching). |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `id` | ID! | Label ID. |
-| `textColor` | String! | Text color of the label. |
-| `title` | String! | Content of the label. |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[LabelEdge]`](#labeledge) | A list of edges. |
+| `nodes` | [`[Label]`](#label) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### LabelCreatePayload
+### `LabelCreatePayload`
Autogenerated return type of LabelCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `label` | Label | The label after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `label` | [`Label`](#label) | The label after mutation. |
+
+### `LabelEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Label`](#label) | The item at the end of the edge. |
-### MarkAsSpamSnippetPayload
+### `MarkAsSpamSnippetPayload`
Autogenerated return type of MarkAsSpamSnippet.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `snippet` | Snippet | The snippet after mutation. |
-
-### MergeRequest
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `allowCollaboration` | Boolean | Indicates if members of the target project can push to the fork. |
-| `approvalsLeft` | Int | Number of approvals left. |
-| `approvalsRequired` | Int | Number of approvals required. |
-| `approved` | Boolean! | Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured. |
-| `approvedBy` | UserConnection | Users who approved the merge request. |
-| `assignees` | UserConnection | Assignees of the merge request. |
-| `author` | User | User who created this merge request. |
-| `autoMergeEnabled` | Boolean! | Indicates if auto merge is enabled for the merge request. |
-| `autoMergeStrategy` | String | Selected auto merge strategy. |
-| `availableAutoMergeStrategies` | String! => Array | Array of available auto merge strategies. |
-| `commitCount` | Int | Number of commits in the merge request. |
-| `commitsWithoutMergeCommits` | CommitConnection | Merge request commits excluding merge commits. |
-| `conflicts` | Boolean! | Indicates if the merge request has conflicts. |
-| `createdAt` | Time! | Timestamp of when the merge request was created. |
-| `currentUserTodos` | TodoConnection! | To-do items for the current user. |
-| `defaultMergeCommitMessage` | String | Default merge commit message of the merge request. |
-| `defaultMergeCommitMessageWithDescription` | String | Default merge commit message of the merge request with description. |
-| `defaultSquashCommitMessage` | String | Default squash commit message of the merge request. |
-| `description` | String | Description of the merge request (Markdown rendered as HTML for caching). |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `diffHeadSha` | String | Diff head SHA of the merge request. |
-| `diffRefs` | DiffRefs | References of the base SHA, the head SHA, and the start SHA for this merge request. |
-| `diffStats` | DiffStats! => Array | Details about which files were changed in this merge request. |
-| `diffStatsSummary` | DiffStatsSummary | Summary of which files were changed in this merge request. |
-| `discussionLocked` | Boolean! | Indicates if comments on the merge request are locked to members only. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `downvotes` | Int! | Number of downvotes for the merge request. |
-| `forceRemoveSourceBranch` | Boolean | Indicates if the project settings will lead to source branch deletion after merge. |
-| `hasCi` | Boolean! | Indicates if the merge request has CI. |
-| `hasSecurityReports` | Boolean! | Indicates if the source branch has any security reports. |
-| `headPipeline` | Pipeline | The pipeline running on the branch HEAD of the merge request. |
-| `id` | ID! | ID of the merge request. |
-| `iid` | String! | Internal ID of the merge request. |
-| `inProgressMergeCommitSha` | String | Commit SHA of the merge request if merge is in progress. |
-| `labels` | LabelConnection | Labels of the merge request. |
-| `mergeCommitSha` | String | SHA of the merge request commit (set once merged). |
-| `mergeError` | String | Error message due to a merge error. |
-| `mergeOngoing` | Boolean! | Indicates if a merge is currently occurring. |
-| `mergeStatus` | String | Status of the merge request. |
-| `mergeTrainsCount` | Int | Number of merge requests in the merge train. |
-| `mergeUser` | User | User who merged this merge request. |
-| `mergeWhenPipelineSucceeds` | Boolean | Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS). |
-| `mergeable` | Boolean! | Indicates if the merge request is mergeable. |
-| `mergeableDiscussionsState` | Boolean | Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged. |
-| `mergedAt` | Time | Timestamp of when the merge request was merged, null if not merged. |
-| `milestone` | Milestone | The milestone of the merge request. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `participants` | UserConnection | Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes. |
-| `pipelines` | PipelineConnection | Pipelines for the merge request. Note: for performance reasons, no more than the most recent 500 pipelines will be returned. |
-| `project` | Project! | Alias for target_project. |
-| `projectId` | Int! | ID of the merge request project. |
-| `rebaseCommitSha` | String | Rebase commit SHA of the merge request. |
-| `rebaseInProgress` | Boolean! | Indicates if there is a rebase currently in progress for the merge request. |
-| `reference` | String! | Internal reference of the merge request. Returned in shortened format by default. |
-| `reviewers` | UserConnection | Users from whom a review has been requested. |
-| `securityAutoFix` | Boolean | Indicates if the merge request is created by @GitLab-Security-Bot. |
-| `shouldBeRebased` | Boolean! | Indicates if the merge request will be rebased. |
-| `shouldRemoveSourceBranch` | Boolean | Indicates if the source branch of the merge request will be deleted after merge. |
-| `sourceBranch` | String! | Source branch of the merge request. |
-| `sourceBranchExists` | Boolean! | Indicates if the source branch of the merge request exists. |
-| `sourceBranchProtected` | Boolean! | Indicates if the source branch is protected. |
-| `sourceProject` | Project | Source project of the merge request. |
-| `sourceProjectId` | Int | ID of the merge request source project. |
-| `squash` | Boolean! | Indicates if squash on merge is enabled. |
-| `squashOnMerge` | Boolean! | Indicates if squash on merge is enabled. |
-| `state` | MergeRequestState! | State of the merge request. |
-| `subscribed` | Boolean! | Indicates if the currently logged in user is subscribed to this merge request. |
-| `targetBranch` | String! | Target branch of the merge request. |
-| `targetBranchExists` | Boolean! | Indicates if the target branch of the merge request exists. |
-| `targetProject` | Project! | Target project of the merge request. |
-| `targetProjectId` | Int! | ID of the merge request target project. |
-| `taskCompletionStatus` | TaskCompletionStatus! | Completion status of tasks |
-| `timeEstimate` | Int! | Time estimate of the merge request. |
-| `title` | String! | Title of the merge request. |
-| `titleHtml` | String | The GitLab Flavored Markdown rendering of `title` |
-| `totalTimeSpent` | Int! | Total time reported as spent on the merge request. |
-| `updatedAt` | Time! | Timestamp of when the merge request was last updated. |
-| `upvotes` | Int! | Number of upvotes for the merge request. |
-| `userDiscussionsCount` | Int | Number of user discussions in the merge request. |
-| `userNotesCount` | Int | User notes count of the merge request. |
-| `userPermissions` | MergeRequestPermissions! | Permissions for the current user on the resource |
-| `webUrl` | String | Web URL of the merge request. |
-| `workInProgress` | Boolean! | Indicates if the merge request is a work in progress (WIP). |
-
-### MergeRequestCreatePayload
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `snippet` | [`Snippet`](#snippet) | The snippet after mutation. |
+
+### `MemberInterfaceConnection`
+
+The connection type for MemberInterface.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[MemberInterfaceEdge]`](#memberinterfaceedge) | A list of edges. |
+| `nodes` | [`[MemberInterface]`](#memberinterface) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `MemberInterfaceEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`MemberInterface`](#memberinterface) | The item at the end of the edge. |
+
+### `MergeRequest`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `allowCollaboration` | [`Boolean`](#boolean) | Indicates if members of the target project can push to the fork. |
+| `approvalsLeft` | [`Int`](#int) | Number of approvals left. |
+| `approvalsRequired` | [`Int`](#int) | Number of approvals required. |
+| `approved` | [`Boolean!`](#boolean) | Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured. |
+| `approvedBy` | [`UserConnection`](#userconnection) | Users who approved the merge request. |
+| `assignees` | [`UserConnection`](#userconnection) | Assignees of the merge request. |
+| `author` | [`User`](#user) | User who created this merge request. |
+| `autoMergeEnabled` | [`Boolean!`](#boolean) | Indicates if auto merge is enabled for the merge request. |
+| `autoMergeStrategy` | [`String`](#string) | Selected auto merge strategy. |
+| `availableAutoMergeStrategies` | [`[String!]`](#string) | Array of available auto merge strategies. |
+| `commitCount` | [`Int`](#int) | Number of commits in the merge request. |
+| `commitsWithoutMergeCommits` | [`CommitConnection`](#commitconnection) | Merge request commits excluding merge commits. |
+| `conflicts` | [`Boolean!`](#boolean) | Indicates if the merge request has conflicts. |
+| `createdAt` | [`Time!`](#time) | Timestamp of when the merge request was created. |
+| `currentUserTodos` | [`TodoConnection!`](#todoconnection) | To-do items for the current user. |
+| `defaultMergeCommitMessage` | [`String`](#string) | Default merge commit message of the merge request. |
+| `defaultMergeCommitMessageWithDescription` | [`String`](#string) | Default merge commit message of the merge request with description. |
+| `defaultSquashCommitMessage` | [`String`](#string) | Default squash commit message of the merge request. |
+| `description` | [`String`](#string) | Description of the merge request (Markdown rendered as HTML for caching). |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `diffHeadSha` | [`String`](#string) | Diff head SHA of the merge request. |
+| `diffRefs` | [`DiffRefs`](#diffrefs) | References of the base SHA, the head SHA, and the start SHA for this merge request. |
+| `diffStats` | [`[DiffStats!]`](#diffstats) | Details about which files were changed in this merge request. |
+| `diffStatsSummary` | [`DiffStatsSummary`](#diffstatssummary) | Summary of which files were changed in this merge request. |
+| `discussionLocked` | [`Boolean!`](#boolean) | Indicates if comments on the merge request are locked to members only. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `divergedFromTargetBranch` | [`Boolean!`](#boolean) | Indicates if the source branch is behind the target branch. |
+| `downvotes` | [`Int!`](#int) | Number of downvotes for the merge request. |
+| `forceRemoveSourceBranch` | [`Boolean`](#boolean) | Indicates if the project settings will lead to source branch deletion after merge. |
+| `hasCi` | [`Boolean!`](#boolean) | Indicates if the merge request has CI. |
+| `hasSecurityReports` | [`Boolean!`](#boolean) | Indicates if the source branch has any security reports. |
+| `headPipeline` | [`Pipeline`](#pipeline) | The pipeline running on the branch HEAD of the merge request. |
+| `id` | [`ID!`](#id) | ID of the merge request. |
+| `iid` | [`String!`](#string) | Internal ID of the merge request. |
+| `inProgressMergeCommitSha` | [`String`](#string) | Commit SHA of the merge request if merge is in progress. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels of the merge request. |
+| `mergeCommitSha` | [`String`](#string) | SHA of the merge request commit (set once merged). |
+| `mergeError` | [`String`](#string) | Error message due to a merge error. |
+| `mergeOngoing` | [`Boolean!`](#boolean) | Indicates if a merge is currently occurring. |
+| `mergeStatus` | [`String`](#string) | Status of the merge request. |
+| `mergeTrainsCount` | [`Int`](#int) | Number of merge requests in the merge train. |
+| `mergeUser` | [`User`](#user) | User who merged this merge request. |
+| `mergeWhenPipelineSucceeds` | [`Boolean`](#boolean) | Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS). |
+| `mergeable` | [`Boolean!`](#boolean) | Indicates if the merge request is mergeable. |
+| `mergeableDiscussionsState` | [`Boolean`](#boolean) | Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged. |
+| `mergedAt` | [`Time`](#time) | Timestamp of when the merge request was merged, null if not merged. |
+| `milestone` | [`Milestone`](#milestone) | The milestone of the merge request. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `participants` | [`UserConnection`](#userconnection) | Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes. |
+| `pipelines` | [`PipelineConnection`](#pipelineconnection) | Pipelines for the merge request. Note: for performance reasons, no more than the most recent 500 pipelines will be returned. |
+| `project` | [`Project!`](#project) | Alias for target_project. |
+| `projectId` | [`Int!`](#int) | ID of the merge request project. |
+| `rebaseCommitSha` | [`String`](#string) | Rebase commit SHA of the merge request. |
+| `rebaseInProgress` | [`Boolean!`](#boolean) | Indicates if there is a rebase currently in progress for the merge request. |
+| `reference` | [`String!`](#string) | Internal reference of the merge request. Returned in shortened format by default. |
+| `reviewers` | [`UserConnection`](#userconnection) | Users from whom a review has been requested. |
+| `securityAutoFix` | [`Boolean`](#boolean) | Indicates if the merge request is created by @GitLab-Security-Bot. |
+| `securityReportsUpToDateOnTargetBranch` | [`Boolean!`](#boolean) | Indicates if the target branch security reports are out of date. |
+| `shouldBeRebased` | [`Boolean!`](#boolean) | Indicates if the merge request will be rebased. |
+| `shouldRemoveSourceBranch` | [`Boolean`](#boolean) | Indicates if the source branch of the merge request will be deleted after merge. |
+| `sourceBranch` | [`String!`](#string) | Source branch of the merge request. |
+| `sourceBranchExists` | [`Boolean!`](#boolean) | Indicates if the source branch of the merge request exists. |
+| `sourceBranchProtected` | [`Boolean!`](#boolean) | Indicates if the source branch is protected. |
+| `sourceProject` | [`Project`](#project) | Source project of the merge request. |
+| `sourceProjectId` | [`Int`](#int) | ID of the merge request source project. |
+| `squash` | [`Boolean!`](#boolean) | Indicates if squash on merge is enabled. |
+| `squashOnMerge` | [`Boolean!`](#boolean) | Indicates if squash on merge is enabled. |
+| `state` | [`MergeRequestState!`](#mergerequeststate) | State of the merge request. |
+| `subscribed` | [`Boolean!`](#boolean) | Indicates if the currently logged in user is subscribed to this merge request. |
+| `targetBranch` | [`String!`](#string) | Target branch of the merge request. |
+| `targetBranchExists` | [`Boolean!`](#boolean) | Indicates if the target branch of the merge request exists. |
+| `targetProject` | [`Project!`](#project) | Target project of the merge request. |
+| `targetProjectId` | [`Int!`](#int) | ID of the merge request target project. |
+| `taskCompletionStatus` | [`TaskCompletionStatus!`](#taskcompletionstatus) | Completion status of tasks |
+| `timeEstimate` | [`Int!`](#int) | Time estimate of the merge request. |
+| `title` | [`String!`](#string) | Title of the merge request. |
+| `titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title` |
+| `totalTimeSpent` | [`Int!`](#int) | Total time reported as spent on the merge request. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of when the merge request was last updated. |
+| `upvotes` | [`Int!`](#int) | Number of upvotes for the merge request. |
+| `userDiscussionsCount` | [`Int`](#int) | Number of user discussions in the merge request. |
+| `userNotesCount` | [`Int`](#int) | User notes count of the merge request. |
+| `userPermissions` | [`MergeRequestPermissions!`](#mergerequestpermissions) | Permissions for the current user on the resource |
+| `webUrl` | [`String`](#string) | Web URL of the merge request. |
+| `workInProgress` | [`Boolean!`](#boolean) | Indicates if the merge request is a draft. |
+
+### `MergeRequestAcceptPayload`
+
+Autogenerated return type of MergeRequestAccept.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
+
+### `MergeRequestConnection`
+
+The connection type for MergeRequest.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[MergeRequestEdge]`](#mergerequestedge) | A list of edges. |
+| `nodes` | [`[MergeRequest]`](#mergerequest) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+| `totalTimeToMerge` | [`Float`](#float) | Total sum of time to merge, in seconds, for the collection of merge requests. |
+
+### `MergeRequestCreatePayload`
Autogenerated return type of MergeRequestCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestDiffRegistry
+### `MergeRequestDiffRegistry`
Represents the Geo sync and verification state of a Merge Request diff.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time | Timestamp when the MergeRequestDiffRegistry was created |
-| `id` | ID! | ID of the MergeRequestDiffRegistry |
-| `lastSyncFailure` | String | Error message during sync of the MergeRequestDiffRegistry |
-| `lastSyncedAt` | Time | Timestamp of the most recent successful sync of the MergeRequestDiffRegistry |
-| `mergeRequestDiffId` | ID! | ID of the Merge Request diff. |
-| `retryAt` | Time | Timestamp after which the MergeRequestDiffRegistry should be resynced |
-| `retryCount` | Int | Number of consecutive failed sync attempts of the MergeRequestDiffRegistry |
-| `state` | RegistryState | Sync state of the MergeRequestDiffRegistry |
+| `createdAt` | [`Time`](#time) | Timestamp when the MergeRequestDiffRegistry was created |
+| `id` | [`ID!`](#id) | ID of the MergeRequestDiffRegistry |
+| `lastSyncFailure` | [`String`](#string) | Error message during sync of the MergeRequestDiffRegistry |
+| `lastSyncedAt` | [`Time`](#time) | Timestamp of the most recent successful sync of the MergeRequestDiffRegistry |
+| `mergeRequestDiffId` | [`ID!`](#id) | ID of the Merge Request diff. |
+| `retryAt` | [`Time`](#time) | Timestamp after which the MergeRequestDiffRegistry should be resynced |
+| `retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the MergeRequestDiffRegistry |
+| `state` | [`RegistryState`](#registrystate) | Sync state of the MergeRequestDiffRegistry |
+
+### `MergeRequestDiffRegistryConnection`
+
+The connection type for MergeRequestDiffRegistry.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[MergeRequestDiffRegistryEdge]`](#mergerequestdiffregistryedge) | A list of edges. |
+| `nodes` | [`[MergeRequestDiffRegistry]`](#mergerequestdiffregistry) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `MergeRequestDiffRegistryEdge`
-### MergeRequestPermissions
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`MergeRequestDiffRegistry`](#mergerequestdiffregistry) | The item at the end of the edge. |
+
+### `MergeRequestEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`MergeRequest`](#mergerequest) | The item at the end of the edge. |
+
+### `MergeRequestPermissions`
Check permissions for the current user on a merge request.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminMergeRequest` | Boolean! | Indicates the user can perform `admin_merge_request` on this resource |
-| `canMerge` | Boolean! | Indicates the user can perform `can_merge` on this resource |
-| `cherryPickOnCurrentMergeRequest` | Boolean! | Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource |
-| `createNote` | Boolean! | Indicates the user can perform `create_note` on this resource |
-| `pushToSourceBranch` | Boolean! | Indicates the user can perform `push_to_source_branch` on this resource |
-| `readMergeRequest` | Boolean! | Indicates the user can perform `read_merge_request` on this resource |
-| `removeSourceBranch` | Boolean! | Indicates the user can perform `remove_source_branch` on this resource |
-| `revertOnCurrentMergeRequest` | Boolean! | Indicates the user can perform `revert_on_current_merge_request` on this resource |
-| `updateMergeRequest` | Boolean! | Indicates the user can perform `update_merge_request` on this resource |
+| `adminMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_merge_request` on this resource |
+| `canMerge` | [`Boolean!`](#boolean) | Indicates the user can perform `can_merge` on this resource |
+| `cherryPickOnCurrentMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource |
+| `createNote` | [`Boolean!`](#boolean) | Indicates the user can perform `create_note` on this resource |
+| `pushToSourceBranch` | [`Boolean!`](#boolean) | Indicates the user can perform `push_to_source_branch` on this resource |
+| `readMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `read_merge_request` on this resource |
+| `removeSourceBranch` | [`Boolean!`](#boolean) | Indicates the user can perform `remove_source_branch` on this resource |
+| `revertOnCurrentMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `revert_on_current_merge_request` on this resource |
+| `updateMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `update_merge_request` on this resource |
-### MergeRequestReviewerRereviewPayload
+### `MergeRequestReviewerRereviewPayload`
Autogenerated return type of MergeRequestReviewerRereview.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestSetAssigneesPayload
+### `MergeRequestSetAssigneesPayload`
Autogenerated return type of MergeRequestSetAssignees.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestSetLabelsPayload
+### `MergeRequestSetLabelsPayload`
Autogenerated return type of MergeRequestSetLabels.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestSetLockedPayload
+### `MergeRequestSetLockedPayload`
Autogenerated return type of MergeRequestSetLocked.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestSetMilestonePayload
+### `MergeRequestSetMilestonePayload`
Autogenerated return type of MergeRequestSetMilestone.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestSetSubscriptionPayload
+### `MergeRequestSetSubscriptionPayload`
Autogenerated return type of MergeRequestSetSubscription.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestSetWipPayload
+### `MergeRequestSetWipPayload`
Autogenerated return type of MergeRequestSetWip.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### MergeRequestUpdatePayload
+### `MergeRequestUpdatePayload`
Autogenerated return type of MergeRequestUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `mergeRequest` | MergeRequest | The merge request after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | The merge request after mutation. |
-### Metadata
+### `Metadata`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `revision` | String! | Revision. |
-| `version` | String! | Version. |
+| `revision` | [`String!`](#string) | Revision. |
+| `version` | [`String!`](#string) | Version. |
-### MetricImage
+### `MetricImage`
Represents a metric image upload.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `fileName` | String | File name of the metric image. |
-| `filePath` | String | File path of the metric image. |
-| `id` | ID! | ID of the metric upload. |
-| `iid` | ID! | Internal ID of the metric upload. |
-| `url` | String! | URL of the metric source. |
+| `fileName` | [`String`](#string) | File name of the metric image. |
+| `filePath` | [`String`](#string) | File path of the metric image. |
+| `id` | [`ID!`](#id) | ID of the metric upload. |
+| `iid` | [`ID!`](#id) | Internal ID of the metric upload. |
+| `url` | [`String!`](#string) | URL of the metric source. |
-### MetricsDashboard
+### `MetricsDashboard`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `annotations` | MetricsDashboardAnnotationConnection | Annotations added to the dashboard. |
-| `path` | String | Path to a file with the dashboard definition. |
-| `schemaValidationWarnings` | String! => Array | Dashboard schema validation warnings. |
+| `annotations` | [`MetricsDashboardAnnotationConnection`](#metricsdashboardannotationconnection) | Annotations added to the dashboard. |
+| `path` | [`String`](#string) | Path to a file with the dashboard definition. |
+| `schemaValidationWarnings` | [`[String!]`](#string) | Dashboard schema validation warnings. |
-### MetricsDashboardAnnotation
+### `MetricsDashboardAnnotation`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String | Description of the annotation. |
-| `endingAt` | Time | Timestamp marking end of annotated time span. |
-| `id` | ID! | ID of the annotation. |
-| `panelId` | String | ID of a dashboard panel to which the annotation should be scoped. |
-| `startingAt` | Time | Timestamp marking start of annotated time span. |
+| `description` | [`String`](#string) | Description of the annotation. |
+| `endingAt` | [`Time`](#time) | Timestamp marking end of annotated time span. |
+| `id` | [`ID!`](#id) | ID of the annotation. |
+| `panelId` | [`String`](#string) | ID of a dashboard panel to which the annotation should be scoped. |
+| `startingAt` | [`Time`](#time) | Timestamp marking start of annotated time span. |
+
+### `MetricsDashboardAnnotationConnection`
+
+The connection type for MetricsDashboardAnnotation.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[MetricsDashboardAnnotationEdge]`](#metricsdashboardannotationedge) | A list of edges. |
+| `nodes` | [`[MetricsDashboardAnnotation]`](#metricsdashboardannotation) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `MetricsDashboardAnnotationEdge`
-### Milestone
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`MetricsDashboardAnnotation`](#metricsdashboardannotation) | The item at the end of the edge. |
+
+### `Milestone`
Represents a milestone.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | Timestamp of milestone creation. |
-| `description` | String | Description of the milestone. |
-| `dueDate` | Time | Timestamp of the milestone due date. |
-| `groupMilestone` | Boolean! | Indicates if milestone is at group level. |
-| `id` | ID! | ID of the milestone. |
-| `projectMilestone` | Boolean! | Indicates if milestone is at project level. |
-| `report` | TimeboxReport | Historically accurate report about the timebox. |
-| `startDate` | Time | Timestamp of the milestone start date. |
-| `state` | MilestoneStateEnum! | State of the milestone. |
-| `stats` | MilestoneStats | Milestone statistics. |
-| `subgroupMilestone` | Boolean! | Indicates if milestone is at subgroup level. |
-| `title` | String! | Title of the milestone. |
-| `updatedAt` | Time! | Timestamp of last milestone update. |
-| `webPath` | String! | Web path of the milestone. |
+| `createdAt` | [`Time!`](#time) | Timestamp of milestone creation. |
+| `description` | [`String`](#string) | Description of the milestone. |
+| `dueDate` | [`Time`](#time) | Timestamp of the milestone due date. |
+| `groupMilestone` | [`Boolean!`](#boolean) | Indicates if milestone is at group level. |
+| `id` | [`ID!`](#id) | ID of the milestone. |
+| `projectMilestone` | [`Boolean!`](#boolean) | Indicates if milestone is at project level. |
+| `report` | [`TimeboxReport`](#timeboxreport) | Historically accurate report about the timebox. |
+| `startDate` | [`Time`](#time) | Timestamp of the milestone start date. |
+| `state` | [`MilestoneStateEnum!`](#milestonestateenum) | State of the milestone. |
+| `stats` | [`MilestoneStats`](#milestonestats) | Milestone statistics. |
+| `subgroupMilestone` | [`Boolean!`](#boolean) | Indicates if milestone is at subgroup level. |
+| `title` | [`String!`](#string) | Title of the milestone. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of last milestone update. |
+| `webPath` | [`String!`](#string) | Web path of the milestone. |
+
+### `MilestoneConnection`
-### MilestoneStats
+The connection type for Milestone.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[MilestoneEdge]`](#milestoneedge) | A list of edges. |
+| `nodes` | [`[Milestone]`](#milestone) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `MilestoneEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Milestone`](#milestone) | The item at the end of the edge. |
+
+### `MilestoneStats`
Contains statistics about a milestone.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `closedIssuesCount` | Int | Number of closed issues associated with the milestone. |
-| `totalIssuesCount` | Int | Total number of issues associated with the milestone. |
+| `closedIssuesCount` | [`Int`](#int) | Number of closed issues associated with the milestone. |
+| `totalIssuesCount` | [`Int`](#int) | Total number of issues associated with the milestone. |
+
+### `Namespace`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. |
+| `additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. |
+| `complianceFrameworks` | [`ComplianceFrameworkConnection`](#complianceframeworkconnection) | Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled. |
+| `containsLockedProjects` | [`Boolean!`](#boolean) | Includes at least one project where the repository size exceeds the limit. |
+| `description` | [`String`](#string) | Description of the namespace. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `fullName` | [`String!`](#string) | Full name of the namespace. |
+| `fullPath` | [`ID!`](#id) | Full path of the namespace. |
+| `id` | [`ID!`](#id) | ID of the namespace. |
+| `isTemporaryStorageIncreaseEnabled` | [`Boolean!`](#boolean) | Status of the temporary storage increase. |
+| `lfsEnabled` | [`Boolean`](#boolean) | Indicates if Large File Storage (LFS) is enabled for namespace. |
+| `name` | [`String!`](#string) | Name of the namespace. |
+| `packageSettings` | [`PackageSettings`](#packagesettings) | The package settings for the namespace. |
+| `path` | [`String!`](#string) | Path of the namespace. |
+| `projects` | [`ProjectConnection!`](#projectconnection) | Projects within this namespace. |
+| `repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. |
+| `requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request access to namespace. |
+| `rootStorageStatistics` | [`RootStorageStatistics`](#rootstoragestatistics) | Aggregated storage statistics of the namespace. Only available for root namespaces. |
+| `storageSizeLimit` | [`Float`](#float) | Total storage limit of the root namespace in bytes. |
+| `temporaryStorageIncreaseEndsOn` | [`Time`](#time) | Date until the temporary storage increase is active. |
+| `totalRepositorySize` | [`Float`](#float) | Total repository size of all projects in the root namespace in bytes. |
+| `totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. |
+| `visibility` | [`String`](#string) | Visibility of the namespace. |
+
+### `NamespaceConnection`
-### Namespace
+The connection type for Namespace.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `actualRepositorySizeLimit` | Float | Size limit for repositories in the namespace in bytes. |
-| `additionalPurchasedStorageSize` | Float | Additional storage purchased for the root namespace in bytes. |
-| `complianceFrameworks` | ComplianceFrameworkConnection | Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled. |
-| `containsLockedProjects` | Boolean! | Includes at least one project where the repository size exceeds the limit. |
-| `description` | String | Description of the namespace. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `fullName` | String! | Full name of the namespace. |
-| `fullPath` | ID! | Full path of the namespace. |
-| `id` | ID! | ID of the namespace. |
-| `isTemporaryStorageIncreaseEnabled` | Boolean! | Status of the temporary storage increase. |
-| `lfsEnabled` | Boolean | Indicates if Large File Storage (LFS) is enabled for namespace. |
-| `name` | String! | Name of the namespace. |
-| `packageSettings` | PackageSettings | The package settings for the namespace. |
-| `path` | String! | Path of the namespace. |
-| `projects` | ProjectConnection! | Projects within this namespace. |
-| `repositorySizeExcessProjectCount` | Int! | Number of projects in the root namespace where the repository size exceeds the limit. |
-| `requestAccessEnabled` | Boolean | Indicates if users can request access to namespace. |
-| `rootStorageStatistics` | RootStorageStatistics | Aggregated storage statistics of the namespace. Only available for root namespaces. |
-| `storageSizeLimit` | Float | Total storage limit of the root namespace in bytes. |
-| `temporaryStorageIncreaseEndsOn` | Time | Date until the temporary storage increase is active. |
-| `totalRepositorySize` | Float | Total repository size of all projects in the root namespace in bytes. |
-| `totalRepositorySizeExcess` | Float | Total excess repository size of all projects in the root namespace in bytes. |
-| `visibility` | String | Visibility of the namespace. |
+| `edges` | [`[NamespaceEdge]`](#namespaceedge) | A list of edges. |
+| `nodes` | [`[Namespace]`](#namespace) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `NamespaceEdge`
-### NamespaceIncreaseStorageTemporarilyPayload
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Namespace`](#namespace) | The item at the end of the edge. |
+
+### `NamespaceIncreaseStorageTemporarilyPayload`
Autogenerated return type of NamespaceIncreaseStorageTemporarily.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `namespace` | Namespace | The namespace after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `namespace` | [`Namespace`](#namespace) | The namespace after mutation. |
+
+### `Note`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `author` | [`User!`](#user) | User who wrote this note. |
+| `body` | [`String!`](#string) | Content of the note. |
+| `bodyHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `note` |
+| `confidential` | [`Boolean`](#boolean) | Indicates if this note is confidential. |
+| `createdAt` | [`Time!`](#time) | Timestamp of the note creation. |
+| `discussion` | [`Discussion`](#discussion) | The discussion this note is a part of. |
+| `id` | [`NoteID!`](#noteid) | ID of the note. |
+| `position` | [`DiffPosition`](#diffposition) | The position of this note on a diff. |
+| `project` | [`Project`](#project) | Project associated with the note. |
+| `resolvable` | [`Boolean!`](#boolean) | Indicates if the object can be resolved. |
+| `resolved` | [`Boolean!`](#boolean) | Indicates if the object is resolved. |
+| `resolvedAt` | [`Time`](#time) | Timestamp of when the object was resolved. |
+| `resolvedBy` | [`User`](#user) | User who resolved the object. |
+| `system` | [`Boolean!`](#boolean) | Indicates whether this note was created by the system or by a user. |
+| `systemNoteIconName` | [`String`](#string) | Name of the icon corresponding to a system note. |
+| `updatedAt` | [`Time!`](#time) | Timestamp of the note's last activity. |
+| `url` | [`String`](#string) | URL to view this Note in the Web UI. |
+| `userPermissions` | [`NotePermissions!`](#notepermissions) | Permissions for the current user on the resource |
+
+### `NoteConnection`
+
+The connection type for Note.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[NoteEdge]`](#noteedge) | A list of edges. |
+| `nodes` | [`[Note]`](#note) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `NoteEdge`
-### Note
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `author` | User! | User who wrote this note. |
-| `body` | String! | Content of the note. |
-| `bodyHtml` | String | The GitLab Flavored Markdown rendering of `note` |
-| `confidential` | Boolean | Indicates if this note is confidential. |
-| `createdAt` | Time! | Timestamp of the note creation. |
-| `discussion` | Discussion | The discussion this note is a part of. |
-| `id` | NoteID! | ID of the note. |
-| `position` | DiffPosition | The position of this note on a diff. |
-| `project` | Project | Project associated with the note. |
-| `resolvable` | Boolean! | Indicates if the object can be resolved. |
-| `resolved` | Boolean! | Indicates if the object is resolved. |
-| `resolvedAt` | Time | Timestamp of when the object was resolved. |
-| `resolvedBy` | User | User who resolved the object. |
-| `system` | Boolean! | Indicates whether this note was created by the system or by a user. |
-| `systemNoteIconName` | String | Name of the icon corresponding to a system note. |
-| `updatedAt` | Time! | Timestamp of the note's last activity. |
-| `url` | String | URL to view this Note in the Web UI. |
-| `userPermissions` | NotePermissions! | Permissions for the current user on the resource |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Note`](#note) | The item at the end of the edge. |
-### NotePermissions
+### `NotePermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminNote` | Boolean! | Indicates the user can perform `admin_note` on this resource |
-| `awardEmoji` | Boolean! | Indicates the user can perform `award_emoji` on this resource |
-| `createNote` | Boolean! | Indicates the user can perform `create_note` on this resource |
-| `readNote` | Boolean! | Indicates the user can perform `read_note` on this resource |
-| `repositionNote` | Boolean! | Indicates the user can perform `reposition_note` on this resource |
-| `resolveNote` | Boolean! | Indicates the user can perform `resolve_note` on this resource |
+| `adminNote` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_note` on this resource |
+| `awardEmoji` | [`Boolean!`](#boolean) | Indicates the user can perform `award_emoji` on this resource |
+| `createNote` | [`Boolean!`](#boolean) | Indicates the user can perform `create_note` on this resource |
+| `readNote` | [`Boolean!`](#boolean) | Indicates the user can perform `read_note` on this resource |
+| `repositionNote` | [`Boolean!`](#boolean) | Indicates the user can perform `reposition_note` on this resource |
+| `resolveNote` | [`Boolean!`](#boolean) | Indicates the user can perform `resolve_note` on this resource |
-### OncallParticipantType
+### `OncallParticipantType`
The rotation participant and color palette.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `colorPalette` | String | The color palette to assign to the on-call user. For example "blue". |
-| `colorWeight` | String | The color weight to assign to for the on-call user, for example "500". Max 4 chars. For easy identification of the user. |
-| `id` | IncidentManagementOncallParticipantID! | ID of the on-call participant. |
-| `user` | User! | The user who is participating. |
+| `colorPalette` | [`String`](#string) | The color palette to assign to the on-call user. For example "blue". |
+| `colorWeight` | [`String`](#string) | The color weight to assign to for the on-call user, for example "500". Max 4 chars. For easy identification of the user. |
+| `id` | [`IncidentManagementOncallParticipantID!`](#incidentmanagementoncallparticipantid) | ID of the on-call participant. |
+| `user` | [`User!`](#user) | The user who is participating. |
-### OncallRotationCreatePayload
+### `OncallParticipantTypeConnection`
+
+The connection type for OncallParticipantType.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[OncallParticipantTypeEdge]`](#oncallparticipanttypeedge) | A list of edges. |
+| `nodes` | [`[OncallParticipantType]`](#oncallparticipanttype) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `OncallParticipantTypeEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`OncallParticipantType`](#oncallparticipanttype) | The item at the end of the edge. |
+
+### `OncallRotationActivePeriodType`
+
+Active period time range for on-call rotation.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `endTime` | [`String`](#string) | The end of the rotation active period. |
+| `startTime` | [`String`](#string) | The start of the rotation active period. |
+
+### `OncallRotationCreatePayload`
Autogenerated return type of OncallRotationCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallRotation` | IncidentManagementOncallRotation | The on-call rotation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `oncallRotation` | [`IncidentManagementOncallRotation`](#incidentmanagementoncallrotation) | The on-call rotation. |
-### OncallRotationDestroyPayload
+### `OncallRotationDestroyPayload`
Autogenerated return type of OncallRotationDestroy.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallRotation` | IncidentManagementOncallRotation | The on-call rotation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `oncallRotation` | [`IncidentManagementOncallRotation`](#incidentmanagementoncallrotation) | The on-call rotation. |
-### OncallScheduleCreatePayload
+### `OncallRotationUpdatePayload`
+
+Autogenerated return type of OncallRotationUpdate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `oncallRotation` | [`IncidentManagementOncallRotation`](#incidentmanagementoncallrotation) | The on-call rotation. |
+
+### `OncallScheduleCreatePayload`
Autogenerated return type of OncallScheduleCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `oncallSchedule` | [`IncidentManagementOncallSchedule`](#incidentmanagementoncallschedule) | The on-call schedule. |
-### OncallScheduleDestroyPayload
+### `OncallScheduleDestroyPayload`
Autogenerated return type of OncallScheduleDestroy.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `oncallSchedule` | [`IncidentManagementOncallSchedule`](#incidentmanagementoncallschedule) | The on-call schedule. |
-### OncallScheduleUpdatePayload
+### `OncallScheduleUpdatePayload`
Autogenerated return type of OncallScheduleUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `oncallSchedule` | [`IncidentManagementOncallSchedule`](#incidentmanagementoncallschedule) | The on-call schedule. |
-### Package
+### `Package`
Represents a package in the Package Registry.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | Date of creation. |
-| `id` | PackagesPackageID! | ID of the package. |
-| `metadata` | PackageMetadata | Package metadata. |
-| `name` | String! | Name of the package. |
-| `packageType` | PackageTypeEnum! | Package type. |
-| `pipelines` | PipelineConnection | Pipelines that built the package. |
-| `project` | Project! | Project where the package is stored. |
-| `tags` | PackageTagConnection | Package tags. |
-| `updatedAt` | Time! | Date of most recent update. |
-| `version` | String | Version string. |
-| `versions` | PackageWithoutVersionsConnection | The other versions of the package. |
+| `createdAt` | [`Time!`](#time) | Date of creation. |
+| `id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
+| `metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
+| `name` | [`String!`](#string) | Name of the package. |
+| `packageType` | [`PackageTypeEnum!`](#packagetypeenum) | Package type. |
+| `pipelines` | [`PipelineConnection`](#pipelineconnection) | Pipelines that built the package. |
+| `project` | [`Project!`](#project) | Project where the package is stored. |
+| `tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. |
+| `updatedAt` | [`Time!`](#time) | Date of most recent update. |
+| `version` | [`String`](#string) | Version string. |
+| `versions` | [`PackageWithoutVersionsConnection`](#packagewithoutversionsconnection) | The other versions of the package. |
-### PackageComposerJsonType
+### `PackageComposerJsonType`
Represents a composer JSON file.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `license` | String | The license set in the Composer JSON file. |
-| `name` | String | The name set in the Composer JSON file. |
-| `type` | String | The type set in the Composer JSON file. |
-| `version` | String | The version set in the Composer JSON file. |
+| `license` | [`String`](#string) | The license set in the Composer JSON file. |
+| `name` | [`String`](#string) | The name set in the Composer JSON file. |
+| `type` | [`String`](#string) | The type set in the Composer JSON file. |
+| `version` | [`String`](#string) | The version set in the Composer JSON file. |
+
+### `PackageConnection`
+
+The connection type for Package.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[PackageEdge]`](#packageedge) | A list of edges. |
+| `nodes` | [`[Package]`](#package) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `PackageEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Package`](#package) | The item at the end of the edge. |
-### PackageFileRegistry
+### `PackageFileRegistry`
Represents the Geo sync and verification state of a package file.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time | Timestamp when the PackageFileRegistry was created |
-| `id` | ID! | ID of the PackageFileRegistry |
-| `lastSyncFailure` | String | Error message during sync of the PackageFileRegistry |
-| `lastSyncedAt` | Time | Timestamp of the most recent successful sync of the PackageFileRegistry |
-| `packageFileId` | ID! | ID of the PackageFile. |
-| `retryAt` | Time | Timestamp after which the PackageFileRegistry should be resynced |
-| `retryCount` | Int | Number of consecutive failed sync attempts of the PackageFileRegistry |
-| `state` | RegistryState | Sync state of the PackageFileRegistry |
+| `createdAt` | [`Time`](#time) | Timestamp when the PackageFileRegistry was created |
+| `id` | [`ID!`](#id) | ID of the PackageFileRegistry |
+| `lastSyncFailure` | [`String`](#string) | Error message during sync of the PackageFileRegistry |
+| `lastSyncedAt` | [`Time`](#time) | Timestamp of the most recent successful sync of the PackageFileRegistry |
+| `packageFileId` | [`ID!`](#id) | ID of the PackageFile. |
+| `retryAt` | [`Time`](#time) | Timestamp after which the PackageFileRegistry should be resynced |
+| `retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the PackageFileRegistry |
+| `state` | [`RegistryState`](#registrystate) | Sync state of the PackageFileRegistry |
+
+### `PackageFileRegistryConnection`
+
+The connection type for PackageFileRegistry.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[PackageFileRegistryEdge]`](#packagefileregistryedge) | A list of edges. |
+| `nodes` | [`[PackageFileRegistry]`](#packagefileregistry) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### PackageSettings
+### `PackageFileRegistryEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`PackageFileRegistry`](#packagefileregistry) | The item at the end of the edge. |
+
+### `PackageSettings`
Namespace-level Package Registry settings.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `mavenDuplicateExceptionRegex` | UntrustedRegexp | When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect. |
-| `mavenDuplicatesAllowed` | Boolean! | Indicates whether duplicate Maven packages are allowed for this namespace. |
+| `mavenDuplicateExceptionRegex` | [`UntrustedRegexp`](#untrustedregexp) | When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect. |
+| `mavenDuplicatesAllowed` | [`Boolean!`](#boolean) | Indicates whether duplicate Maven packages are allowed for this namespace. |
-### PackageTag
+### `PackageTag`
Represents a package tag.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | The created date. |
-| `id` | ID! | The ID of the tag. |
-| `name` | String! | The name of the tag. |
-| `updatedAt` | Time! | The updated date. |
+| `createdAt` | [`Time!`](#time) | The created date. |
+| `id` | [`ID!`](#id) | The ID of the tag. |
+| `name` | [`String!`](#string) | The name of the tag. |
+| `updatedAt` | [`Time!`](#time) | The updated date. |
+
+### `PackageTagConnection`
+
+The connection type for PackageTag.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[PackageTagEdge]`](#packagetagedge) | A list of edges. |
+| `nodes` | [`[PackageTag]`](#packagetag) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `PackageTagEdge`
-### PackageWithoutVersions
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`PackageTag`](#packagetag) | The item at the end of the edge. |
+
+### `PackageWithoutVersions`
Represents a version of a package in the Package Registry.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | Date of creation. |
-| `id` | PackagesPackageID! | ID of the package. |
-| `metadata` | PackageMetadata | Package metadata. |
-| `name` | String! | Name of the package. |
-| `packageType` | PackageTypeEnum! | Package type. |
-| `pipelines` | PipelineConnection | Pipelines that built the package. |
-| `project` | Project! | Project where the package is stored. |
-| `tags` | PackageTagConnection | Package tags. |
-| `updatedAt` | Time! | Date of most recent update. |
-| `version` | String | Version string. |
-
-### PageInfo
-
-Information about pagination in a connection..
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `endCursor` | String | When paginating forwards, the cursor to continue. |
-| `hasNextPage` | Boolean! | When paginating forwards, are there more items? |
-| `hasPreviousPage` | Boolean! | When paginating backwards, are there more items? |
-| `startCursor` | String | When paginating backwards, the cursor to continue. |
-
-### Pipeline
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `active` | Boolean! | Indicates if the pipeline is active. |
-| `beforeSha` | String | Base SHA of the source branch. |
-| `cancelable` | Boolean! | Specifies if a pipeline can be canceled. |
-| `committedAt` | Time | Timestamp of the pipeline's commit. |
-| `configSource` | PipelineConfigSourceEnum | Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE) |
-| `coverage` | Float | Coverage percentage. |
-| `createdAt` | Time! | Timestamp of the pipeline's creation. |
-| `detailedStatus` | DetailedStatus! | Detailed status of the pipeline. |
-| `downstream` | PipelineConnection | Pipelines this pipeline will trigger. |
-| `duration` | Int | Duration of the pipeline in seconds. |
-| `finishedAt` | Time | Timestamp of the pipeline's completion. |
-| `id` | ID! | ID of the pipeline. |
-| `iid` | String! | Internal ID of the pipeline. |
-| `jobs` | CiJobConnection | Jobs belonging to the pipeline. |
-| `path` | String | Relative path to the pipeline's page. |
-| `project` | Project | Project the pipeline belongs to. |
-| `retryable` | Boolean! | Specifies if a pipeline can be retried. |
-| `securityReportSummary` | SecurityReportSummary | Vulnerability and scanned resource counts for each security scanner of the pipeline. |
-| `sha` | String! | SHA of the pipeline's commit. |
-| `sourceJob` | CiJob | Job where pipeline was triggered from. |
-| `stages` | CiStageConnection | Stages of the pipeline. |
-| `startedAt` | Time | Timestamp when the pipeline was started. |
-| `status` | PipelineStatusEnum! | Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED) |
-| `updatedAt` | Time! | Timestamp of the pipeline's last activity. |
-| `upstream` | Pipeline | Pipeline that triggered the pipeline. |
-| `user` | User | Pipeline user. |
-| `userPermissions` | PipelinePermissions! | Permissions for the current user on the resource |
-| `warnings` | Boolean! | Indicates if a pipeline has warnings. |
-
-### PipelineAnalytics
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `monthPipelinesLabels` | String! => Array | Labels for the monthly pipeline count. |
-| `monthPipelinesSuccessful` | Int! => Array | Total monthly successful pipeline count. |
-| `monthPipelinesTotals` | Int! => Array | Total monthly pipeline count. |
-| `pipelineTimesLabels` | String! => Array | Pipeline times labels. |
-| `pipelineTimesValues` | Int! => Array | Pipeline times. |
-| `weekPipelinesLabels` | String! => Array | Labels for the weekly pipeline count. |
-| `weekPipelinesSuccessful` | Int! => Array | Total weekly successful pipeline count. |
-| `weekPipelinesTotals` | Int! => Array | Total weekly pipeline count. |
-| `yearPipelinesLabels` | String! => Array | Labels for the yearly pipeline count. |
-| `yearPipelinesSuccessful` | Int! => Array | Total yearly successful pipeline count. |
-| `yearPipelinesTotals` | Int! => Array | Total yearly pipeline count. |
-
-### PipelineCancelPayload
+| `createdAt` | [`Time!`](#time) | Date of creation. |
+| `id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
+| `metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
+| `name` | [`String!`](#string) | Name of the package. |
+| `packageType` | [`PackageTypeEnum!`](#packagetypeenum) | Package type. |
+| `pipelines` | [`PipelineConnection`](#pipelineconnection) | Pipelines that built the package. |
+| `project` | [`Project!`](#project) | Project where the package is stored. |
+| `tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. |
+| `updatedAt` | [`Time!`](#time) | Date of most recent update. |
+| `version` | [`String`](#string) | Version string. |
+
+### `PackageWithoutVersionsConnection`
+
+The connection type for PackageWithoutVersions.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[PackageWithoutVersionsEdge]`](#packagewithoutversionsedge) | A list of edges. |
+| `nodes` | [`[PackageWithoutVersions]`](#packagewithoutversions) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `PackageWithoutVersionsEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`PackageWithoutVersions`](#packagewithoutversions) | The item at the end of the edge. |
+
+### `PageInfo`
+
+Information about pagination in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `endCursor` | [`String`](#string) | When paginating forwards, the cursor to continue. |
+| `hasNextPage` | [`Boolean!`](#boolean) | When paginating forwards, are there more items? |
+| `hasPreviousPage` | [`Boolean!`](#boolean) | When paginating backwards, are there more items? |
+| `startCursor` | [`String`](#string) | When paginating backwards, the cursor to continue. |
+
+### `Pipeline`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `active` | [`Boolean!`](#boolean) | Indicates if the pipeline is active. |
+| `beforeSha` | [`String`](#string) | Base SHA of the source branch. |
+| `cancelable` | [`Boolean!`](#boolean) | Specifies if a pipeline can be canceled. |
+| `commitPath` | [`String`](#string) | Path to the commit that triggered the pipeline. |
+| `committedAt` | [`Time`](#time) | Timestamp of the pipeline's commit. |
+| `configSource` | [`PipelineConfigSourceEnum`](#pipelineconfigsourceenum) | Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE) |
+| `coverage` | [`Float`](#float) | Coverage percentage. |
+| `createdAt` | [`Time!`](#time) | Timestamp of the pipeline's creation. |
+| `detailedStatus` | [`DetailedStatus!`](#detailedstatus) | Detailed status of the pipeline. |
+| `downstream` | [`PipelineConnection`](#pipelineconnection) | Pipelines this pipeline will trigger. |
+| `duration` | [`Int`](#int) | Duration of the pipeline in seconds. |
+| `finishedAt` | [`Time`](#time) | Timestamp of the pipeline's completion. |
+| `id` | [`ID!`](#id) | ID of the pipeline. |
+| `iid` | [`String!`](#string) | Internal ID of the pipeline. |
+| `jobs` | [`CiJobConnection`](#cijobconnection) | Jobs belonging to the pipeline. |
+| `path` | [`String`](#string) | Relative path to the pipeline's page. |
+| `project` | [`Project`](#project) | Project the pipeline belongs to. |
+| `retryable` | [`Boolean!`](#boolean) | Specifies if a pipeline can be retried. |
+| `securityReportFindings` | [`PipelineSecurityReportFindingConnection`](#pipelinesecurityreportfindingconnection) | Vulnerability findings reported on the pipeline. |
+| `securityReportSummary` | [`SecurityReportSummary`](#securityreportsummary) | Vulnerability and scanned resource counts for each security scanner of the pipeline. |
+| `sha` | [`String!`](#string) | SHA of the pipeline's commit. |
+| `sourceJob` | [`CiJob`](#cijob) | Job where pipeline was triggered from. |
+| `stages` | [`CiStageConnection`](#cistageconnection) | Stages of the pipeline. |
+| `startedAt` | [`Time`](#time) | Timestamp when the pipeline was started. |
+| `status` | [`PipelineStatusEnum!`](#pipelinestatusenum) | Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED) |
+| `updatedAt` | [`Time!`](#time) | Timestamp of the pipeline's last activity. |
+| `upstream` | [`Pipeline`](#pipeline) | Pipeline that triggered the pipeline. |
+| `user` | [`User`](#user) | Pipeline user. |
+| `userPermissions` | [`PipelinePermissions!`](#pipelinepermissions) | Permissions for the current user on the resource |
+| `warnings` | [`Boolean!`](#boolean) | Indicates if a pipeline has warnings. |
+
+### `PipelineAnalytics`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `monthPipelinesLabels` | [`[String!]`](#string) | Labels for the monthly pipeline count. |
+| `monthPipelinesSuccessful` | [`[Int!]`](#int) | Total monthly successful pipeline count. |
+| `monthPipelinesTotals` | [`[Int!]`](#int) | Total monthly pipeline count. |
+| `pipelineTimesLabels` | [`[String!]`](#string) | Pipeline times labels. |
+| `pipelineTimesValues` | [`[Int!]`](#int) | Pipeline times. |
+| `weekPipelinesLabels` | [`[String!]`](#string) | Labels for the weekly pipeline count. |
+| `weekPipelinesSuccessful` | [`[Int!]`](#int) | Total weekly successful pipeline count. |
+| `weekPipelinesTotals` | [`[Int!]`](#int) | Total weekly pipeline count. |
+| `yearPipelinesLabels` | [`[String!]`](#string) | Labels for the yearly pipeline count. |
+| `yearPipelinesSuccessful` | [`[Int!]`](#int) | Total yearly successful pipeline count. |
+| `yearPipelinesTotals` | [`[Int!]`](#int) | Total yearly pipeline count. |
+
+### `PipelineCancelPayload`
Autogenerated return type of PipelineCancel.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `PipelineConnection`
+
+The connection type for Pipeline.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[PipelineEdge]`](#pipelineedge) | A list of edges. |
+| `nodes` | [`[Pipeline]`](#pipeline) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### PipelineDestroyPayload
+### `PipelineDestroyPayload`
Autogenerated return type of PipelineDestroy.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `PipelineEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Pipeline`](#pipeline) | The item at the end of the edge. |
-### PipelinePermissions
+### `PipelinePermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminPipeline` | Boolean! | Indicates the user can perform `admin_pipeline` on this resource |
-| `destroyPipeline` | Boolean! | Indicates the user can perform `destroy_pipeline` on this resource |
-| `updatePipeline` | Boolean! | Indicates the user can perform `update_pipeline` on this resource |
+| `adminPipeline` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_pipeline` on this resource |
+| `destroyPipeline` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_pipeline` on this resource |
+| `updatePipeline` | [`Boolean!`](#boolean) | Indicates the user can perform `update_pipeline` on this resource |
-### PipelineRetryPayload
+### `PipelineRetryPayload`
Autogenerated return type of PipelineRetry.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `pipeline` | Pipeline | The pipeline after mutation. |
-
-### Project
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `actualRepositorySizeLimit` | Float | Size limit for the repository in bytes. |
-| `alertManagementAlert` | AlertManagementAlert | A single Alert Management alert of the project. |
-| `alertManagementAlertStatusCounts` | AlertManagementAlertStatusCountsType | Counts of alerts by status for the project. |
-| `alertManagementAlerts` | AlertManagementAlertConnection | Alert Management alerts of the project. |
-| `alertManagementIntegrations` | AlertManagementIntegrationConnection | Integrations which can receive alerts for the project. |
-| `alertManagementPayloadFields` | AlertManagementPayloadAlertField! => Array | Extract alert fields from payload for custom mapping. |
-| `allowMergeOnSkippedPipeline` | Boolean | If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge requests of the project can also be merged with skipped jobs. |
-| `apiFuzzingCiConfiguration` | ApiFuzzingCiConfiguration | API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled. |
-| `archived` | Boolean | Indicates the archived status of the project. |
-| `autocloseReferencedIssues` | Boolean | Indicates if issues referenced by merge requests and commits within the default branch are closed automatically. |
-| `avatarUrl` | String | URL to avatar image file of the project. |
-| `board` | Board | A single board of the project. |
-| `boards` | BoardConnection | Boards of the project. |
-| `ciCdSettings` | ProjectCiCdSetting | CI/CD settings for the project. |
-| `clusterAgent` | ClusterAgent | Find a single cluster agent by name. |
-| `clusterAgents` | ClusterAgentConnection | Cluster agents associated with the project. |
-| `codeCoverageSummary` | CodeCoverageSummary | Code coverage summary associated with the project. |
-| `complianceFrameworks` | ComplianceFrameworkConnection | Compliance frameworks associated with the project. |
-| `containerExpirationPolicy` | ContainerExpirationPolicy | The container expiration policy of the project. |
-| `containerRegistryEnabled` | Boolean | Indicates if the project stores Docker container images in a container registry. |
-| `containerRepositories` | ContainerRepositoryConnection | Container repositories of the project. |
-| `containerRepositoriesCount` | Int! | Number of container repositories in the project. |
-| `createdAt` | Time | Timestamp of the project creation. |
-| `dastProfiles` | DastProfileConnection | DAST Profiles associated with the project. Always returns no nodes if `dast_saved_scans` is disabled. |
-| `dastScannerProfiles` | DastScannerProfileConnection | The DAST scanner profiles associated with the project. |
-| `dastSiteProfile` | DastSiteProfile | DAST Site Profile associated with the project. |
-| `dastSiteProfiles` | DastSiteProfileConnection | DAST Site Profiles associated with the project. |
-| `dastSiteValidations` | DastSiteValidationConnection | DAST Site Validations associated with the project. Always returns no nodes if `security_on_demand_scans_site_validation` is disabled. |
-| `description` | String | Short description of the project. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `environment` | Environment | A single environment of the project. |
-| `environments` | EnvironmentConnection | Environments of the project. |
-| `forksCount` | Int! | Number of times the project has been forked. |
-| `fullPath` | ID! | Full path of the project. |
-| `grafanaIntegration` | GrafanaIntegration | Grafana integration details for the project. |
-| `group` | Group | Group of the project. |
-| `httpUrlToRepo` | String | URL to connect to the project via HTTPS. |
-| `id` | ID! | ID of the project. |
-| `importStatus` | String | Status of import background job of the project. |
-| `incidentManagementOncallSchedules` | IncidentManagementOncallScheduleConnection | Incident Management On-call schedules of the project. |
-| `issue` | Issue | A single issue of the project. |
-| `issueStatusCounts` | IssueStatusCountsType | Counts of issues by status for the project. |
-| `issues` | IssueConnection | Issues of the project. |
-| `issuesEnabled` | Boolean | Indicates if Issues are enabled for the current user |
-| `iterations` | IterationConnection | Find iterations. |
-| `jiraImportStatus` | String | Status of Jira import background job of the project. |
-| `jiraImports` | JiraImportConnection | Jira imports into the project. |
-| `jobsEnabled` | Boolean | Indicates if CI/CD pipeline jobs are enabled for the current user. |
-| `label` | Label | A label available on this project. |
-| `labels` | LabelConnection | Labels available on this project. |
-| `lastActivityAt` | Time | Timestamp of the project last activity. |
-| `lfsEnabled` | Boolean | Indicates if the project has Large File Storage (LFS) enabled. |
-| `mergeRequest` | MergeRequest | A single merge request of the project. |
-| `mergeRequests` | MergeRequestConnection | Merge requests of the project. |
-| `mergeRequestsEnabled` | Boolean | Indicates if Merge Requests are enabled for the current user |
-| `mergeRequestsFfOnlyEnabled` | Boolean | Indicates if no merge commits should be created and all merges should instead be fast-forwarded, which means that merging is only allowed if the branch could be fast-forwarded. |
-| `milestones` | MilestoneConnection | Milestones of the project. |
-| `name` | String! | Name of the project (without namespace). |
-| `nameWithNamespace` | String! | Full name of the project with its namespace. |
-| `namespace` | Namespace | Namespace of the project. |
-| `onlyAllowMergeIfAllDiscussionsAreResolved` | Boolean | Indicates if merge requests of the project can only be merged when all the discussions are resolved. |
-| `onlyAllowMergeIfPipelineSucceeds` | Boolean | Indicates if merge requests of the project can only be merged with successful jobs. |
-| `openIssuesCount` | Int | Number of open issues for the project. |
-| `packages` | PackageConnection | Packages of the project. |
-| `path` | String! | Path of the project. |
-| `pipeline` | Pipeline | Build pipeline of the project. |
-| `pipelineAnalytics` | PipelineAnalytics | Pipeline analytics. |
-| `pipelines` | PipelineConnection | Build pipelines of the project. |
-| `printingMergeRequestLinkEnabled` | Boolean | Indicates if a link to create or view a merge request should display after a push to Git repositories of the project from the command line. |
-| `projectMembers` | MemberInterfaceConnection | Members of the project. |
-| `publicJobs` | Boolean | Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts. |
-| `release` | Release | A single release of the project. |
-| `releases` | ReleaseConnection | Releases of the project. |
-| `removeSourceBranchAfterMerge` | Boolean | Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project. |
-| `repository` | Repository | Git repository of the project. |
-| `repositorySizeExcess` | Float | Size of repository that exceeds the limit in bytes. |
-| `requestAccessEnabled` | Boolean | Indicates if users can request member access to the project. |
-| `requirement` | Requirement | Find a single requirement. |
-| `requirementStatesCount` | RequirementStatesCount | Number of requirements for the project by their state. |
-| `requirements` | RequirementConnection | Find requirements. |
-| `sastCiConfiguration` | SastCiConfiguration | SAST CI configuration for the project. |
-| `securityDashboardPath` | String | Path to project's security dashboard. |
-| `securityScanners` | SecurityScanners | Information about security analyzers used in the project. |
-| `sentryDetailedError` | SentryDetailedError | Detailed version of a Sentry error on the project. |
-| `sentryErrors` | SentryErrorCollection | Paginated collection of Sentry errors on the project. |
-| `serviceDeskAddress` | String | E-mail address of the service desk. |
-| `serviceDeskEnabled` | Boolean | Indicates if the project has service desk enabled. |
-| `services` | ServiceConnection | Project services. |
-| `sharedRunnersEnabled` | Boolean | Indicates if shared runners are enabled for the project. |
-| `snippets` | SnippetConnection | Snippets of the project. |
-| `snippetsEnabled` | Boolean | Indicates if Snippets are enabled for the current user |
-| `squashReadOnly` | Boolean! | Indicates if `squashReadOnly` is enabled. |
-| `sshUrlToRepo` | String | URL to connect to the project via SSH. |
-| `starCount` | Int! | Number of times the project has been starred. |
-| `statistics` | ProjectStatistics | Statistics of the project. |
-| `suggestionCommitMessage` | String | The commit message used to apply merge request suggestions. |
-| `tagList` | String | List of project topics (not Git tags). |
-| `terraformState` | TerraformState | Find a single Terraform state by name. |
-| `terraformStates` | TerraformStateConnection | Terraform states associated with the project. |
-| `userPermissions` | ProjectPermissions! | Permissions for the current user on the resource |
-| `visibility` | String | Visibility of the project. |
-| `vulnerabilities` | VulnerabilityConnection | Vulnerabilities reported on the project. |
-| `vulnerabilitiesCountByDay` | VulnerabilitiesCountByDayConnection | Number of vulnerabilities per day for the project. |
-| `vulnerabilityScanners` | VulnerabilityScannerConnection | Vulnerability scanners reported on the project vulnerabilities. |
-| `vulnerabilitySeveritiesCount` | VulnerabilitySeveritiesCount | Counts for each vulnerability severity in the project. |
-| `webUrl` | String | Web URL of the project. |
-| `wikiEnabled` | Boolean | Indicates if Wikis are enabled for the current user |
-
-### ProjectCiCdSetting
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `keepLatestArtifact` | Boolean | Whether to keep the latest builds artifacts. |
-| `mergePipelinesEnabled` | Boolean | Whether merge pipelines are enabled. |
-| `mergeTrainsEnabled` | Boolean | Whether merge trains are enabled. |
-| `project` | Project | Project the CI/CD settings belong to. |
-
-### ProjectMember
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `pipeline` | [`Pipeline`](#pipeline) | The pipeline after mutation. |
+
+### `PipelineSecurityReportFinding`
+
+Represents vulnerability finding of a security report on the pipeline.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `confidence` | [`String`](#string) | Type of the security report that found the vulnerability. |
+| `description` | [`String`](#string) | Description of the vulnerability finding. |
+| `identifiers` | [`[VulnerabilityIdentifier!]!`](#vulnerabilityidentifier) | Identifiers of the vulnerabilit finding. |
+| `location` | [`VulnerabilityLocation`](#vulnerabilitylocation) | Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability. |
+| `name` | [`String`](#string) | Name of the vulnerability finding. |
+| `project` | [`Project`](#project) | The project on which the vulnerability finding was found. |
+| `projectFingerprint` | [`String`](#string) | Name of the vulnerability finding. |
+| `reportType` | [`VulnerabilityReportType`](#vulnerabilityreporttype) | Type of the security report that found the vulnerability finding. |
+| `scanner` | [`VulnerabilityScanner`](#vulnerabilityscanner) | Scanner metadata for the vulnerability. |
+| `severity` | [`VulnerabilitySeverity`](#vulnerabilityseverity) | Severity of the vulnerability finding. |
+| `solution` | [`String`](#string) | URL to the vulnerability's details page. |
+| `uuid` | [`String`](#string) | Name of the vulnerability finding. |
+
+### `PipelineSecurityReportFindingConnection`
+
+The connection type for PipelineSecurityReportFinding.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[PipelineSecurityReportFindingEdge]`](#pipelinesecurityreportfindingedge) | A list of edges. |
+| `nodes` | [`[PipelineSecurityReportFinding]`](#pipelinesecurityreportfinding) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `PipelineSecurityReportFindingEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`PipelineSecurityReportFinding`](#pipelinesecurityreportfinding) | The item at the end of the edge. |
+
+### `Project`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `actualRepositorySizeLimit` | [`Float`](#float) | Size limit for the repository in bytes. |
+| `alertManagementAlert` | [`AlertManagementAlert`](#alertmanagementalert) | A single Alert Management alert of the project. |
+| `alertManagementAlertStatusCounts` | [`AlertManagementAlertStatusCountsType`](#alertmanagementalertstatuscountstype) | Counts of alerts by status for the project. |
+| `alertManagementAlerts` | [`AlertManagementAlertConnection`](#alertmanagementalertconnection) | Alert Management alerts of the project. |
+| `alertManagementHttpIntegrations` | [`AlertManagementHttpIntegrationConnection`](#alertmanagementhttpintegrationconnection) | HTTP Integrations which can receive alerts for the project. |
+| `alertManagementIntegrations` | [`AlertManagementIntegrationConnection`](#alertmanagementintegrationconnection) | Integrations which can receive alerts for the project. |
+| `alertManagementPayloadFields` | [`[AlertManagementPayloadAlertField!]`](#alertmanagementpayloadalertfield) | Extract alert fields from payload for custom mapping. |
+| `allowMergeOnSkippedPipeline` | [`Boolean`](#boolean) | If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge requests of the project can also be merged with skipped jobs. |
+| `apiFuzzingCiConfiguration` | [`ApiFuzzingCiConfiguration`](#apifuzzingciconfiguration) | API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled. |
+| `archived` | [`Boolean`](#boolean) | Indicates the archived status of the project. |
+| `autocloseReferencedIssues` | [`Boolean`](#boolean) | Indicates if issues referenced by merge requests and commits within the default branch are closed automatically. |
+| `avatarUrl` | [`String`](#string) | URL to avatar image file of the project. |
+| `board` | [`Board`](#board) | A single board of the project. |
+| `boards` | [`BoardConnection`](#boardconnection) | Boards of the project. |
+| `ciCdSettings` | [`ProjectCiCdSetting`](#projectcicdsetting) | CI/CD settings for the project. |
+| `clusterAgent` | [`ClusterAgent`](#clusteragent) | Find a single cluster agent by name. |
+| `clusterAgents` | [`ClusterAgentConnection`](#clusteragentconnection) | Cluster agents associated with the project. |
+| `codeCoverageSummary` | [`CodeCoverageSummary`](#codecoveragesummary) | Code coverage summary associated with the project. |
+| `complianceFrameworks` | [`ComplianceFrameworkConnection`](#complianceframeworkconnection) | Compliance frameworks associated with the project. |
+| `containerExpirationPolicy` | [`ContainerExpirationPolicy`](#containerexpirationpolicy) | The container expiration policy of the project. |
+| `containerRegistryEnabled` | [`Boolean`](#boolean) | Indicates if the project stores Docker container images in a container registry. |
+| `containerRepositories` | [`ContainerRepositoryConnection`](#containerrepositoryconnection) | Container repositories of the project. |
+| `containerRepositoriesCount` | [`Int!`](#int) | Number of container repositories in the project. |
+| `createdAt` | [`Time`](#time) | Timestamp of the project creation. |
+| `dastProfiles` | [`DastProfileConnection`](#dastprofileconnection) | DAST Profiles associated with the project. |
+| `dastScannerProfiles` | [`DastScannerProfileConnection`](#dastscannerprofileconnection) | The DAST scanner profiles associated with the project. |
+| `dastSiteProfile` | [`DastSiteProfile`](#dastsiteprofile) | DAST Site Profile associated with the project. |
+| `dastSiteProfiles` | [`DastSiteProfileConnection`](#dastsiteprofileconnection) | DAST Site Profiles associated with the project. |
+| `dastSiteValidations` | [`DastSiteValidationConnection`](#dastsitevalidationconnection) | DAST Site Validations associated with the project. |
+| `description` | [`String`](#string) | Short description of the project. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `environment` | [`Environment`](#environment) | A single environment of the project. |
+| `environments` | [`EnvironmentConnection`](#environmentconnection) | Environments of the project. |
+| `forksCount` | [`Int!`](#int) | Number of times the project has been forked. |
+| `fullPath` | [`ID!`](#id) | Full path of the project. |
+| `grafanaIntegration` | [`GrafanaIntegration`](#grafanaintegration) | Grafana integration details for the project. |
+| `group` | [`Group`](#group) | Group of the project. |
+| `httpUrlToRepo` | [`String`](#string) | URL to connect to the project via HTTPS. |
+| `id` | [`ID!`](#id) | ID of the project. |
+| `importStatus` | [`String`](#string) | Status of import background job of the project. |
+| `incidentManagementOncallSchedules` | [`IncidentManagementOncallScheduleConnection`](#incidentmanagementoncallscheduleconnection) | Incident Management On-call schedules of the project. |
+| `issue` | [`Issue`](#issue) | A single issue of the project. |
+| `issueStatusCounts` | [`IssueStatusCountsType`](#issuestatuscountstype) | Counts of issues by status for the project. |
+| `issues` | [`IssueConnection`](#issueconnection) | Issues of the project. |
+| `issuesEnabled` | [`Boolean`](#boolean) | Indicates if Issues are enabled for the current user |
+| `iterationCadences` | [`IterationCadenceConnection`](#iterationcadenceconnection) | Find iteration cadences. |
+| `iterations` | [`IterationConnection`](#iterationconnection) | Find iterations. |
+| `jiraImportStatus` | [`String`](#string) | Status of Jira import background job of the project. |
+| `jiraImports` | [`JiraImportConnection`](#jiraimportconnection) | Jira imports into the project. |
+| `jobsEnabled` | [`Boolean`](#boolean) | Indicates if CI/CD pipeline jobs are enabled for the current user. |
+| `label` | [`Label`](#label) | A label available on this project. |
+| `labels` | [`LabelConnection`](#labelconnection) | Labels available on this project. |
+| `lastActivityAt` | [`Time`](#time) | Timestamp of the project last activity. |
+| `lfsEnabled` | [`Boolean`](#boolean) | Indicates if the project has Large File Storage (LFS) enabled. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | A single merge request of the project. |
+| `mergeRequests` | [`MergeRequestConnection`](#mergerequestconnection) | Merge requests of the project. |
+| `mergeRequestsEnabled` | [`Boolean`](#boolean) | Indicates if Merge Requests are enabled for the current user |
+| `mergeRequestsFfOnlyEnabled` | [`Boolean`](#boolean) | Indicates if no merge commits should be created and all merges should instead be fast-forwarded, which means that merging is only allowed if the branch could be fast-forwarded. |
+| `milestones` | [`MilestoneConnection`](#milestoneconnection) | Milestones of the project. |
+| `name` | [`String!`](#string) | Name of the project (without namespace). |
+| `nameWithNamespace` | [`String!`](#string) | Full name of the project with its namespace. |
+| `namespace` | [`Namespace`](#namespace) | Namespace of the project. |
+| `onlyAllowMergeIfAllDiscussionsAreResolved` | [`Boolean`](#boolean) | Indicates if merge requests of the project can only be merged when all the discussions are resolved. |
+| `onlyAllowMergeIfPipelineSucceeds` | [`Boolean`](#boolean) | Indicates if merge requests of the project can only be merged with successful jobs. |
+| `openIssuesCount` | [`Int`](#int) | Number of open issues for the project. |
+| `packages` | [`PackageConnection`](#packageconnection) | Packages of the project. |
+| `path` | [`String!`](#string) | Path of the project. |
+| `pipeline` | [`Pipeline`](#pipeline) | Build pipeline of the project. |
+| `pipelineAnalytics` | [`PipelineAnalytics`](#pipelineanalytics) | Pipeline analytics. |
+| `pipelines` | [`PipelineConnection`](#pipelineconnection) | Build pipelines of the project. |
+| `printingMergeRequestLinkEnabled` | [`Boolean`](#boolean) | Indicates if a link to create or view a merge request should display after a push to Git repositories of the project from the command line. |
+| `projectMembers` | [`MemberInterfaceConnection`](#memberinterfaceconnection) | Members of the project. |
+| `publicJobs` | [`Boolean`](#boolean) | Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts. |
+| `pushRules` | [`PushRules`](#pushrules) | The project's push rules settings. |
+| `release` | [`Release`](#release) | A single release of the project. |
+| `releases` | [`ReleaseConnection`](#releaseconnection) | Releases of the project. |
+| `removeSourceBranchAfterMerge` | [`Boolean`](#boolean) | Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project. |
+| `repository` | [`Repository`](#repository) | Git repository of the project. |
+| `repositorySizeExcess` | [`Float`](#float) | Size of repository that exceeds the limit in bytes. |
+| `requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request member access to the project. |
+| `requirement` | [`Requirement`](#requirement) | Find a single requirement. |
+| `requirementStatesCount` | [`RequirementStatesCount`](#requirementstatescount) | Number of requirements for the project by their state. |
+| `requirements` | [`RequirementConnection`](#requirementconnection) | Find requirements. |
+| `sastCiConfiguration` | [`SastCiConfiguration`](#sastciconfiguration) | SAST CI configuration for the project. |
+| `securityDashboardPath` | [`String`](#string) | Path to project's security dashboard. |
+| `securityScanners` | [`SecurityScanners`](#securityscanners) | Information about security analyzers used in the project. |
+| `sentryDetailedError` | [`SentryDetailedError`](#sentrydetailederror) | Detailed version of a Sentry error on the project. |
+| `sentryErrors` | [`SentryErrorCollection`](#sentryerrorcollection) | Paginated collection of Sentry errors on the project. |
+| `serviceDeskAddress` | [`String`](#string) | E-mail address of the service desk. |
+| `serviceDeskEnabled` | [`Boolean`](#boolean) | Indicates if the project has service desk enabled. |
+| `services` | [`ServiceConnection`](#serviceconnection) | Project services. |
+| `sharedRunnersEnabled` | [`Boolean`](#boolean) | Indicates if shared runners are enabled for the project. |
+| `snippets` | [`SnippetConnection`](#snippetconnection) | Snippets of the project. |
+| `snippetsEnabled` | [`Boolean`](#boolean) | Indicates if Snippets are enabled for the current user |
+| `squashReadOnly` | [`Boolean!`](#boolean) | Indicates if `squashReadOnly` is enabled. |
+| `sshUrlToRepo` | [`String`](#string) | URL to connect to the project via SSH. |
+| `starCount` | [`Int!`](#int) | Number of times the project has been starred. |
+| `statistics` | [`ProjectStatistics`](#projectstatistics) | Statistics of the project. |
+| `suggestionCommitMessage` | [`String`](#string) | The commit message used to apply merge request suggestions. |
+| `tagList` | [`String`](#string) | List of project topics (not Git tags). |
+| `terraformState` | [`TerraformState`](#terraformstate) | Find a single Terraform state by name. |
+| `terraformStates` | [`TerraformStateConnection`](#terraformstateconnection) | Terraform states associated with the project. |
+| `userPermissions` | [`ProjectPermissions!`](#projectpermissions) | Permissions for the current user on the resource |
+| `visibility` | [`String`](#string) | Visibility of the project. |
+| `vulnerabilities` | [`VulnerabilityConnection`](#vulnerabilityconnection) | Vulnerabilities reported on the project. |
+| `vulnerabilitiesCountByDay` | [`VulnerabilitiesCountByDayConnection`](#vulnerabilitiescountbydayconnection) | Number of vulnerabilities per day for the project. |
+| `vulnerabilityScanners` | [`VulnerabilityScannerConnection`](#vulnerabilityscannerconnection) | Vulnerability scanners reported on the project vulnerabilities. |
+| `vulnerabilitySeveritiesCount` | [`VulnerabilitySeveritiesCount`](#vulnerabilityseveritiescount) | Counts for each vulnerability severity in the project. |
+| `webUrl` | [`String`](#string) | Web URL of the project. |
+| `wikiEnabled` | [`Boolean`](#boolean) | Indicates if Wikis are enabled for the current user |
+
+### `ProjectCiCdSetting`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `keepLatestArtifact` | [`Boolean`](#boolean) | Whether to keep the latest builds artifacts. |
+| `mergePipelinesEnabled` | [`Boolean`](#boolean) | Whether merge pipelines are enabled. |
+| `mergeTrainsEnabled` | [`Boolean`](#boolean) | Whether merge trains are enabled. |
+| `project` | [`Project`](#project) | Project the CI/CD settings belong to. |
+
+### `ProjectConnection`
+
+The connection type for Project.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ProjectEdge]`](#projectedge) | A list of edges. |
+| `nodes` | [`[Project]`](#project) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ProjectEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Project`](#project) | The item at the end of the edge. |
+
+### `ProjectMember`
Represents a Project Membership.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `accessLevel` | AccessLevel | GitLab::Access level. |
-| `createdAt` | Time | Date and time the membership was created. |
-| `createdBy` | User | User that authorized membership. |
-| `expiresAt` | Time | Date and time the membership expires. |
-| `id` | ID! | ID of the member. |
-| `project` | Project | Project that User is a member of. |
-| `updatedAt` | Time | Date and time the membership was last updated. |
-| `user` | User! | User that is associated with the member object. |
-| `userPermissions` | ProjectPermissions! | Permissions for the current user on the resource |
-
-### ProjectPermissions
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `adminOperations` | Boolean! | Indicates the user can perform `admin_operations` on this resource |
-| `adminProject` | Boolean! | Indicates the user can perform `admin_project` on this resource |
-| `adminRemoteMirror` | Boolean! | Indicates the user can perform `admin_remote_mirror` on this resource |
-| `adminWiki` | Boolean! | Indicates the user can perform `admin_wiki` on this resource |
-| `archiveProject` | Boolean! | Indicates the user can perform `archive_project` on this resource |
-| `changeNamespace` | Boolean! | Indicates the user can perform `change_namespace` on this resource |
-| `changeVisibilityLevel` | Boolean! | Indicates the user can perform `change_visibility_level` on this resource |
-| `createDeployment` | Boolean! | Indicates the user can perform `create_deployment` on this resource |
-| `createDesign` | Boolean! | Indicates the user can perform `create_design` on this resource |
-| `createIssue` | Boolean! | Indicates the user can perform `create_issue` on this resource |
-| `createLabel` | Boolean! | Indicates the user can perform `create_label` on this resource |
-| `createMergeRequestFrom` | Boolean! | Indicates the user can perform `create_merge_request_from` on this resource |
-| `createMergeRequestIn` | Boolean! | Indicates the user can perform `create_merge_request_in` on this resource |
-| `createPages` | Boolean! | Indicates the user can perform `create_pages` on this resource |
-| `createPipeline` | Boolean! | Indicates the user can perform `create_pipeline` on this resource |
-| `createPipelineSchedule` | Boolean! | Indicates the user can perform `create_pipeline_schedule` on this resource |
-| `createSnippet` | Boolean! | Indicates the user can perform `create_snippet` on this resource |
-| `createWiki` | Boolean! | Indicates the user can perform `create_wiki` on this resource |
-| `destroyDesign` | Boolean! | Indicates the user can perform `destroy_design` on this resource |
-| `destroyPages` | Boolean! | Indicates the user can perform `destroy_pages` on this resource |
-| `destroyWiki` | Boolean! | Indicates the user can perform `destroy_wiki` on this resource |
-| `downloadCode` | Boolean! | Indicates the user can perform `download_code` on this resource |
-| `downloadWikiCode` | Boolean! | Indicates the user can perform `download_wiki_code` on this resource |
-| `forkProject` | Boolean! | Indicates the user can perform `fork_project` on this resource |
-| `pushCode` | Boolean! | Indicates the user can perform `push_code` on this resource |
-| `pushToDeleteProtectedBranch` | Boolean! | Indicates the user can perform `push_to_delete_protected_branch` on this resource |
-| `readCommitStatus` | Boolean! | Indicates the user can perform `read_commit_status` on this resource |
-| `readCycleAnalytics` | Boolean! | Indicates the user can perform `read_cycle_analytics` on this resource |
-| `readDesign` | Boolean! | Indicates the user can perform `read_design` on this resource |
-| `readMergeRequest` | Boolean! | Indicates the user can perform `read_merge_request` on this resource |
-| `readPagesContent` | Boolean! | Indicates the user can perform `read_pages_content` on this resource |
-| `readProject` | Boolean! | Indicates the user can perform `read_project` on this resource |
-| `readProjectMember` | Boolean! | Indicates the user can perform `read_project_member` on this resource |
-| `readWiki` | Boolean! | Indicates the user can perform `read_wiki` on this resource |
-| `removeForkProject` | Boolean! | Indicates the user can perform `remove_fork_project` on this resource |
-| `removePages` | Boolean! | Indicates the user can perform `remove_pages` on this resource |
-| `removeProject` | Boolean! | Indicates the user can perform `remove_project` on this resource |
-| `renameProject` | Boolean! | Indicates the user can perform `rename_project` on this resource |
-| `requestAccess` | Boolean! | Indicates the user can perform `request_access` on this resource |
-| `updatePages` | Boolean! | Indicates the user can perform `update_pages` on this resource |
-| `updateWiki` | Boolean! | Indicates the user can perform `update_wiki` on this resource |
-| `uploadFile` | Boolean! | Indicates the user can perform `upload_file` on this resource |
-
-### ProjectStatistics
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `buildArtifactsSize` | Float! | Build artifacts size of the project in bytes. |
-| `commitCount` | Float! | Commit count of the project. |
-| `lfsObjectsSize` | Float! | Large File Storage (LFS) object size of the project in bytes. |
-| `packagesSize` | Float! | Packages size of the project in bytes. |
-| `repositorySize` | Float! | Repository size of the project in bytes. |
-| `snippetsSize` | Float | Snippets size of the project in bytes. |
-| `storageSize` | Float! | Storage size of the project in bytes. |
-| `uploadsSize` | Float | Uploads size of the project in bytes. |
-| `wikiSize` | Float | Wiki size of the project in bytes. |
-
-### PrometheusAlert
+| `accessLevel` | [`AccessLevel`](#accesslevel) | GitLab::Access level. |
+| `createdAt` | [`Time`](#time) | Date and time the membership was created. |
+| `createdBy` | [`User`](#user) | User that authorized membership. |
+| `expiresAt` | [`Time`](#time) | Date and time the membership expires. |
+| `id` | [`ID!`](#id) | ID of the member. |
+| `project` | [`Project`](#project) | Project that User is a member of. |
+| `updatedAt` | [`Time`](#time) | Date and time the membership was last updated. |
+| `user` | [`User!`](#user) | User that is associated with the member object. |
+| `userPermissions` | [`ProjectPermissions!`](#projectpermissions) | Permissions for the current user on the resource |
+
+### `ProjectMemberConnection`
+
+The connection type for ProjectMember.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ProjectMemberEdge]`](#projectmemberedge) | A list of edges. |
+| `nodes` | [`[ProjectMember]`](#projectmember) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ProjectMemberEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ProjectMember`](#projectmember) | The item at the end of the edge. |
+
+### `ProjectPermissions`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `adminOperations` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_operations` on this resource |
+| `adminProject` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_project` on this resource |
+| `adminRemoteMirror` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_remote_mirror` on this resource |
+| `adminWiki` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_wiki` on this resource |
+| `archiveProject` | [`Boolean!`](#boolean) | Indicates the user can perform `archive_project` on this resource |
+| `changeNamespace` | [`Boolean!`](#boolean) | Indicates the user can perform `change_namespace` on this resource |
+| `changeVisibilityLevel` | [`Boolean!`](#boolean) | Indicates the user can perform `change_visibility_level` on this resource |
+| `createDeployment` | [`Boolean!`](#boolean) | Indicates the user can perform `create_deployment` on this resource |
+| `createDesign` | [`Boolean!`](#boolean) | Indicates the user can perform `create_design` on this resource |
+| `createIssue` | [`Boolean!`](#boolean) | Indicates the user can perform `create_issue` on this resource |
+| `createLabel` | [`Boolean!`](#boolean) | Indicates the user can perform `create_label` on this resource |
+| `createMergeRequestFrom` | [`Boolean!`](#boolean) | Indicates the user can perform `create_merge_request_from` on this resource |
+| `createMergeRequestIn` | [`Boolean!`](#boolean) | Indicates the user can perform `create_merge_request_in` on this resource |
+| `createPages` | [`Boolean!`](#boolean) | Indicates the user can perform `create_pages` on this resource |
+| `createPipeline` | [`Boolean!`](#boolean) | Indicates the user can perform `create_pipeline` on this resource |
+| `createPipelineSchedule` | [`Boolean!`](#boolean) | Indicates the user can perform `create_pipeline_schedule` on this resource |
+| `createSnippet` | [`Boolean!`](#boolean) | Indicates the user can perform `create_snippet` on this resource |
+| `createWiki` | [`Boolean!`](#boolean) | Indicates the user can perform `create_wiki` on this resource |
+| `destroyDesign` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_design` on this resource |
+| `destroyPages` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_pages` on this resource |
+| `destroyWiki` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_wiki` on this resource |
+| `downloadCode` | [`Boolean!`](#boolean) | Indicates the user can perform `download_code` on this resource |
+| `downloadWikiCode` | [`Boolean!`](#boolean) | Indicates the user can perform `download_wiki_code` on this resource |
+| `forkProject` | [`Boolean!`](#boolean) | Indicates the user can perform `fork_project` on this resource |
+| `pushCode` | [`Boolean!`](#boolean) | Indicates the user can perform `push_code` on this resource |
+| `pushToDeleteProtectedBranch` | [`Boolean!`](#boolean) | Indicates the user can perform `push_to_delete_protected_branch` on this resource |
+| `readCommitStatus` | [`Boolean!`](#boolean) | Indicates the user can perform `read_commit_status` on this resource |
+| `readCycleAnalytics` | [`Boolean!`](#boolean) | Indicates the user can perform `read_cycle_analytics` on this resource |
+| `readDesign` | [`Boolean!`](#boolean) | Indicates the user can perform `read_design` on this resource |
+| `readMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `read_merge_request` on this resource |
+| `readPagesContent` | [`Boolean!`](#boolean) | Indicates the user can perform `read_pages_content` on this resource |
+| `readProject` | [`Boolean!`](#boolean) | Indicates the user can perform `read_project` on this resource |
+| `readProjectMember` | [`Boolean!`](#boolean) | Indicates the user can perform `read_project_member` on this resource |
+| `readWiki` | [`Boolean!`](#boolean) | Indicates the user can perform `read_wiki` on this resource |
+| `removeForkProject` | [`Boolean!`](#boolean) | Indicates the user can perform `remove_fork_project` on this resource |
+| `removePages` | [`Boolean!`](#boolean) | Indicates the user can perform `remove_pages` on this resource |
+| `removeProject` | [`Boolean!`](#boolean) | Indicates the user can perform `remove_project` on this resource |
+| `renameProject` | [`Boolean!`](#boolean) | Indicates the user can perform `rename_project` on this resource |
+| `requestAccess` | [`Boolean!`](#boolean) | Indicates the user can perform `request_access` on this resource |
+| `updatePages` | [`Boolean!`](#boolean) | Indicates the user can perform `update_pages` on this resource |
+| `updateWiki` | [`Boolean!`](#boolean) | Indicates the user can perform `update_wiki` on this resource |
+| `uploadFile` | [`Boolean!`](#boolean) | Indicates the user can perform `upload_file` on this resource |
+
+### `ProjectStatistics`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `buildArtifactsSize` | [`Float!`](#float) | Build artifacts size of the project in bytes. |
+| `commitCount` | [`Float!`](#float) | Commit count of the project. |
+| `lfsObjectsSize` | [`Float!`](#float) | Large File Storage (LFS) object size of the project in bytes. |
+| `packagesSize` | [`Float!`](#float) | Packages size of the project in bytes. |
+| `repositorySize` | [`Float!`](#float) | Repository size of the project in bytes. |
+| `snippetsSize` | [`Float`](#float) | Snippets size of the project in bytes. |
+| `storageSize` | [`Float!`](#float) | Storage size of the project in bytes. |
+| `uploadsSize` | [`Float`](#float) | Uploads size of the project in bytes. |
+| `wikiSize` | [`Float`](#float) | Wiki size of the project in bytes. |
+
+### `PrometheusAlert`
The alert condition for Prometheus.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `humanizedText` | String! | The human-readable text of the alert condition. |
-| `id` | ID! | ID of the alert condition. |
+| `humanizedText` | [`String!`](#string) | The human-readable text of the alert condition. |
+| `id` | [`ID!`](#id) | ID of the alert condition. |
-### PrometheusIntegrationCreatePayload
+### `PrometheusIntegrationCreatePayload`
Autogenerated return type of PrometheusIntegrationCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `integration` | AlertManagementPrometheusIntegration | The newly created integration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `integration` | [`AlertManagementPrometheusIntegration`](#alertmanagementprometheusintegration) | The newly created integration. |
-### PrometheusIntegrationResetTokenPayload
+### `PrometheusIntegrationResetTokenPayload`
Autogenerated return type of PrometheusIntegrationResetToken.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `integration` | AlertManagementPrometheusIntegration | The newly created integration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `integration` | [`AlertManagementPrometheusIntegration`](#alertmanagementprometheusintegration) | The newly created integration. |
-### PrometheusIntegrationUpdatePayload
+### `PrometheusIntegrationUpdatePayload`
Autogenerated return type of PrometheusIntegrationUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `integration` | AlertManagementPrometheusIntegration | The newly created integration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `integration` | [`AlertManagementPrometheusIntegration`](#alertmanagementprometheusintegration) | The newly created integration. |
-### PromoteToEpicPayload
+### `PromoteToEpicPayload`
Autogenerated return type of PromoteToEpic.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after issue promotion. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epic` | [`Epic`](#epic) | The epic after issue promotion. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### Release
+### `PushRules`
+
+Represents rules that commit pushes must follow.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `rejectUnsignedCommits` | [`Boolean!`](#boolean) | Indicates whether commits not signed through GPG will be rejected. |
+
+### `Release`
Represents a release.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `assets` | ReleaseAssets | Assets of the release. |
-| `author` | User | User that created the release. |
-| `commit` | Commit | The commit associated with the release. |
-| `createdAt` | Time | Timestamp of when the release was created. |
-| `description` | String | Description (also known as "release notes") of the release. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `evidences` | ReleaseEvidenceConnection | Evidence for the release. |
-| `links` | ReleaseLinks | Links of the release. |
-| `milestones` | MilestoneConnection | Milestones associated to the release. |
-| `name` | String | Name of the release. |
-| `releasedAt` | Time | Timestamp of when the release was released. |
-| `tagName` | String | Name of the tag associated with the release. |
-| `tagPath` | String | Relative web path to the tag associated with the release. |
-| `upcomingRelease` | Boolean | Indicates the release is an upcoming release. |
+| `assets` | [`ReleaseAssets`](#releaseassets) | Assets of the release. |
+| `author` | [`User`](#user) | User that created the release. |
+| `commit` | [`Commit`](#commit) | The commit associated with the release. |
+| `createdAt` | [`Time`](#time) | Timestamp of when the release was created. |
+| `description` | [`String`](#string) | Description (also known as "release notes") of the release. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `evidences` | [`ReleaseEvidenceConnection`](#releaseevidenceconnection) | Evidence for the release. |
+| `links` | [`ReleaseLinks`](#releaselinks) | Links of the release. |
+| `milestones` | [`MilestoneConnection`](#milestoneconnection) | Milestones associated to the release. |
+| `name` | [`String`](#string) | Name of the release. |
+| `releasedAt` | [`Time`](#time) | Timestamp of when the release was released. |
+| `tagName` | [`String`](#string) | Name of the tag associated with the release. |
+| `tagPath` | [`String`](#string) | Relative web path to the tag associated with the release. |
+| `upcomingRelease` | [`Boolean`](#boolean) | Indicates the release is an upcoming release. |
-### ReleaseAssetLink
+### `ReleaseAssetLink`
Represents an asset link associated with a release.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `directAssetUrl` | String | Direct asset URL of the link. |
-| `external` | Boolean | Indicates the link points to an external resource. |
-| `id` | ID! | ID of the link. |
-| `linkType` | ReleaseAssetLinkType | Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`. |
-| `name` | String | Name of the link. |
-| `url` | String | URL of the link. |
+| `directAssetUrl` | [`String`](#string) | Direct asset URL of the link. |
+| `external` | [`Boolean`](#boolean) | Indicates the link points to an external resource. |
+| `id` | [`ID!`](#id) | ID of the link. |
+| `linkType` | [`ReleaseAssetLinkType`](#releaseassetlinktype) | Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`. |
+| `name` | [`String`](#string) | Name of the link. |
+| `url` | [`String`](#string) | URL of the link. |
+
+### `ReleaseAssetLinkConnection`
-### ReleaseAssets
+The connection type for ReleaseAssetLink.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ReleaseAssetLinkEdge]`](#releaseassetlinkedge) | A list of edges. |
+| `nodes` | [`[ReleaseAssetLink]`](#releaseassetlink) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ReleaseAssetLinkCreatePayload`
+
+Autogenerated return type of ReleaseAssetLinkCreate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `link` | [`ReleaseAssetLink`](#releaseassetlink) | The asset link after mutation. |
+
+### `ReleaseAssetLinkEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ReleaseAssetLink`](#releaseassetlink) | The item at the end of the edge. |
+
+### `ReleaseAssetLinkUpdatePayload`
+
+Autogenerated return type of ReleaseAssetLinkUpdate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `link` | [`ReleaseAssetLink`](#releaseassetlink) | The asset link after mutation. |
+
+### `ReleaseAssets`
A container for all assets associated with a release.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int | Number of assets of the release. |
-| `links` | ReleaseAssetLinkConnection | Asset links of the release. |
-| `sources` | ReleaseSourceConnection | Sources of the release. |
+| `count` | [`Int`](#int) | Number of assets of the release. |
+| `links` | [`ReleaseAssetLinkConnection`](#releaseassetlinkconnection) | Asset links of the release. |
+| `sources` | [`ReleaseSourceConnection`](#releasesourceconnection) | Sources of the release. |
+
+### `ReleaseConnection`
+
+The connection type for Release.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[ReleaseEdge]`](#releaseedge) | A list of edges. |
+| `nodes` | [`[Release]`](#release) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### ReleaseCreatePayload
+### `ReleaseCreatePayload`
Autogenerated return type of ReleaseCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `release` | Release | The release after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `release` | [`Release`](#release) | The release after mutation. |
-### ReleaseDeletePayload
+### `ReleaseDeletePayload`
Autogenerated return type of ReleaseDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `release` | Release | The deleted release. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `release` | [`Release`](#release) | The deleted release. |
+
+### `ReleaseEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Release`](#release) | The item at the end of the edge. |
-### ReleaseEvidence
+### `ReleaseEvidence`
Evidence for a release.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `collectedAt` | Time | Timestamp when the evidence was collected. |
-| `filepath` | String | URL from where the evidence can be downloaded. |
-| `id` | ID! | ID of the evidence. |
-| `sha` | String | SHA1 ID of the evidence hash. |
+| `collectedAt` | [`Time`](#time) | Timestamp when the evidence was collected. |
+| `filepath` | [`String`](#string) | URL from where the evidence can be downloaded. |
+| `id` | [`ID!`](#id) | ID of the evidence. |
+| `sha` | [`String`](#string) | SHA1 ID of the evidence hash. |
-### ReleaseLinks
+### `ReleaseEvidenceConnection`
+
+The connection type for ReleaseEvidence.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `closedIssuesUrl` | String | HTTP URL of the issues page, filtered by this release and `state=closed`. |
-| `closedMergeRequestsUrl` | String | HTTP URL of the merge request page , filtered by this release and `state=closed`. |
-| `editUrl` | String | HTTP URL of the release's edit page. |
-| `mergedMergeRequestsUrl` | String | HTTP URL of the merge request page , filtered by this release and `state=merged`. |
-| `openedIssuesUrl` | String | HTTP URL of the issues page, filtered by this release and `state=open`. |
-| `openedMergeRequestsUrl` | String | HTTP URL of the merge request page, filtered by this release and `state=open`. |
-| `selfUrl` | String | HTTP URL of the release. |
+| `edges` | [`[ReleaseEvidenceEdge]`](#releaseevidenceedge) | A list of edges. |
+| `nodes` | [`[ReleaseEvidence]`](#releaseevidence) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ReleaseEvidenceEdge`
-### ReleaseSource
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ReleaseEvidence`](#releaseevidence) | The item at the end of the edge. |
+
+### `ReleaseLinks`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `closedIssuesUrl` | [`String`](#string) | HTTP URL of the issues page, filtered by this release and `state=closed`. |
+| `closedMergeRequestsUrl` | [`String`](#string) | HTTP URL of the merge request page , filtered by this release and `state=closed`. |
+| `editUrl` | [`String`](#string) | HTTP URL of the release's edit page. |
+| `mergedMergeRequestsUrl` | [`String`](#string) | HTTP URL of the merge request page , filtered by this release and `state=merged`. |
+| `openedIssuesUrl` | [`String`](#string) | HTTP URL of the issues page, filtered by this release and `state=open`. |
+| `openedMergeRequestsUrl` | [`String`](#string) | HTTP URL of the merge request page, filtered by this release and `state=open`. |
+| `selfUrl` | [`String`](#string) | HTTP URL of the release. |
+
+### `ReleaseSource`
Represents the source code attached to a release in a particular format.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `format` | String | Format of the source. |
-| `url` | String | Download URL of the source. |
+| `format` | [`String`](#string) | Format of the source. |
+| `url` | [`String`](#string) | Download URL of the source. |
+
+### `ReleaseSourceConnection`
+
+The connection type for ReleaseSource.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ReleaseSourceEdge]`](#releasesourceedge) | A list of edges. |
+| `nodes` | [`[ReleaseSource]`](#releasesource) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### ReleaseUpdatePayload
+### `ReleaseSourceEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ReleaseSource`](#releasesource) | The item at the end of the edge. |
+
+### `ReleaseUpdatePayload`
Autogenerated return type of ReleaseUpdate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `release` | Release | The release after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `release` | [`Release`](#release) | The release after mutation. |
-### RemoveAwardEmojiPayload
+### `RemoveAwardEmojiPayload`
Autogenerated return type of RemoveAwardEmoji.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `awardEmoji` | AwardEmoji | The award emoji after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `awardEmoji` | [`AwardEmoji`](#awardemoji) | The award emoji after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### RemoveProjectFromSecurityDashboardPayload
+### `RemoveProjectFromSecurityDashboardPayload`
Autogenerated return type of RemoveProjectFromSecurityDashboard.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### RepositionImageDiffNotePayload
+### `RepositionImageDiffNotePayload`
Autogenerated return type of RepositionImageDiffNote.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `note` | Note | The note after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `note` | [`Note`](#note) | The note after mutation. |
-### Repository
+### `Repository`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `empty` | Boolean! | Indicates repository has no visible content. |
-| `exists` | Boolean! | Indicates a corresponding Git repository exists on disk. |
-| `rootRef` | String | Default branch of the repository. |
-| `tree` | Tree | Tree of the repository. |
+| `empty` | [`Boolean!`](#boolean) | Indicates repository has no visible content. |
+| `exists` | [`Boolean!`](#boolean) | Indicates a corresponding Git repository exists on disk. |
+| `rootRef` | [`String`](#string) | Default branch of the repository. |
+| `tree` | [`Tree`](#tree) | Tree of the repository. |
-### Requirement
+### `Requirement`
Represents a requirement.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `author` | User! | Author of the requirement. |
-| `createdAt` | Time! | Timestamp of when the requirement was created. |
-| `description` | String | Description of the requirement. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `id` | ID! | ID of the requirement. |
-| `iid` | ID! | Internal ID of the requirement. |
-| `lastTestReportManuallyCreated` | Boolean | Indicates if latest test report was created by user. |
-| `lastTestReportState` | TestReportState | Latest requirement test report state. |
-| `project` | Project! | Project to which the requirement belongs. |
-| `state` | RequirementState! | State of the requirement. |
-| `testReports` | TestReportConnection | Test reports of the requirement. |
-| `title` | String | Title of the requirement. |
-| `titleHtml` | String | The GitLab Flavored Markdown rendering of `title` |
-| `updatedAt` | Time! | Timestamp of when the requirement was last updated. |
-| `userPermissions` | RequirementPermissions! | Permissions for the current user on the resource |
+| `author` | [`User!`](#user) | Author of the requirement. |
+| `createdAt` | [`Time!`](#time) | Timestamp of when the requirement was created. |
+| `description` | [`String`](#string) | Description of the requirement. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `id` | [`ID!`](#id) | ID of the requirement. |
+| `iid` | [`ID!`](#id) | Internal ID of the requirement. |
+| `lastTestReportManuallyCreated` | [`Boolean`](#boolean) | Indicates if latest test report was created by user. |
+| `lastTestReportState` | [`TestReportState`](#testreportstate) | Latest requirement test report state. |
+| `project` | [`Project!`](#project) | Project to which the requirement belongs. |
+| `state` | [`RequirementState!`](#requirementstate) | State of the requirement. |
+| `testReports` | [`TestReportConnection`](#testreportconnection) | Test reports of the requirement. |
+| `title` | [`String`](#string) | Title of the requirement. |
+| `titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title` |
+| `updatedAt` | [`Time!`](#time) | Timestamp of when the requirement was last updated. |
+| `userPermissions` | [`RequirementPermissions!`](#requirementpermissions) | Permissions for the current user on the resource |
+
+### `RequirementConnection`
+
+The connection type for Requirement.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[RequirementEdge]`](#requirementedge) | A list of edges. |
+| `nodes` | [`[Requirement]`](#requirement) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `RequirementEdge`
-### RequirementPermissions
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Requirement`](#requirement) | The item at the end of the edge. |
+
+### `RequirementPermissions`
Check permissions for the current user on a requirement.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminRequirement` | Boolean! | Indicates the user can perform `admin_requirement` on this resource |
-| `createRequirement` | Boolean! | Indicates the user can perform `create_requirement` on this resource |
-| `destroyRequirement` | Boolean! | Indicates the user can perform `destroy_requirement` on this resource |
-| `readRequirement` | Boolean! | Indicates the user can perform `read_requirement` on this resource |
-| `updateRequirement` | Boolean! | Indicates the user can perform `update_requirement` on this resource |
+| `adminRequirement` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_requirement` on this resource |
+| `createRequirement` | [`Boolean!`](#boolean) | Indicates the user can perform `create_requirement` on this resource |
+| `destroyRequirement` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_requirement` on this resource |
+| `readRequirement` | [`Boolean!`](#boolean) | Indicates the user can perform `read_requirement` on this resource |
+| `updateRequirement` | [`Boolean!`](#boolean) | Indicates the user can perform `update_requirement` on this resource |
-### RequirementStatesCount
+### `RequirementStatesCount`
Counts of requirements by their state.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `archived` | Int | Number of archived requirements. |
-| `opened` | Int | Number of opened requirements. |
+| `archived` | [`Int`](#int) | Number of archived requirements. |
+| `opened` | [`Int`](#int) | Number of opened requirements. |
-### RevertVulnerabilityToDetectedPayload
+### `RevertVulnerabilityToDetectedPayload`
Autogenerated return type of RevertVulnerabilityToDetected.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after revert. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `vulnerability` | [`Vulnerability`](#vulnerability) | The vulnerability after revert. |
-### RootStorageStatistics
+### `RootStorageStatistics`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `buildArtifactsSize` | Float! | The CI artifacts size in bytes. |
-| `lfsObjectsSize` | Float! | The LFS objects size in bytes. |
-| `packagesSize` | Float! | The packages size in bytes. |
-| `pipelineArtifactsSize` | Float! | The CI pipeline artifacts size in bytes. |
-| `repositorySize` | Float! | The Git repository size in bytes. |
-| `snippetsSize` | Float! | The snippets size in bytes. |
-| `storageSize` | Float! | The total storage in bytes. |
-| `uploadsSize` | Float! | The uploads size in bytes. |
-| `wikiSize` | Float! | The wiki size in bytes. |
+| `buildArtifactsSize` | [`Float!`](#float) | The CI artifacts size in bytes. |
+| `lfsObjectsSize` | [`Float!`](#float) | The LFS objects size in bytes. |
+| `packagesSize` | [`Float!`](#float) | The packages size in bytes. |
+| `pipelineArtifactsSize` | [`Float!`](#float) | The CI pipeline artifacts size in bytes. |
+| `repositorySize` | [`Float!`](#float) | The Git repository size in bytes. |
+| `snippetsSize` | [`Float!`](#float) | The snippets size in bytes. |
+| `storageSize` | [`Float!`](#float) | The total storage in bytes. |
+| `uploadsSize` | [`Float!`](#float) | The uploads size in bytes. |
+| `wikiSize` | [`Float!`](#float) | The wiki size in bytes. |
-### RunDASTScanPayload
+### `RunDASTScanPayload`
Autogenerated return type of RunDASTScan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `pipelineUrl` | String | URL of the pipeline that was created. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `pipelineUrl` | [`String`](#string) | URL of the pipeline that was created. |
+
+### `RunnerArchitecture`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `downloadLocation` | [`String!`](#string) | Download location for the runner for the platform architecture. |
+| `name` | [`String!`](#string) | Name of the runner platform architecture. |
+
+### `RunnerArchitectureConnection`
+
+The connection type for RunnerArchitecture.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[RunnerArchitectureEdge]`](#runnerarchitectureedge) | A list of edges. |
+| `nodes` | [`[RunnerArchitecture]`](#runnerarchitecture) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `RunnerArchitectureEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`RunnerArchitecture`](#runnerarchitecture) | The item at the end of the edge. |
+
+### `RunnerPlatform`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `architectures` | [`RunnerArchitectureConnection`](#runnerarchitectureconnection) | Runner architectures supported for the platform. |
+| `humanReadableName` | [`String!`](#string) | Human readable name of the runner platform. |
+| `name` | [`String!`](#string) | Name slug of the runner platform. |
+
+### `RunnerPlatformConnection`
-### RunnerArchitecture
+The connection type for RunnerPlatform.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `downloadLocation` | String! | Download location for the runner for the platform architecture. |
-| `name` | String! | Name of the runner platform architecture. |
+| `edges` | [`[RunnerPlatformEdge]`](#runnerplatformedge) | A list of edges. |
+| `nodes` | [`[RunnerPlatform]`](#runnerplatform) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### RunnerPlatform
+### `RunnerPlatformEdge`
+
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `architectures` | RunnerArchitectureConnection | Runner architectures supported for the platform. |
-| `humanReadableName` | String! | Human readable name of the runner platform. |
-| `name` | String! | Name slug of the runner platform. |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`RunnerPlatform`](#runnerplatform) | The item at the end of the edge. |
-### RunnerSetup
+### `RunnerSetup`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `installInstructions` | String! | Instructions for installing the runner on the specified architecture. |
-| `registerInstructions` | String | Instructions for registering the runner. |
+| `installInstructions` | [`String!`](#string) | Instructions for installing the runner on the specified architecture. |
+| `registerInstructions` | [`String`](#string) | Instructions for registering the runner. |
-### SastCiConfiguration
+### `SastCiConfiguration`
Represents a CI configuration of SAST.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `analyzers` | SastCiConfigurationAnalyzersEntityConnection | List of analyzers entities attached to SAST configuration. |
-| `global` | SastCiConfigurationEntityConnection | List of global entities related to SAST configuration. |
-| `pipeline` | SastCiConfigurationEntityConnection | List of pipeline entities related to SAST configuration. |
+| `analyzers` | [`SastCiConfigurationAnalyzersEntityConnection`](#sastciconfigurationanalyzersentityconnection) | List of analyzers entities attached to SAST configuration. |
+| `global` | [`SastCiConfigurationEntityConnection`](#sastciconfigurationentityconnection) | List of global entities related to SAST configuration. |
+| `pipeline` | [`SastCiConfigurationEntityConnection`](#sastciconfigurationentityconnection) | List of pipeline entities related to SAST configuration. |
-### SastCiConfigurationAnalyzersEntity
+### `SastCiConfigurationAnalyzersEntity`
Represents an analyzer entity in SAST CI configuration.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String | Analyzer description that is displayed on the form. |
-| `enabled` | Boolean | Indicates whether an analyzer is enabled. |
-| `label` | String | Analyzer label used in the config UI. |
-| `name` | String | Name of the analyzer. |
-| `variables` | SastCiConfigurationEntityConnection | List of supported variables. |
+| `description` | [`String`](#string) | Analyzer description that is displayed on the form. |
+| `enabled` | [`Boolean`](#boolean) | Indicates whether an analyzer is enabled. |
+| `label` | [`String`](#string) | Analyzer label used in the config UI. |
+| `name` | [`String`](#string) | Name of the analyzer. |
+| `variables` | [`SastCiConfigurationEntityConnection`](#sastciconfigurationentityconnection) | List of supported variables. |
+
+### `SastCiConfigurationAnalyzersEntityConnection`
+
+The connection type for SastCiConfigurationAnalyzersEntity.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[SastCiConfigurationAnalyzersEntityEdge]`](#sastciconfigurationanalyzersentityedge) | A list of edges. |
+| `nodes` | [`[SastCiConfigurationAnalyzersEntity]`](#sastciconfigurationanalyzersentity) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### SastCiConfigurationEntity
+### `SastCiConfigurationAnalyzersEntityEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`SastCiConfigurationAnalyzersEntity`](#sastciconfigurationanalyzersentity) | The item at the end of the edge. |
+
+### `SastCiConfigurationEntity`
Represents an entity in SAST CI configuration.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `defaultValue` | String | Default value that is used if value is empty. |
-| `description` | String | Entity description that is displayed on the form. |
-| `field` | String | CI keyword of entity. |
-| `label` | String | Label for entity used in the form. |
-| `options` | SastCiConfigurationOptionsEntityConnection | Different possible values of the field. |
-| `size` | SastUiComponentSize | Size of the UI component. |
-| `type` | String | Type of the field value. |
-| `value` | String | Current value of the entity. |
+| `defaultValue` | [`String`](#string) | Default value that is used if value is empty. |
+| `description` | [`String`](#string) | Entity description that is displayed on the form. |
+| `field` | [`String`](#string) | CI keyword of entity. |
+| `label` | [`String`](#string) | Label for entity used in the form. |
+| `options` | [`SastCiConfigurationOptionsEntityConnection`](#sastciconfigurationoptionsentityconnection) | Different possible values of the field. |
+| `size` | [`SastUiComponentSize`](#sastuicomponentsize) | Size of the UI component. |
+| `type` | [`String`](#string) | Type of the field value. |
+| `value` | [`String`](#string) | Current value of the entity. |
+
+### `SastCiConfigurationEntityConnection`
-### SastCiConfigurationOptionsEntity
+The connection type for SastCiConfigurationEntity.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[SastCiConfigurationEntityEdge]`](#sastciconfigurationentityedge) | A list of edges. |
+| `nodes` | [`[SastCiConfigurationEntity]`](#sastciconfigurationentity) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `SastCiConfigurationEntityEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`SastCiConfigurationEntity`](#sastciconfigurationentity) | The item at the end of the edge. |
+
+### `SastCiConfigurationOptionsEntity`
Represents an entity for options in SAST CI configuration.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `label` | String | Label of option entity. |
-| `value` | String | Value of option entity. |
+| `label` | [`String`](#string) | Label of option entity. |
+| `value` | [`String`](#string) | Value of option entity. |
+
+### `SastCiConfigurationOptionsEntityConnection`
+
+The connection type for SastCiConfigurationOptionsEntity.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[SastCiConfigurationOptionsEntityEdge]`](#sastciconfigurationoptionsentityedge) | A list of edges. |
+| `nodes` | [`[SastCiConfigurationOptionsEntity]`](#sastciconfigurationoptionsentity) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `SastCiConfigurationOptionsEntityEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`SastCiConfigurationOptionsEntity`](#sastciconfigurationoptionsentity) | The item at the end of the edge. |
+
+### `Scan`
+
+Represents the security scan information.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `errors` | [`[String!]!`](#string) | List of errors. |
+| `name` | [`String!`](#string) | Name of the scan. |
+
+### `ScanConnection`
+
+The connection type for Scan.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ScanEdge]`](#scanedge) | A list of edges. |
+| `nodes` | [`[Scan]`](#scan) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### ScannedResource
+### `ScanEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Scan`](#scan) | The item at the end of the edge. |
+
+### `ScannedResource`
Represents a resource scanned by a security scan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `requestMethod` | String | The HTTP request method used to access the URL. |
-| `url` | String | The URL scanned by the scanner. |
+| `requestMethod` | [`String`](#string) | The HTTP request method used to access the URL. |
+| `url` | [`String`](#string) | The URL scanned by the scanner. |
+
+### `ScannedResourceConnection`
-### SecurityReportSummary
+The connection type for ScannedResource.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ScannedResourceEdge]`](#scannedresourceedge) | A list of edges. |
+| `nodes` | [`[ScannedResource]`](#scannedresource) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ScannedResourceEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`ScannedResource`](#scannedresource) | The item at the end of the edge. |
+
+### `SecurityReportSummary`
Represents summary of a security report.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `apiFuzzing` | SecurityReportSummarySection | Aggregated counts for the `api_fuzzing` scan |
-| `containerScanning` | SecurityReportSummarySection | Aggregated counts for the `container_scanning` scan |
-| `coverageFuzzing` | SecurityReportSummarySection | Aggregated counts for the `coverage_fuzzing` scan |
-| `dast` | SecurityReportSummarySection | Aggregated counts for the `dast` scan |
-| `dependencyScanning` | SecurityReportSummarySection | Aggregated counts for the `dependency_scanning` scan |
-| `sast` | SecurityReportSummarySection | Aggregated counts for the `sast` scan |
-| `secretDetection` | SecurityReportSummarySection | Aggregated counts for the `secret_detection` scan |
+| `apiFuzzing` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `api_fuzzing` scan |
+| `containerScanning` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `container_scanning` scan |
+| `coverageFuzzing` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `coverage_fuzzing` scan |
+| `dast` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `dast` scan |
+| `dependencyScanning` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `dependency_scanning` scan |
+| `sast` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `sast` scan |
+| `secretDetection` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `secret_detection` scan |
-### SecurityReportSummarySection
+### `SecurityReportSummarySection`
Represents a section of a summary of a security report.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `scannedResources` | ScannedResourceConnection | A list of the first 20 scanned resources. |
-| `scannedResourcesCount` | Int | Total number of scanned resources. |
-| `scannedResourcesCsvPath` | String | Path to download all the scanned resources in CSV format. |
-| `vulnerabilitiesCount` | Int | Total number of vulnerabilities. |
+| `scannedResources` | [`ScannedResourceConnection`](#scannedresourceconnection) | A list of the first 20 scanned resources. |
+| `scannedResourcesCount` | [`Int`](#int) | Total number of scanned resources. |
+| `scannedResourcesCsvPath` | [`String`](#string) | Path to download all the scanned resources in CSV format. |
+| `scans` | [`ScanConnection!`](#scanconnection) | List of security scans ran for the type. |
+| `vulnerabilitiesCount` | [`Int`](#int) | Total number of vulnerabilities. |
-### SecurityScanners
+### `SecurityScanners`
Represents a list of security scanners.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `available` | SecurityScannerType! => Array | List of analyzers which are available for the project. |
-| `enabled` | SecurityScannerType! => Array | List of analyzers which are enabled for the project. |
-| `pipelineRun` | SecurityScannerType! => Array | List of analyzers which ran successfully in the latest pipeline. |
+| `available` | [`[SecurityScannerType!]`](#securityscannertype) | List of analyzers which are available for the project. |
+| `enabled` | [`[SecurityScannerType!]`](#securityscannertype) | List of analyzers which are enabled for the project. |
+| `pipelineRun` | [`[SecurityScannerType!]`](#securityscannertype) | List of analyzers which ran successfully in the latest pipeline. |
-### SentryDetailedError
+### `SentryDetailedError`
A Sentry error.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int! | Count of occurrences. |
-| `culprit` | String! | Culprit of the error. |
-| `externalBaseUrl` | String! | External Base URL of the Sentry Instance. |
-| `externalUrl` | String! | External URL of the error. |
-| `firstReleaseLastCommit` | String | Commit the error was first seen. |
-| `firstReleaseShortVersion` | String | Release short version the error was first seen. |
-| `firstReleaseVersion` | String | Release version the error was first seen. |
-| `firstSeen` | Time! | Timestamp when the error was first seen. |
-| `frequency` | SentryErrorFrequency! => Array | Last 24hr stats of the error. |
-| `gitlabCommit` | String | GitLab commit SHA attributed to the Error based on the release version. |
-| `gitlabCommitPath` | String | Path to the GitLab page for the GitLab commit attributed to the error. |
-| `gitlabIssuePath` | String | URL of GitLab Issue. |
-| `id` | ID! | ID (global ID) of the error. |
-| `lastReleaseLastCommit` | String | Commit the error was last seen. |
-| `lastReleaseShortVersion` | String | Release short version the error was last seen. |
-| `lastReleaseVersion` | String | Release version the error was last seen. |
-| `lastSeen` | Time! | Timestamp when the error was last seen. |
-| `message` | String | Sentry metadata message of the error. |
-| `sentryId` | String! | ID (Sentry ID) of the error. |
-| `sentryProjectId` | ID! | ID of the project (Sentry project). |
-| `sentryProjectName` | String! | Name of the project affected by the error. |
-| `sentryProjectSlug` | String! | Slug of the project affected by the error. |
-| `shortId` | String! | Short ID (Sentry ID) of the error. |
-| `status` | SentryErrorStatus! | Status of the error. |
-| `tags` | SentryErrorTags! | Tags associated with the Sentry Error. |
-| `title` | String! | Title of the error. |
-| `type` | String! | Type of the error. |
-| `userCount` | Int! | Count of users affected by the error. |
-
-### SentryError
+| `count` | [`Int!`](#int) | Count of occurrences. |
+| `culprit` | [`String!`](#string) | Culprit of the error. |
+| `externalBaseUrl` | [`String!`](#string) | External Base URL of the Sentry Instance. |
+| `externalUrl` | [`String!`](#string) | External URL of the error. |
+| `firstReleaseLastCommit` | [`String`](#string) | Commit the error was first seen. |
+| `firstReleaseShortVersion` | [`String`](#string) | Release short version the error was first seen. |
+| `firstReleaseVersion` | [`String`](#string) | Release version the error was first seen. |
+| `firstSeen` | [`Time!`](#time) | Timestamp when the error was first seen. |
+| `frequency` | [`[SentryErrorFrequency!]!`](#sentryerrorfrequency) | Last 24hr stats of the error. |
+| `gitlabCommit` | [`String`](#string) | GitLab commit SHA attributed to the Error based on the release version. |
+| `gitlabCommitPath` | [`String`](#string) | Path to the GitLab page for the GitLab commit attributed to the error. |
+| `gitlabIssuePath` | [`String`](#string) | URL of GitLab Issue. |
+| `id` | [`ID!`](#id) | ID (global ID) of the error. |
+| `lastReleaseLastCommit` | [`String`](#string) | Commit the error was last seen. |
+| `lastReleaseShortVersion` | [`String`](#string) | Release short version the error was last seen. |
+| `lastReleaseVersion` | [`String`](#string) | Release version the error was last seen. |
+| `lastSeen` | [`Time!`](#time) | Timestamp when the error was last seen. |
+| `message` | [`String`](#string) | Sentry metadata message of the error. |
+| `sentryId` | [`String!`](#string) | ID (Sentry ID) of the error. |
+| `sentryProjectId` | [`ID!`](#id) | ID of the project (Sentry project). |
+| `sentryProjectName` | [`String!`](#string) | Name of the project affected by the error. |
+| `sentryProjectSlug` | [`String!`](#string) | Slug of the project affected by the error. |
+| `shortId` | [`String!`](#string) | Short ID (Sentry ID) of the error. |
+| `status` | [`SentryErrorStatus!`](#sentryerrorstatus) | Status of the error. |
+| `tags` | [`SentryErrorTags!`](#sentryerrortags) | Tags associated with the Sentry Error. |
+| `title` | [`String!`](#string) | Title of the error. |
+| `type` | [`String!`](#string) | Type of the error. |
+| `userCount` | [`Int!`](#int) | Count of users affected by the error. |
+
+### `SentryError`
A Sentry error. A simplified version of SentryDetailedError.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int! | Count of occurrences. |
-| `culprit` | String! | Culprit of the error. |
-| `externalUrl` | String! | External URL of the error. |
-| `firstSeen` | Time! | Timestamp when the error was first seen. |
-| `frequency` | SentryErrorFrequency! => Array | Last 24hr stats of the error. |
-| `id` | ID! | ID (global ID) of the error. |
-| `lastSeen` | Time! | Timestamp when the error was last seen. |
-| `message` | String | Sentry metadata message of the error. |
-| `sentryId` | String! | ID (Sentry ID) of the error. |
-| `sentryProjectId` | ID! | ID of the project (Sentry project). |
-| `sentryProjectName` | String! | Name of the project affected by the error. |
-| `sentryProjectSlug` | String! | Slug of the project affected by the error. |
-| `shortId` | String! | Short ID (Sentry ID) of the error. |
-| `status` | SentryErrorStatus! | Status of the error. |
-| `title` | String! | Title of the error. |
-| `type` | String! | Type of the error. |
-| `userCount` | Int! | Count of users affected by the error. |
+| `count` | [`Int!`](#int) | Count of occurrences. |
+| `culprit` | [`String!`](#string) | Culprit of the error. |
+| `externalUrl` | [`String!`](#string) | External URL of the error. |
+| `firstSeen` | [`Time!`](#time) | Timestamp when the error was first seen. |
+| `frequency` | [`[SentryErrorFrequency!]!`](#sentryerrorfrequency) | Last 24hr stats of the error. |
+| `id` | [`ID!`](#id) | ID (global ID) of the error. |
+| `lastSeen` | [`Time!`](#time) | Timestamp when the error was last seen. |
+| `message` | [`String`](#string) | Sentry metadata message of the error. |
+| `sentryId` | [`String!`](#string) | ID (Sentry ID) of the error. |
+| `sentryProjectId` | [`ID!`](#id) | ID of the project (Sentry project). |
+| `sentryProjectName` | [`String!`](#string) | Name of the project affected by the error. |
+| `sentryProjectSlug` | [`String!`](#string) | Slug of the project affected by the error. |
+| `shortId` | [`String!`](#string) | Short ID (Sentry ID) of the error. |
+| `status` | [`SentryErrorStatus!`](#sentryerrorstatus) | Status of the error. |
+| `title` | [`String!`](#string) | Title of the error. |
+| `type` | [`String!`](#string) | Type of the error. |
+| `userCount` | [`Int!`](#int) | Count of users affected by the error. |
-### SentryErrorCollection
+### `SentryErrorCollection`
An object containing a collection of Sentry errors, and a detailed error.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `detailedError` | SentryDetailedError | Detailed version of a Sentry error on the project. |
-| `errorStackTrace` | SentryErrorStackTrace | Stack Trace of Sentry Error. |
-| `errors` | SentryErrorConnection | Collection of Sentry Errors. |
-| `externalUrl` | String | External URL for Sentry. |
+| `detailedError` | [`SentryDetailedError`](#sentrydetailederror) | Detailed version of a Sentry error on the project. |
+| `errorStackTrace` | [`SentryErrorStackTrace`](#sentryerrorstacktrace) | Stack Trace of Sentry Error. |
+| `errors` | [`SentryErrorConnection`](#sentryerrorconnection) | Collection of Sentry Errors. |
+| `externalUrl` | [`String`](#string) | External URL for Sentry. |
-### SentryErrorFrequency
+### `SentryErrorConnection`
+
+The connection type for SentryError.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int! | Count of errors received since the previously recorded time. |
-| `time` | Time! | Time the error frequency stats were recorded. |
+| `edges` | [`[SentryErrorEdge]`](#sentryerroredge) | A list of edges. |
+| `nodes` | [`[SentryError]`](#sentryerror) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `SentryErrorEdge`
-### SentryErrorStackTrace
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`SentryError`](#sentryerror) | The item at the end of the edge. |
+
+### `SentryErrorFrequency`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Count of errors received since the previously recorded time. |
+| `time` | [`Time!`](#time) | Time the error frequency stats were recorded. |
+
+### `SentryErrorStackTrace`
An object containing a stack trace entry for a Sentry error.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `dateReceived` | String! | Time the stack trace was received by Sentry. |
-| `issueId` | String! | ID of the Sentry error. |
-| `stackTraceEntries` | SentryErrorStackTraceEntry! => Array | Stack trace entries for the Sentry error. |
+| `dateReceived` | [`String!`](#string) | Time the stack trace was received by Sentry. |
+| `issueId` | [`String!`](#string) | ID of the Sentry error. |
+| `stackTraceEntries` | [`[SentryErrorStackTraceEntry!]!`](#sentryerrorstacktraceentry) | Stack trace entries for the Sentry error. |
-### SentryErrorStackTraceContext
+### `SentryErrorStackTraceContext`
An object context for a Sentry error stack trace.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `code` | String! | Code number of the context. |
-| `line` | Int! | Line number of the context. |
+| `code` | [`String!`](#string) | Code number of the context. |
+| `line` | [`Int!`](#int) | Line number of the context. |
-### SentryErrorStackTraceEntry
+### `SentryErrorStackTraceEntry`
An object containing a stack trace entry for a Sentry error.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `col` | String | Function in which the Sentry error occurred. |
-| `fileName` | String | File in which the Sentry error occurred. |
-| `function` | String | Function in which the Sentry error occurred. |
-| `line` | String | Function in which the Sentry error occurred. |
-| `traceContext` | SentryErrorStackTraceContext! => Array | Context of the Sentry error. |
+| `col` | [`String`](#string) | Function in which the Sentry error occurred. |
+| `fileName` | [`String`](#string) | File in which the Sentry error occurred. |
+| `function` | [`String`](#string) | Function in which the Sentry error occurred. |
+| `line` | [`String`](#string) | Function in which the Sentry error occurred. |
+| `traceContext` | [`[SentryErrorStackTraceContext!]`](#sentryerrorstacktracecontext) | Context of the Sentry error. |
-### SentryErrorTags
+### `SentryErrorTags`
State of a Sentry error.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `level` | String | Severity level of the Sentry Error. |
-| `logger` | String | Logger of the Sentry Error. |
+| `level` | [`String`](#string) | Severity level of the Sentry Error. |
+| `logger` | [`String`](#string) | Logger of the Sentry Error. |
+
+### `ServiceConnection`
+
+The connection type for Service.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[ServiceEdge]`](#serviceedge) | A list of edges. |
+| `nodes` | [`[Service]`](#service) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `ServiceEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Service`](#service) | The item at the end of the edge. |
-### Snippet
+### `Snippet`
Represents a snippet entry.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `author` | User | The owner of the snippet. |
-| `blob` **{warning-solid}** | SnippetBlob! | **Deprecated:** Use `blobs`. Deprecated in 13.3. |
-| `blobs` | SnippetBlobConnection | Snippet blobs. |
-| `createdAt` | Time! | Timestamp this snippet was created. |
-| `description` | String | Description of the snippet. |
-| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `fileName` | String | File Name of the snippet. |
-| `httpUrlToRepo` | String | HTTP URL to the snippet repository. |
-| `id` | SnippetID! | ID of the snippet. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `project` | Project | The project the snippet is associated with. |
-| `rawUrl` | String! | Raw URL of the snippet. |
-| `sshUrlToRepo` | String | SSH URL to the snippet repository. |
-| `title` | String! | Title of the snippet. |
-| `updatedAt` | Time! | Timestamp this snippet was updated. |
-| `userPermissions` | SnippetPermissions! | Permissions for the current user on the resource |
-| `visibilityLevel` | VisibilityLevelsEnum! | Visibility Level of the snippet. |
-| `webUrl` | String! | Web URL of the snippet. |
-
-### SnippetBlob
+| `author` | [`User`](#user) | The owner of the snippet. |
+| `blob` **{warning-solid}** | [`SnippetBlob!`](#snippetblob) | **Deprecated:** Use `blobs`. Deprecated in 13.3. |
+| `blobs` | [`SnippetBlobConnection`](#snippetblobconnection) | Snippet blobs. |
+| `createdAt` | [`Time!`](#time) | Timestamp this snippet was created. |
+| `description` | [`String`](#string) | Description of the snippet. |
+| `descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description` |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `fileName` | [`String`](#string) | File Name of the snippet. |
+| `httpUrlToRepo` | [`String`](#string) | HTTP URL to the snippet repository. |
+| `id` | [`SnippetID!`](#snippetid) | ID of the snippet. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `project` | [`Project`](#project) | The project the snippet is associated with. |
+| `rawUrl` | [`String!`](#string) | Raw URL of the snippet. |
+| `sshUrlToRepo` | [`String`](#string) | SSH URL to the snippet repository. |
+| `title` | [`String!`](#string) | Title of the snippet. |
+| `updatedAt` | [`Time!`](#time) | Timestamp this snippet was updated. |
+| `userPermissions` | [`SnippetPermissions!`](#snippetpermissions) | Permissions for the current user on the resource |
+| `visibilityLevel` | [`VisibilityLevelsEnum!`](#visibilitylevelsenum) | Visibility Level of the snippet. |
+| `webUrl` | [`String!`](#string) | Web URL of the snippet. |
+
+### `SnippetBlob`
Represents the snippet blob.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `binary` | Boolean! | Shows whether the blob is binary. |
-| `externalStorage` | String | Blob external storage. |
-| `mode` | String | Blob mode. |
-| `name` | String | Blob name. |
-| `path` | String | Blob path. |
-| `plainData` | String | Blob plain highlighted data. |
-| `rawPath` | String! | Blob raw content endpoint path. |
-| `renderedAsText` | Boolean! | Shows whether the blob is rendered as text. |
-| `richData` | String | Blob highlighted data. |
-| `richViewer` | SnippetBlobViewer | Blob content rich viewer. |
-| `simpleViewer` | SnippetBlobViewer! | Blob content simple viewer. |
-| `size` | Int! | Blob size. |
+| `binary` | [`Boolean!`](#boolean) | Shows whether the blob is binary. |
+| `externalStorage` | [`String`](#string) | Blob external storage. |
+| `mode` | [`String`](#string) | Blob mode. |
+| `name` | [`String`](#string) | Blob name. |
+| `path` | [`String`](#string) | Blob path. |
+| `plainData` | [`String`](#string) | Blob plain highlighted data. |
+| `rawPath` | [`String!`](#string) | Blob raw content endpoint path. |
+| `renderedAsText` | [`Boolean!`](#boolean) | Shows whether the blob is rendered as text. |
+| `richData` | [`String`](#string) | Blob highlighted data. |
+| `richViewer` | [`SnippetBlobViewer`](#snippetblobviewer) | Blob content rich viewer. |
+| `simpleViewer` | [`SnippetBlobViewer!`](#snippetblobviewer) | Blob content simple viewer. |
+| `size` | [`Int!`](#int) | Blob size. |
+
+### `SnippetBlobConnection`
+
+The connection type for SnippetBlob.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[SnippetBlobEdge]`](#snippetblobedge) | A list of edges. |
+| `nodes` | [`[SnippetBlob]`](#snippetblob) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `SnippetBlobEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`SnippetBlob`](#snippetblob) | The item at the end of the edge. |
-### SnippetBlobViewer
+### `SnippetBlobViewer`
Represents how the blob content should be displayed.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `collapsed` | Boolean! | Shows whether the blob should be displayed collapsed. |
-| `fileType` | String! | Content file type. |
-| `loadAsync` | Boolean! | Shows whether the blob content is loaded asynchronously. |
-| `loadingPartialName` | String! | Loading partial name. |
-| `renderError` | String | Error rendering the blob content. |
-| `tooLarge` | Boolean! | Shows whether the blob too large to be displayed. |
-| `type` | BlobViewersType! | Type of blob viewer. |
+| `collapsed` | [`Boolean!`](#boolean) | Shows whether the blob should be displayed collapsed. |
+| `fileType` | [`String!`](#string) | Content file type. |
+| `loadAsync` | [`Boolean!`](#boolean) | Shows whether the blob content is loaded asynchronously. |
+| `loadingPartialName` | [`String!`](#string) | Loading partial name. |
+| `renderError` | [`String`](#string) | Error rendering the blob content. |
+| `tooLarge` | [`Boolean!`](#boolean) | Shows whether the blob too large to be displayed. |
+| `type` | [`BlobViewersType!`](#blobviewerstype) | Type of blob viewer. |
+
+### `SnippetConnection`
+
+The connection type for Snippet.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[SnippetEdge]`](#snippetedge) | A list of edges. |
+| `nodes` | [`[Snippet]`](#snippet) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### SnippetPermissions
+### `SnippetEdge`
+
+An edge in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminSnippet` | Boolean! | Indicates the user can perform `admin_snippet` on this resource |
-| `awardEmoji` | Boolean! | Indicates the user can perform `award_emoji` on this resource |
-| `createNote` | Boolean! | Indicates the user can perform `create_note` on this resource |
-| `readSnippet` | Boolean! | Indicates the user can perform `read_snippet` on this resource |
-| `reportSnippet` | Boolean! | Indicates the user can perform `report_snippet` on this resource |
-| `updateSnippet` | Boolean! | Indicates the user can perform `update_snippet` on this resource |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Snippet`](#snippet) | The item at the end of the edge. |
-### SnippetRepositoryRegistry
+### `SnippetPermissions`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `adminSnippet` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_snippet` on this resource |
+| `awardEmoji` | [`Boolean!`](#boolean) | Indicates the user can perform `award_emoji` on this resource |
+| `createNote` | [`Boolean!`](#boolean) | Indicates the user can perform `create_note` on this resource |
+| `readSnippet` | [`Boolean!`](#boolean) | Indicates the user can perform `read_snippet` on this resource |
+| `reportSnippet` | [`Boolean!`](#boolean) | Indicates the user can perform `report_snippet` on this resource |
+| `updateSnippet` | [`Boolean!`](#boolean) | Indicates the user can perform `update_snippet` on this resource |
+
+### `SnippetRepositoryRegistry`
Represents the Geo sync and verification state of a snippet repository.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time | Timestamp when the SnippetRepositoryRegistry was created |
-| `id` | ID! | ID of the SnippetRepositoryRegistry |
-| `lastSyncFailure` | String | Error message during sync of the SnippetRepositoryRegistry |
-| `lastSyncedAt` | Time | Timestamp of the most recent successful sync of the SnippetRepositoryRegistry |
-| `retryAt` | Time | Timestamp after which the SnippetRepositoryRegistry should be resynced |
-| `retryCount` | Int | Number of consecutive failed sync attempts of the SnippetRepositoryRegistry |
-| `snippetRepositoryId` | ID! | ID of the Snippet Repository. |
-| `state` | RegistryState | Sync state of the SnippetRepositoryRegistry |
+| `createdAt` | [`Time`](#time) | Timestamp when the SnippetRepositoryRegistry was created |
+| `id` | [`ID!`](#id) | ID of the SnippetRepositoryRegistry |
+| `lastSyncFailure` | [`String`](#string) | Error message during sync of the SnippetRepositoryRegistry |
+| `lastSyncedAt` | [`Time`](#time) | Timestamp of the most recent successful sync of the SnippetRepositoryRegistry |
+| `retryAt` | [`Time`](#time) | Timestamp after which the SnippetRepositoryRegistry should be resynced |
+| `retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the SnippetRepositoryRegistry |
+| `snippetRepositoryId` | [`ID!`](#id) | ID of the Snippet Repository. |
+| `state` | [`RegistryState`](#registrystate) | Sync state of the SnippetRepositoryRegistry |
+
+### `SnippetRepositoryRegistryConnection`
+
+The connection type for SnippetRepositoryRegistry.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[SnippetRepositoryRegistryEdge]`](#snippetrepositoryregistryedge) | A list of edges. |
+| `nodes` | [`[SnippetRepositoryRegistry]`](#snippetrepositoryregistry) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `SnippetRepositoryRegistryEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`SnippetRepositoryRegistry`](#snippetrepositoryregistry) | The item at the end of the edge. |
-### StatusAction
+### `StatusAction`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `buttonTitle` | String | Title for the button, for example: Retry this job. |
-| `icon` | String | Icon used in the action button. |
-| `method` | String | Method for the action, for example: :post. |
-| `path` | String | Path for the action. |
-| `title` | String | Title for the action, for example: Retry. |
+| `buttonTitle` | [`String`](#string) | Title for the button, for example: Retry this job. |
+| `icon` | [`String`](#string) | Icon used in the action button. |
+| `method` | [`String`](#string) | Method for the action, for example: :post. |
+| `path` | [`String`](#string) | Path for the action. |
+| `title` | [`String`](#string) | Title for the action, for example: Retry. |
-### Submodule
+### `Submodule`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `flatPath` | String! | Flat path of the entry. |
-| `id` | ID! | ID of the entry. |
-| `name` | String! | Name of the entry. |
-| `path` | String! | Path of the entry. |
-| `sha` | String! | Last commit SHA for the entry. |
-| `treeUrl` | String | Tree URL for the sub-module. |
-| `type` | EntryType! | Type of tree entry. |
-| `webUrl` | String | Web URL for the sub-module. |
+| `flatPath` | [`String!`](#string) | Flat path of the entry. |
+| `id` | [`ID!`](#id) | ID of the entry. |
+| `name` | [`String!`](#string) | Name of the entry. |
+| `path` | [`String!`](#string) | Path of the entry. |
+| `sha` | [`String!`](#string) | Last commit SHA for the entry. |
+| `treeUrl` | [`String`](#string) | Tree URL for the sub-module. |
+| `type` | [`EntryType!`](#entrytype) | Type of tree entry. |
+| `webUrl` | [`String`](#string) | Web URL for the sub-module. |
-### TaskCompletionStatus
+### `SubmoduleConnection`
+
+The connection type for Submodule.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[SubmoduleEdge]`](#submoduleedge) | A list of edges. |
+| `nodes` | [`[Submodule]`](#submodule) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `SubmoduleEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Submodule`](#submodule) | The item at the end of the edge. |
+
+### `TaskCompletionStatus`
Completion status of tasks.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `completedCount` | Int! | Number of completed tasks. |
-| `count` | Int! | Number of total tasks. |
+| `completedCount` | [`Int!`](#int) | Number of completed tasks. |
+| `count` | [`Int!`](#int) | Number of total tasks. |
-### TerraformState
+### `TerraformState`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | Timestamp the Terraform state was created. |
-| `id` | ID! | ID of the Terraform state. |
-| `latestVersion` | TerraformStateVersion | The latest version of the Terraform state. |
-| `lockedAt` | Time | Timestamp the Terraform state was locked. |
-| `lockedByUser` | User | The user currently holding a lock on the Terraform state. |
-| `name` | String! | Name of the Terraform state. |
-| `updatedAt` | Time! | Timestamp the Terraform state was updated. |
+| `createdAt` | [`Time!`](#time) | Timestamp the Terraform state was created. |
+| `id` | [`ID!`](#id) | ID of the Terraform state. |
+| `latestVersion` | [`TerraformStateVersion`](#terraformstateversion) | The latest version of the Terraform state. |
+| `lockedAt` | [`Time`](#time) | Timestamp the Terraform state was locked. |
+| `lockedByUser` | [`User`](#user) | The user currently holding a lock on the Terraform state. |
+| `name` | [`String!`](#string) | Name of the Terraform state. |
+| `updatedAt` | [`Time!`](#time) | Timestamp the Terraform state was updated. |
+
+### `TerraformStateConnection`
-### TerraformStateDeletePayload
+The connection type for TerraformState.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Total count of collection. |
+| `edges` | [`[TerraformStateEdge]`](#terraformstateedge) | A list of edges. |
+| `nodes` | [`[TerraformState]`](#terraformstate) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `TerraformStateDeletePayload`
Autogenerated return type of TerraformStateDelete.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `TerraformStateEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`TerraformState`](#terraformstate) | The item at the end of the edge. |
-### TerraformStateLockPayload
+### `TerraformStateLockPayload`
Autogenerated return type of TerraformStateLock.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### TerraformStateUnlockPayload
+### `TerraformStateUnlockPayload`
Autogenerated return type of TerraformStateUnlock.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### TerraformStateVersion
+### `TerraformStateVersion`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time! | Timestamp the version was created. |
-| `createdByUser` | User | The user that created this version. |
-| `downloadPath` | String | URL for downloading the version's JSON file. |
-| `id` | ID! | ID of the Terraform state version. |
-| `job` | CiJob | The job that created this version. |
-| `serial` | Int | Serial number of the version. |
-| `updatedAt` | Time! | Timestamp the version was updated. |
+| `createdAt` | [`Time!`](#time) | Timestamp the version was created. |
+| `createdByUser` | [`User`](#user) | The user that created this version. |
+| `downloadPath` | [`String`](#string) | URL for downloading the version's JSON file. |
+| `id` | [`ID!`](#id) | ID of the Terraform state version. |
+| `job` | [`CiJob`](#cijob) | The job that created this version. |
+| `serial` | [`Int`](#int) | Serial number of the version. |
+| `updatedAt` | [`Time!`](#time) | Timestamp the version was updated. |
-### TerraformStateVersionRegistry
+### `TerraformStateVersionRegistry`
Represents the Geo sync and verification state of a terraform state version.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createdAt` | Time | Timestamp when the TerraformStateVersionRegistry was created |
-| `id` | ID! | ID of the TerraformStateVersionRegistry |
-| `lastSyncFailure` | String | Error message during sync of the TerraformStateVersionRegistry |
-| `lastSyncedAt` | Time | Timestamp of the most recent successful sync of the TerraformStateVersionRegistry |
-| `retryAt` | Time | Timestamp after which the TerraformStateVersionRegistry should be resynced |
-| `retryCount` | Int | Number of consecutive failed sync attempts of the TerraformStateVersionRegistry |
-| `state` | RegistryState | Sync state of the TerraformStateVersionRegistry |
-| `terraformStateVersionId` | ID! | ID of the terraform state version. |
+| `createdAt` | [`Time`](#time) | Timestamp when the TerraformStateVersionRegistry was created |
+| `id` | [`ID!`](#id) | ID of the TerraformStateVersionRegistry |
+| `lastSyncFailure` | [`String`](#string) | Error message during sync of the TerraformStateVersionRegistry |
+| `lastSyncedAt` | [`Time`](#time) | Timestamp of the most recent successful sync of the TerraformStateVersionRegistry |
+| `retryAt` | [`Time`](#time) | Timestamp after which the TerraformStateVersionRegistry should be resynced |
+| `retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the TerraformStateVersionRegistry |
+| `state` | [`RegistryState`](#registrystate) | Sync state of the TerraformStateVersionRegistry |
+| `terraformStateVersionId` | [`ID!`](#id) | ID of the terraform state version. |
+
+### `TerraformStateVersionRegistryConnection`
+
+The connection type for TerraformStateVersionRegistry.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[TerraformStateVersionRegistryEdge]`](#terraformstateversionregistryedge) | A list of edges. |
+| `nodes` | [`[TerraformStateVersionRegistry]`](#terraformstateversionregistry) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `TerraformStateVersionRegistryEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`TerraformStateVersionRegistry`](#terraformstateversionregistry) | The item at the end of the edge. |
-### TestReport
+### `TestReport`
Represents a requirement test report.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `author` | User | Author of the test report. |
-| `createdAt` | Time! | Timestamp of when the test report was created. |
-| `id` | ID! | ID of the test report. |
-| `state` | TestReportState! | State of the test report. |
+| `author` | [`User`](#user) | Author of the test report. |
+| `createdAt` | [`Time!`](#time) | Timestamp of when the test report was created. |
+| `id` | [`ID!`](#id) | ID of the test report. |
+| `state` | [`TestReportState!`](#testreportstate) | State of the test report. |
+
+### `TestReportConnection`
+
+The connection type for TestReport.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[TestReportEdge]`](#testreportedge) | A list of edges. |
+| `nodes` | [`[TestReport]`](#testreport) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### TimeReportStats
+### `TestReportEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`TestReport`](#testreport) | The item at the end of the edge. |
+
+### `TimeReportStats`
Represents the time report stats for timeboxes.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `complete` | TimeboxMetrics | Completed issues metrics. |
-| `incomplete` | TimeboxMetrics | Incomplete issues metrics. |
-| `total` | TimeboxMetrics | Total issues metrics. |
+| `complete` | [`TimeboxMetrics`](#timeboxmetrics) | Completed issues metrics. |
+| `incomplete` | [`TimeboxMetrics`](#timeboxmetrics) | Incomplete issues metrics. |
+| `total` | [`TimeboxMetrics`](#timeboxmetrics) | Total issues metrics. |
-### TimeboxMetrics
+### `TimeboxMetrics`
Represents measured stats metrics for timeboxes.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int! | The count metric. |
-| `weight` | Int! | The weight metric. |
+| `count` | [`Int!`](#int) | The count metric. |
+| `weight` | [`Int!`](#int) | The weight metric. |
-### TimeboxReport
+### `TimeboxReport`
Represents a historically accurate report about the timebox.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `burnupTimeSeries` | BurnupChartDailyTotals! => Array | Daily scope and completed totals for burnup charts. |
-| `stats` | TimeReportStats | Represents the time report stats for the timebox. |
+| `burnupTimeSeries` | [`[BurnupChartDailyTotals!]`](#burnupchartdailytotals) | Daily scope and completed totals for burnup charts. |
+| `stats` | [`TimeReportStats`](#timereportstats) | Represents the time report stats for the timebox. |
+
+### `Timelog`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `issue` | [`Issue`](#issue) | The issue that logged time was added to. |
+| `note` | [`Note`](#note) | The note where the quick action to add the logged time was executed. |
+| `spentAt` | [`Time`](#time) | Timestamp of when the time tracked was spent at. |
+| `timeSpent` | [`Int!`](#int) | The time spent displayed in seconds. |
+| `user` | [`User!`](#user) | The user that logged the time. |
-### Timelog
+### `TimelogConnection`
+
+The connection type for Timelog.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `issue` | Issue | The issue that logged time was added to. |
-| `note` | Note | The note where the quick action to add the logged time was executed. |
-| `spentAt` | Time | Timestamp of when the time tracked was spent at. |
-| `timeSpent` | Int! | The time spent displayed in seconds. |
-| `user` | User! | The user that logged the time. |
+| `edges` | [`[TimelogEdge]`](#timelogedge) | A list of edges. |
+| `nodes` | [`[Timelog]`](#timelog) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `TimelogEdge`
-### Todo
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Timelog`](#timelog) | The item at the end of the edge. |
+
+### `Todo`
Representing a to-do entry.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `action` | TodoActionEnum! | Action of the to-do item. |
-| `author` | User! | The author of this to-do item. |
-| `body` | String! | Body of the to-do item. |
-| `createdAt` | Time! | Timestamp this to-do item was created. |
-| `group` | Group | Group this to-do item is associated with. |
-| `id` | ID! | ID of the to-do item. |
-| `project` | Project | The project this to-do item is associated with. |
-| `state` | TodoStateEnum! | State of the to-do item. |
-| `targetType` | TodoTargetEnum! | Target type of the to-do item. |
+| `action` | [`TodoActionEnum!`](#todoactionenum) | Action of the to-do item. |
+| `author` | [`User!`](#user) | The author of this to-do item. |
+| `body` | [`String!`](#string) | Body of the to-do item. |
+| `createdAt` | [`Time!`](#time) | Timestamp this to-do item was created. |
+| `group` | [`Group`](#group) | Group this to-do item is associated with. |
+| `id` | [`ID!`](#id) | ID of the to-do item. |
+| `project` | [`Project`](#project) | The project this to-do item is associated with. |
+| `state` | [`TodoStateEnum!`](#todostateenum) | State of the to-do item. |
+| `targetType` | [`TodoTargetEnum!`](#todotargetenum) | Target type of the to-do item. |
-### TodoCreatePayload
+### `TodoConnection`
+
+The connection type for Todo.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[TodoEdge]`](#todoedge) | A list of edges. |
+| `nodes` | [`[Todo]`](#todo) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `TodoCreatePayload`
Autogenerated return type of TodoCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `todo` | Todo | The to-do item created. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `todo` | [`Todo`](#todo) | The to-do item created. |
+
+### `TodoEdge`
-### TodoMarkDonePayload
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Todo`](#todo) | The item at the end of the edge. |
+
+### `TodoMarkDonePayload`
Autogenerated return type of TodoMarkDone.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `todo` | Todo! | The requested to-do item. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `todo` | [`Todo!`](#todo) | The requested to-do item. |
-### TodoRestoreManyPayload
+### `TodoRestoreManyPayload`
Autogenerated return type of TodoRestoreMany.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `todos` | Todo! => Array | Updated to-do items. |
-| `updatedIds` **{warning-solid}** | TodoID! => Array | **Deprecated:** Use to-do items. Deprecated in 13.2. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `todos` | [`[Todo!]!`](#todo) | Updated to-do items. |
+| `updatedIds` **{warning-solid}** | [`[TodoID!]!`](#todoid) | **Deprecated:** Use to-do items. Deprecated in 13.2. |
-### TodoRestorePayload
+### `TodoRestorePayload`
Autogenerated return type of TodoRestore.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `todo` | Todo! | The requested to-do item. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `todo` | [`Todo!`](#todo) | The requested to-do item. |
-### TodosMarkAllDonePayload
+### `TodosMarkAllDonePayload`
Autogenerated return type of TodosMarkAllDone.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `todos` | Todo! => Array | Updated to-do items. |
-| `updatedIds` **{warning-solid}** | TodoID! => Array | **Deprecated:** Use to-do items. Deprecated in 13.2. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `todos` | [`[Todo!]!`](#todo) | Updated to-do items. |
+| `updatedIds` **{warning-solid}** | [`[TodoID!]!`](#todoid) | **Deprecated:** Use to-do items. Deprecated in 13.2. |
-### ToggleAwardEmojiPayload
+### `ToggleAwardEmojiPayload`
Autogenerated return type of ToggleAwardEmoji.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `awardEmoji` | AwardEmoji | The award emoji after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `toggledOn` | Boolean! | Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji. |
+| `awardEmoji` | [`AwardEmoji`](#awardemoji) | The award emoji after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `toggledOn` | [`Boolean!`](#boolean) | Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji. |
-### Tree
+### `Tree`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `blobs` | BlobConnection! | Blobs of the tree. |
-| `lastCommit` | Commit | Last commit for the tree. |
-| `submodules` | SubmoduleConnection! | Sub-modules of the tree. |
-| `trees` | TreeEntryConnection! | Trees of the tree. |
+| `blobs` | [`BlobConnection!`](#blobconnection) | Blobs of the tree. |
+| `lastCommit` | [`Commit`](#commit) | Last commit for the tree. |
+| `submodules` | [`SubmoduleConnection!`](#submoduleconnection) | Sub-modules of the tree. |
+| `trees` | [`TreeEntryConnection!`](#treeentryconnection) | Trees of the tree. |
-### TreeEntry
+### `TreeEntry`
Represents a directory.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `flatPath` | String! | Flat path of the entry. |
-| `id` | ID! | ID of the entry. |
-| `name` | String! | Name of the entry. |
-| `path` | String! | Path of the entry. |
-| `sha` | String! | Last commit SHA for the entry. |
-| `type` | EntryType! | Type of tree entry. |
-| `webPath` | String | Web path for the tree entry (directory). |
-| `webUrl` | String | Web URL for the tree entry (directory). |
+| `flatPath` | [`String!`](#string) | Flat path of the entry. |
+| `id` | [`ID!`](#id) | ID of the entry. |
+| `name` | [`String!`](#string) | Name of the entry. |
+| `path` | [`String!`](#string) | Path of the entry. |
+| `sha` | [`String!`](#string) | Last commit SHA for the entry. |
+| `type` | [`EntryType!`](#entrytype) | Type of tree entry. |
+| `webPath` | [`String`](#string) | Web path for the tree entry (directory). |
+| `webUrl` | [`String`](#string) | Web URL for the tree entry (directory). |
+
+### `TreeEntryConnection`
+
+The connection type for TreeEntry.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[TreeEntryEdge]`](#treeentryedge) | A list of edges. |
+| `nodes` | [`[TreeEntry]`](#treeentry) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `TreeEntryEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`TreeEntry`](#treeentry) | The item at the end of the edge. |
-### UpdateAlertStatusPayload
+### `UpdateAlertStatusPayload`
Autogenerated return type of UpdateAlertStatus.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `alert` | AlertManagementAlert | The alert after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue created after mutation. |
-| `todo` | Todo | The to-do item after mutation. |
+| `alert` | [`AlertManagementAlert`](#alertmanagementalert) | The alert after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue created after mutation. |
+| `todo` | [`Todo`](#todo) | The to-do item after mutation. |
-### UpdateBoardEpicUserPreferencesPayload
+### `UpdateBoardEpicUserPreferencesPayload`
Autogenerated return type of UpdateBoardEpicUserPreferences.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epicUserPreferences` | BoardEpicUserPreferences | User preferences for the epic in the board after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epicUserPreferences` | [`BoardEpicUserPreferences`](#boardepicuserpreferences) | User preferences for the epic in the board after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### UpdateBoardListPayload
+### `UpdateBoardListPayload`
Autogenerated return type of UpdateBoardList.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `list` | BoardList | Mutated list. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `list` | [`BoardList`](#boardlist) | Mutated list. |
-### UpdateBoardPayload
+### `UpdateBoardPayload`
Autogenerated return type of UpdateBoard.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `board` | Board | The board after mutation. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `board` | [`Board`](#board) | The board after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### UpdateComplianceFrameworkPayload
+### `UpdateComplianceFrameworkPayload`
Autogenerated return type of UpdateComplianceFramework.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `complianceFramework` | ComplianceFramework | The compliance framework after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `complianceFramework` | [`ComplianceFramework`](#complianceframework) | The compliance framework after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### UpdateContainerExpirationPolicyPayload
+### `UpdateContainerExpirationPolicyPayload`
Autogenerated return type of UpdateContainerExpirationPolicy.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `containerExpirationPolicy` | ContainerExpirationPolicy | The container expiration policy after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `containerExpirationPolicy` | [`ContainerExpirationPolicy`](#containerexpirationpolicy) | The container expiration policy after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### UpdateEpicPayload
+### `UpdateEpicPayload`
Autogenerated return type of UpdateEpic.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `epic` | [`Epic`](#epic) | The epic after mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### UpdateImageDiffNotePayload
+### `UpdateImageDiffNotePayload`
Autogenerated return type of UpdateImageDiffNote.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `note` | Note | The note after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `note` | [`Note`](#note) | The note after mutation. |
-### UpdateIssuePayload
+### `UpdateIssuePayload`
Autogenerated return type of UpdateIssue.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `issue` | Issue | The issue after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `issue` | [`Issue`](#issue) | The issue after mutation. |
-### UpdateIterationPayload
+### `UpdateIterationPayload`
Autogenerated return type of UpdateIteration.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `iteration` | Iteration | Updated iteration. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `iteration` | [`Iteration`](#iteration) | Updated iteration. |
-### UpdateNamespacePackageSettingsPayload
+### `UpdateNamespacePackageSettingsPayload`
Autogenerated return type of UpdateNamespacePackageSettings.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `packageSettings` | PackageSettings | The namespace package setting after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `packageSettings` | [`PackageSettings`](#packagesettings) | The namespace package setting after mutation. |
-### UpdateNotePayload
+### `UpdateNotePayload`
Autogenerated return type of UpdateNote.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `note` | Note | The note after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `note` | [`Note`](#note) | The note after mutation. |
-### UpdateRequirementPayload
+### `UpdateRequirementPayload`
Autogenerated return type of UpdateRequirement.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `requirement` | Requirement | Requirement after mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `requirement` | [`Requirement`](#requirement) | Requirement after mutation. |
-### UpdateSnippetPayload
+### `UpdateSnippetPayload`
Autogenerated return type of UpdateSnippet.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `captchaSiteKey` | String | The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `needsCaptchaResponse` | Boolean | Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
-| `snippet` | Snippet | The snippet after mutation. |
-| `spam` | Boolean | Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response. |
-| `spamLogId` | Int | The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+| `captchaSiteKey` | [`String`](#string) | The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `needsCaptchaResponse` | [`Boolean`](#boolean) | Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+| `snippet` | [`Snippet`](#snippet) | The snippet after mutation. |
+| `spam` | [`Boolean`](#boolean) | Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response. |
+| `spamLogId` | [`Int`](#int) | The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+
+### `UsageTrendsMeasurement`
+
+Represents a recorded measurement (object count) for the Admins.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | [`Int!`](#int) | Object count. |
+| `identifier` | [`MeasurementIdentifier!`](#measurementidentifier) | The type of objects being measured. |
+| `recordedAt` | [`Time`](#time) | The time the measurement was recorded. |
+
+### `UsageTrendsMeasurementConnection`
+
+The connection type for UsageTrendsMeasurement.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[UsageTrendsMeasurementEdge]`](#usagetrendsmeasurementedge) | A list of edges. |
+| `nodes` | [`[UsageTrendsMeasurement]`](#usagetrendsmeasurement) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### User
+### `UsageTrendsMeasurementEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`UsageTrendsMeasurement`](#usagetrendsmeasurement) | The item at the end of the edge. |
+
+### `User`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `assignedMergeRequests` | [`MergeRequestConnection`](#mergerequestconnection) | Merge Requests assigned to the user. |
+| `authoredMergeRequests` | [`MergeRequestConnection`](#mergerequestconnection) | Merge Requests authored by the user. |
+| `avatarUrl` | [`String`](#string) | URL of the user's avatar. |
+| `bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. |
+| `callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. |
+| `email` **{warning-solid}** | [`String`](#string) | **Deprecated:** Use public_email. Deprecated in 13.7. |
+| `groupCount` | [`Int`](#int) | Group count for the user. Available only when feature flag `user_group_counts` is enabled. |
+| `groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. |
+| `id` | [`ID!`](#id) | ID of the user. |
+| `location` | [`String`](#string) | The location of the user. |
+| `name` | [`String!`](#string) | Human-readable name of the user. |
+| `projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. |
+| `publicEmail` | [`String`](#string) | User's public email. |
+| `reviewRequestedMergeRequests` | [`MergeRequestConnection`](#mergerequestconnection) | Merge Requests assigned to the user for review. |
+| `snippets` | [`SnippetConnection`](#snippetconnection) | Snippets authored by the user. |
+| `starredProjects` | [`ProjectConnection`](#projectconnection) | Projects starred by the user. |
+| `state` | [`UserState!`](#userstate) | State of the user. |
+| `status` | [`UserStatus`](#userstatus) | User status. |
+| `todos` | [`TodoConnection!`](#todoconnection) | To-do items of the user. |
+| `userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource |
+| `username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
+| `webPath` | [`String!`](#string) | Web path of the user. |
+| `webUrl` | [`String!`](#string) | Web URL of the user. |
+
+### `UserCallout`
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `assignedMergeRequests` | MergeRequestConnection | Merge Requests assigned to the user. |
-| `authoredMergeRequests` | MergeRequestConnection | Merge Requests authored by the user. |
-| `avatarUrl` | String | URL of the user's avatar. |
-| `bot` | Boolean! | Indicates if the user is a bot. |
-| `email` **{warning-solid}** | String | **Deprecated:** Use public_email. Deprecated in 13.7. |
-| `groupCount` | Int | Group count for the user. Available only when feature flag `user_group_counts` is enabled. |
-| `groupMemberships` | GroupMemberConnection | Group memberships of the user. |
-| `id` | ID! | ID of the user. |
-| `location` | String | The location of the user. |
-| `name` | String! | Human-readable name of the user. |
-| `projectMemberships` | ProjectMemberConnection | Project memberships of the user. |
-| `publicEmail` | String | User's public email. |
-| `reviewRequestedMergeRequests` | MergeRequestConnection | Merge Requests assigned to the user for review. |
-| `snippets` | SnippetConnection | Snippets authored by the user. |
-| `starredProjects` | ProjectConnection | Projects starred by the user. |
-| `state` | UserState! | State of the user. |
-| `status` | UserStatus | User status. |
-| `todos` | TodoConnection! | To-do items of the user. |
-| `userPermissions` | UserPermissions! | Permissions for the current user on the resource |
-| `username` | String! | Username of the user. Unique within this instance of GitLab. |
-| `webPath` | String! | Web path of the user. |
-| `webUrl` | String! | Web URL of the user. |
+| `dismissedAt` | [`Time`](#time) | Date when the callout was dismissed. |
+| `featureName` | [`UserCalloutFeatureNameEnum!`](#usercalloutfeaturenameenum) | Name of the feature that the callout is for. |
-### UserPermissions
+### `UserCalloutConnection`
+
+The connection type for UserCallout.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `createSnippet` | Boolean! | Indicates the user can perform `create_snippet` on this resource |
+| `edges` | [`[UserCalloutEdge]`](#usercalloutedge) | A list of edges. |
+| `nodes` | [`[UserCallout]`](#usercallout) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `UserCalloutCreatePayload`
-### UserStatus
+Autogenerated return type of UserCalloutCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `availability` | AvailabilityEnum! | User availability status. |
-| `emoji` | String | String representation of emoji. |
-| `message` | String | User status message. |
-| `messageHtml` | String | HTML of the user status message |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `userCallout` | [`UserCallout!`](#usercallout) | The user callout dismissed. |
+
+### `UserCalloutEdge`
-### VulnerabilitiesCountByDay
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`UserCallout`](#usercallout) | The item at the end of the edge. |
+
+### `UserConnection`
+
+The connection type for User.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[UserEdge]`](#useredge) | A list of edges. |
+| `nodes` | [`[User]`](#user) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `UserEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`User`](#user) | The item at the end of the edge. |
+
+### `UserPermissions`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `createSnippet` | [`Boolean!`](#boolean) | Indicates the user can perform `create_snippet` on this resource |
+
+### `UserStatus`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `availability` | [`AvailabilityEnum!`](#availabilityenum) | User availability status. |
+| `emoji` | [`String`](#string) | String representation of emoji. |
+| `message` | [`String`](#string) | User status message. |
+| `messageHtml` | [`String`](#string) | HTML of the user status message |
+
+### `VulnerabilitiesCountByDay`
Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `critical` | Int! | Total number of vulnerabilities on a particular day with critical severity |
-| `date` | ISO8601Date! | Date for the count. |
-| `high` | Int! | Total number of vulnerabilities on a particular day with high severity |
-| `info` | Int! | Total number of vulnerabilities on a particular day with info severity |
-| `low` | Int! | Total number of vulnerabilities on a particular day with low severity |
-| `medium` | Int! | Total number of vulnerabilities on a particular day with medium severity |
-| `total` | Int! | Total number of vulnerabilities on a particular day. |
-| `unknown` | Int! | Total number of vulnerabilities on a particular day with unknown severity |
+| `critical` | [`Int!`](#int) | Total number of vulnerabilities on a particular day with critical severity |
+| `date` | [`ISO8601Date!`](#iso8601date) | Date for the count. |
+| `high` | [`Int!`](#int) | Total number of vulnerabilities on a particular day with high severity |
+| `info` | [`Int!`](#int) | Total number of vulnerabilities on a particular day with info severity |
+| `low` | [`Int!`](#int) | Total number of vulnerabilities on a particular day with low severity |
+| `medium` | [`Int!`](#int) | Total number of vulnerabilities on a particular day with medium severity |
+| `total` | [`Int!`](#int) | Total number of vulnerabilities on a particular day. |
+| `unknown` | [`Int!`](#int) | Total number of vulnerabilities on a particular day with unknown severity |
-### VulnerabilitiesCountByDayAndSeverity
+### `VulnerabilitiesCountByDayAndSeverity`
Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int | Number of vulnerabilities. |
-| `day` | ISO8601Date | Date for the count. |
-| `severity` | VulnerabilitySeverity | Severity of the counted vulnerabilities. |
+| `count` | [`Int`](#int) | Number of vulnerabilities. |
+| `day` | [`ISO8601Date`](#iso8601date) | Date for the count. |
+| `severity` | [`VulnerabilitySeverity`](#vulnerabilityseverity) | Severity of the counted vulnerabilities. |
+
+### `VulnerabilitiesCountByDayAndSeverityConnection`
+
+The connection type for VulnerabilitiesCountByDayAndSeverity.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[VulnerabilitiesCountByDayAndSeverityEdge]`](#vulnerabilitiescountbydayandseverityedge) | A list of edges. |
+| `nodes` | [`[VulnerabilitiesCountByDayAndSeverity]`](#vulnerabilitiescountbydayandseverity) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `VulnerabilitiesCountByDayAndSeverityEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`VulnerabilitiesCountByDayAndSeverity`](#vulnerabilitiescountbydayandseverity) | The item at the end of the edge. |
-### Vulnerability
+### `VulnerabilitiesCountByDayConnection`
+
+The connection type for VulnerabilitiesCountByDay.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[VulnerabilitiesCountByDayEdge]`](#vulnerabilitiescountbydayedge) | A list of edges. |
+| `nodes` | [`[VulnerabilitiesCountByDay]`](#vulnerabilitiescountbyday) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `VulnerabilitiesCountByDayEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`VulnerabilitiesCountByDay`](#vulnerabilitiescountbyday) | The item at the end of the edge. |
+
+### `Vulnerability`
Represents a vulnerability.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `confirmedAt` | Time | Timestamp of when the vulnerability state was changed to confirmed. |
-| `confirmedBy` | User | The user that confirmed the vulnerability. |
-| `description` | String | Description of the vulnerability. |
-| `details` | VulnerabilityDetail! => Array | Details of the vulnerability. |
-| `detectedAt` | Time! | Timestamp of when the vulnerability was first detected. |
-| `discussions` | DiscussionConnection! | All discussions on this noteable. |
-| `dismissedAt` | Time | Timestamp of when the vulnerability state was changed to dismissed. |
-| `dismissedBy` | User | The user that dismissed the vulnerability. |
-| `externalIssueLinks` | VulnerabilityExternalIssueLinkConnection! | List of external issue links related to the vulnerability. |
-| `hasSolutions` | Boolean | Indicates whether there is a solution available for this vulnerability. |
-| `id` | ID! | GraphQL ID of the vulnerability. |
-| `identifiers` | VulnerabilityIdentifier! => Array | Identifiers of the vulnerability. |
-| `issueLinks` | VulnerabilityIssueLinkConnection! | List of issue links related to the vulnerability. |
-| `location` | VulnerabilityLocation | Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability. |
-| `mergeRequest` | MergeRequest | Merge request that fixes the vulnerability. |
-| `notes` | NoteConnection! | All notes on this noteable. |
-| `primaryIdentifier` | VulnerabilityIdentifier | Primary identifier of the vulnerability. |
-| `project` | Project | The project on which the vulnerability was found. |
-| `reportType` | VulnerabilityReportType | Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING) |
-| `resolvedAt` | Time | Timestamp of when the vulnerability state was changed to resolved. |
-| `resolvedBy` | User | The user that resolved the vulnerability. |
-| `resolvedOnDefaultBranch` | Boolean! | Indicates whether the vulnerability is fixed on the default branch or not. |
-| `scanner` | VulnerabilityScanner | Scanner metadata for the vulnerability. |
-| `severity` | VulnerabilitySeverity | Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL) |
-| `state` | VulnerabilityState | State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED) |
-| `title` | String | Title of the vulnerability. |
-| `userNotesCount` | Int! | Number of user notes attached to the vulnerability. |
-| `userPermissions` | VulnerabilityPermissions! | Permissions for the current user on the resource |
-| `vulnerabilityPath` | String | URL to the vulnerability's details page. |
-
-### VulnerabilityConfirmPayload
+| `confirmedAt` | [`Time`](#time) | Timestamp of when the vulnerability state was changed to confirmed. |
+| `confirmedBy` | [`User`](#user) | The user that confirmed the vulnerability. |
+| `description` | [`String`](#string) | Description of the vulnerability. |
+| `details` | [`[VulnerabilityDetail!]!`](#vulnerabilitydetail) | Details of the vulnerability. |
+| `detectedAt` | [`Time!`](#time) | Timestamp of when the vulnerability was first detected. |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `dismissedAt` | [`Time`](#time) | Timestamp of when the vulnerability state was changed to dismissed. |
+| `dismissedBy` | [`User`](#user) | The user that dismissed the vulnerability. |
+| `externalIssueLinks` | [`VulnerabilityExternalIssueLinkConnection!`](#vulnerabilityexternalissuelinkconnection) | List of external issue links related to the vulnerability. |
+| `hasSolutions` | [`Boolean`](#boolean) | Indicates whether there is a solution available for this vulnerability. |
+| `id` | [`ID!`](#id) | GraphQL ID of the vulnerability. |
+| `identifiers` | [`[VulnerabilityIdentifier!]!`](#vulnerabilityidentifier) | Identifiers of the vulnerability. |
+| `issueLinks` | [`VulnerabilityIssueLinkConnection!`](#vulnerabilityissuelinkconnection) | List of issue links related to the vulnerability. |
+| `location` | [`VulnerabilityLocation`](#vulnerabilitylocation) | Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability. |
+| `mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request that fixes the vulnerability. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+| `primaryIdentifier` | [`VulnerabilityIdentifier`](#vulnerabilityidentifier) | Primary identifier of the vulnerability. |
+| `project` | [`Project`](#project) | The project on which the vulnerability was found. |
+| `reportType` | [`VulnerabilityReportType`](#vulnerabilityreporttype) | Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING). `Scan Type` in the UI. |
+| `resolvedAt` | [`Time`](#time) | Timestamp of when the vulnerability state was changed to resolved. |
+| `resolvedBy` | [`User`](#user) | The user that resolved the vulnerability. |
+| `resolvedOnDefaultBranch` | [`Boolean!`](#boolean) | Indicates whether the vulnerability is fixed on the default branch or not. |
+| `scanner` | [`VulnerabilityScanner`](#vulnerabilityscanner) | Scanner metadata for the vulnerability. |
+| `severity` | [`VulnerabilitySeverity`](#vulnerabilityseverity) | Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL) |
+| `state` | [`VulnerabilityState`](#vulnerabilitystate) | State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED) |
+| `title` | [`String`](#string) | Title of the vulnerability. |
+| `userNotesCount` | [`Int!`](#int) | Number of user notes attached to the vulnerability. |
+| `userPermissions` | [`VulnerabilityPermissions!`](#vulnerabilitypermissions) | Permissions for the current user on the resource |
+| `vulnerabilityPath` | [`String`](#string) | URL to the vulnerability's details page. |
+
+### `VulnerabilityConfirmPayload`
Autogenerated return type of VulnerabilityConfirm.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after state change. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `vulnerability` | [`Vulnerability`](#vulnerability) | The vulnerability after state change. |
+
+### `VulnerabilityConnection`
+
+The connection type for Vulnerability.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[VulnerabilityEdge]`](#vulnerabilityedge) | A list of edges. |
+| `nodes` | [`[Vulnerability]`](#vulnerability) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-### VulnerabilityDetailBase
+### `VulnerabilityDetailBase`
Represents the vulnerability details base.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `name` | [`String`](#string) | Name of the field. |
-### VulnerabilityDetailBoolean
+### `VulnerabilityDetailBoolean`
Represents the vulnerability details boolean value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
-| `value` | Boolean! | Value of the field. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `name` | [`String`](#string) | Name of the field. |
+| `value` | [`Boolean!`](#boolean) | Value of the field. |
-### VulnerabilityDetailCode
+### `VulnerabilityDetailCode`
Represents the vulnerability details code field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `lang` | String | Language of the code. |
-| `name` | String! | Name of the field. |
-| `value` | String! | Source code. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `lang` | [`String`](#string) | Language of the code. |
+| `name` | [`String`](#string) | Name of the field. |
+| `value` | [`String!`](#string) | Source code. |
-### VulnerabilityDetailCommit
+### `VulnerabilityDetailCommit`
Represents the vulnerability details commit field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
-| `value` | String! | The commit SHA value. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `name` | [`String`](#string) | Name of the field. |
+| `value` | [`String!`](#string) | The commit SHA value. |
-### VulnerabilityDetailDiff
+### `VulnerabilityDetailDiff`
Represents the vulnerability details diff field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `after` | String! | Value of the field after the change. |
-| `before` | String! | Value of the field before the change. |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `after` | [`String!`](#string) | Value of the field after the change. |
+| `before` | [`String!`](#string) | Value of the field before the change. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `name` | [`String`](#string) | Name of the field. |
-### VulnerabilityDetailFileLocation
+### `VulnerabilityDetailFileLocation`
Represents the vulnerability details location within a file in the project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `fileName` | String! | File name. |
-| `lineEnd` | Int! | End line number of the file location. |
-| `lineStart` | Int! | Start line number of the file location. |
-| `name` | String! | Name of the field. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `fileName` | [`String!`](#string) | File name. |
+| `lineEnd` | [`Int!`](#int) | End line number of the file location. |
+| `lineStart` | [`Int!`](#int) | Start line number of the file location. |
+| `name` | [`String`](#string) | Name of the field. |
-### VulnerabilityDetailInt
+### `VulnerabilityDetailInt`
Represents the vulnerability details integer value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
-| `value` | Int! | Value of the field. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `name` | [`String`](#string) | Name of the field. |
+| `value` | [`Int!`](#int) | Value of the field. |
-### VulnerabilityDetailList
+### `VulnerabilityDetailList`
Represents the vulnerability details list value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `items` | VulnerabilityDetail! => Array | List of details. |
-| `name` | String! | Name of the field. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `items` | [`[VulnerabilityDetail!]!`](#vulnerabilitydetail) | List of details. |
+| `name` | [`String`](#string) | Name of the field. |
-### VulnerabilityDetailMarkdown
+### `VulnerabilityDetailMarkdown`
Represents the vulnerability details Markdown field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
-| `value` | String! | Value of the Markdown field. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `name` | [`String`](#string) | Name of the field. |
+| `value` | [`String!`](#string) | Value of the Markdown field. |
-### VulnerabilityDetailModuleLocation
+### `VulnerabilityDetailModuleLocation`
Represents the vulnerability details location within a file in the project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `moduleName` | String! | Module name. |
-| `name` | String! | Name of the field. |
-| `offset` | Int! | Offset of the module location. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `moduleName` | [`String!`](#string) | Module name. |
+| `name` | [`String`](#string) | Name of the field. |
+| `offset` | [`Int!`](#int) | Offset of the module location. |
-### VulnerabilityDetailTable
+### `VulnerabilityDetailTable`
Represents the vulnerability details table value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `headers` | VulnerabilityDetail! => Array | Table headers. |
-| `name` | String! | Name of the field. |
-| `rows` | VulnerabilityDetail! => Array | Table rows. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `headers` | [`[VulnerabilityDetail!]!`](#vulnerabilitydetail) | Table headers. |
+| `name` | [`String`](#string) | Name of the field. |
+| `rows` | [`[VulnerabilityDetail!]!`](#vulnerabilitydetail) | Table rows. |
-### VulnerabilityDetailText
+### `VulnerabilityDetailText`
Represents the vulnerability details text field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
-| `value` | String! | Value of the text field. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `name` | [`String`](#string) | Name of the field. |
+| `value` | [`String!`](#string) | Value of the text field. |
-### VulnerabilityDetailUrl
+### `VulnerabilityDetailUrl`
Represents the vulnerability details URL field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
-| `fieldName` | String | Name of the field. |
-| `href` | String! | Href of the URL. |
-| `name` | String! | Name of the field. |
-| `text` | String | Text of the URL. |
+| `description` | [`String`](#string) | Description of the field. |
+| `fieldName` | [`String`](#string) | Name of the field. |
+| `href` | [`String!`](#string) | Href of the URL. |
+| `name` | [`String`](#string) | Name of the field. |
+| `text` | [`String`](#string) | Text of the URL. |
-### VulnerabilityDismissPayload
+### `VulnerabilityDismissPayload`
Autogenerated return type of VulnerabilityDismiss.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after dismissal. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `vulnerability` | [`Vulnerability`](#vulnerability) | The vulnerability after dismissal. |
-### VulnerabilityExternalIssueLink
+### `VulnerabilityEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`Vulnerability`](#vulnerability) | The item at the end of the edge. |
+
+### `VulnerabilityExternalIssueLink`
Represents an external issue link of a vulnerability.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `externalIssue` | ExternalIssue | The external issue attached to the issue link. |
-| `id` | VulnerabilitiesExternalIssueLinkID! | GraphQL ID of the external issue link. |
-| `linkType` | VulnerabilityExternalIssueLinkType! | Type of the external issue link. |
+| `externalIssue` | [`ExternalIssue`](#externalissue) | The external issue attached to the issue link. |
+| `id` | [`VulnerabilitiesExternalIssueLinkID!`](#vulnerabilitiesexternalissuelinkid) | GraphQL ID of the external issue link. |
+| `linkType` | [`VulnerabilityExternalIssueLinkType!`](#vulnerabilityexternalissuelinktype) | Type of the external issue link. |
+
+### `VulnerabilityExternalIssueLinkConnection`
-### VulnerabilityExternalIssueLinkCreatePayload
+The connection type for VulnerabilityExternalIssueLink.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[VulnerabilityExternalIssueLinkEdge]`](#vulnerabilityexternalissuelinkedge) | A list of edges. |
+| `nodes` | [`[VulnerabilityExternalIssueLink]`](#vulnerabilityexternalissuelink) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `VulnerabilityExternalIssueLinkCreatePayload`
Autogenerated return type of VulnerabilityExternalIssueLinkCreate.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `externalIssueLink` | VulnerabilityExternalIssueLink | The created external issue link. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `externalIssueLink` | [`VulnerabilityExternalIssueLink`](#vulnerabilityexternalissuelink) | The created external issue link. |
-### VulnerabilityExternalIssueLinkDestroyPayload
+### `VulnerabilityExternalIssueLinkDestroyPayload`
Autogenerated return type of VulnerabilityExternalIssueLinkDestroy.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `VulnerabilityExternalIssueLinkEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`VulnerabilityExternalIssueLink`](#vulnerabilityexternalissuelink) | The item at the end of the edge. |
-### VulnerabilityIdentifier
+### `VulnerabilityIdentifier`
Represents a vulnerability identifier.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `externalId` | String | External ID of the vulnerability identifier. |
-| `externalType` | String | External type of the vulnerability identifier. |
-| `name` | String | Name of the vulnerability identifier. |
-| `url` | String | URL of the vulnerability identifier. |
+| `externalId` | [`String`](#string) | External ID of the vulnerability identifier. |
+| `externalType` | [`String`](#string) | External type of the vulnerability identifier. |
+| `name` | [`String`](#string) | Name of the vulnerability identifier. |
+| `url` | [`String`](#string) | URL of the vulnerability identifier. |
-### VulnerabilityIssueLink
+### `VulnerabilityIssueLink`
Represents an issue link of a vulnerability.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | ID! | GraphQL ID of the vulnerability. |
-| `issue` | Issue! | The issue attached to issue link. |
-| `linkType` | VulnerabilityIssueLinkType! | Type of the issue link. |
+| `id` | [`ID!`](#id) | GraphQL ID of the vulnerability. |
+| `issue` | [`Issue!`](#issue) | The issue attached to issue link. |
+| `linkType` | [`VulnerabilityIssueLinkType!`](#vulnerabilityissuelinktype) | Type of the issue link. |
+
+### `VulnerabilityIssueLinkConnection`
+
+The connection type for VulnerabilityIssueLink.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[VulnerabilityIssueLinkEdge]`](#vulnerabilityissuelinkedge) | A list of edges. |
+| `nodes` | [`[VulnerabilityIssueLink]`](#vulnerabilityissuelink) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `VulnerabilityIssueLinkEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`VulnerabilityIssueLink`](#vulnerabilityissuelink) | The item at the end of the edge. |
-### VulnerabilityLocationContainerScanning
+### `VulnerabilityLocationContainerScanning`
Represents the location of a vulnerability found by a container security scan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `dependency` | VulnerableDependency | Dependency containing the vulnerability. |
-| `image` | String | Name of the vulnerable container image. |
-| `operatingSystem` | String | Operating system that runs on the vulnerable container image. |
+| `dependency` | [`VulnerableDependency`](#vulnerabledependency) | Dependency containing the vulnerability. |
+| `image` | [`String`](#string) | Name of the vulnerable container image. |
+| `operatingSystem` | [`String`](#string) | Operating system that runs on the vulnerable container image. |
-### VulnerabilityLocationCoverageFuzzing
+### `VulnerabilityLocationCoverageFuzzing`
Represents the location of a vulnerability found by a Coverage Fuzzing scan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `blobPath` | String | Blob path to the vulnerable file. |
-| `endLine` | String | Number of the last relevant line in the vulnerable file. |
-| `file` | String | Path to the vulnerable file. |
-| `startLine` | String | Number of the first relevant line in the vulnerable file. |
-| `vulnerableClass` | String | Class containing the vulnerability. |
-| `vulnerableMethod` | String | Method containing the vulnerability. |
+| `blobPath` | [`String`](#string) | Blob path to the vulnerable file. |
+| `endLine` | [`String`](#string) | Number of the last relevant line in the vulnerable file. |
+| `file` | [`String`](#string) | Path to the vulnerable file. |
+| `startLine` | [`String`](#string) | Number of the first relevant line in the vulnerable file. |
+| `vulnerableClass` | [`String`](#string) | Class containing the vulnerability. |
+| `vulnerableMethod` | [`String`](#string) | Method containing the vulnerability. |
-### VulnerabilityLocationDast
+### `VulnerabilityLocationDast`
Represents the location of a vulnerability found by a DAST scan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `hostname` | String | Domain name of the vulnerable request. |
-| `param` | String | Query parameter for the URL on which the vulnerability occurred. |
-| `path` | String | URL path and query string of the vulnerable request. |
-| `requestMethod` | String | HTTP method of the vulnerable request. |
+| `hostname` | [`String`](#string) | Domain name of the vulnerable request. |
+| `param` | [`String`](#string) | Query parameter for the URL on which the vulnerability occurred. |
+| `path` | [`String`](#string) | URL path and query string of the vulnerable request. |
+| `requestMethod` | [`String`](#string) | HTTP method of the vulnerable request. |
-### VulnerabilityLocationDependencyScanning
+### `VulnerabilityLocationDependencyScanning`
Represents the location of a vulnerability found by a dependency security scan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `blobPath` | String | Blob path to the vulnerable file. |
-| `dependency` | VulnerableDependency | Dependency containing the vulnerability. |
-| `file` | String | Path to the vulnerable file. |
+| `blobPath` | [`String`](#string) | Blob path to the vulnerable file. |
+| `dependency` | [`VulnerableDependency`](#vulnerabledependency) | Dependency containing the vulnerability. |
+| `file` | [`String`](#string) | Path to the vulnerable file. |
-### VulnerabilityLocationSast
+### `VulnerabilityLocationSast`
Represents the location of a vulnerability found by a SAST scan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `blobPath` | String | Blob path to the vulnerable file. |
-| `endLine` | String | Number of the last relevant line in the vulnerable file. |
-| `file` | String | Path to the vulnerable file. |
-| `startLine` | String | Number of the first relevant line in the vulnerable file. |
-| `vulnerableClass` | String | Class containing the vulnerability. |
-| `vulnerableMethod` | String | Method containing the vulnerability. |
+| `blobPath` | [`String`](#string) | Blob path to the vulnerable file. |
+| `endLine` | [`String`](#string) | Number of the last relevant line in the vulnerable file. |
+| `file` | [`String`](#string) | Path to the vulnerable file. |
+| `startLine` | [`String`](#string) | Number of the first relevant line in the vulnerable file. |
+| `vulnerableClass` | [`String`](#string) | Class containing the vulnerability. |
+| `vulnerableMethod` | [`String`](#string) | Method containing the vulnerability. |
-### VulnerabilityLocationSecretDetection
+### `VulnerabilityLocationSecretDetection`
Represents the location of a vulnerability found by a secret detection scan.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `blobPath` | String | Blob path to the vulnerable file. |
-| `endLine` | String | Number of the last relevant line in the vulnerable file. |
-| `file` | String | Path to the vulnerable file. |
-| `startLine` | String | Number of the first relevant line in the vulnerable file. |
-| `vulnerableClass` | String | Class containing the vulnerability. |
-| `vulnerableMethod` | String | Method containing the vulnerability. |
+| `blobPath` | [`String`](#string) | Blob path to the vulnerable file. |
+| `endLine` | [`String`](#string) | Number of the last relevant line in the vulnerable file. |
+| `file` | [`String`](#string) | Path to the vulnerable file. |
+| `startLine` | [`String`](#string) | Number of the first relevant line in the vulnerable file. |
+| `vulnerableClass` | [`String`](#string) | Class containing the vulnerability. |
+| `vulnerableMethod` | [`String`](#string) | Method containing the vulnerability. |
-### VulnerabilityPermissions
+### `VulnerabilityPermissions`
Check permissions for the current user on a vulnerability.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `adminVulnerability` | Boolean! | Indicates the user can perform `admin_vulnerability` on this resource |
-| `adminVulnerabilityExternalIssueLink` | Boolean! | Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource |
-| `adminVulnerabilityIssueLink` | Boolean! | Indicates the user can perform `admin_vulnerability_issue_link` on this resource |
-| `createVulnerability` | Boolean! | Indicates the user can perform `create_vulnerability` on this resource |
-| `createVulnerabilityExport` | Boolean! | Indicates the user can perform `create_vulnerability_export` on this resource |
-| `createVulnerabilityFeedback` | Boolean! | Indicates the user can perform `create_vulnerability_feedback` on this resource |
-| `destroyVulnerabilityFeedback` | Boolean! | Indicates the user can perform `destroy_vulnerability_feedback` on this resource |
-| `readVulnerabilityFeedback` | Boolean! | Indicates the user can perform `read_vulnerability_feedback` on this resource |
-| `updateVulnerabilityFeedback` | Boolean! | Indicates the user can perform `update_vulnerability_feedback` on this resource |
+| `adminVulnerability` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_vulnerability` on this resource |
+| `adminVulnerabilityExternalIssueLink` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource |
+| `adminVulnerabilityIssueLink` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_vulnerability_issue_link` on this resource |
+| `createVulnerability` | [`Boolean!`](#boolean) | Indicates the user can perform `create_vulnerability` on this resource |
+| `createVulnerabilityExport` | [`Boolean!`](#boolean) | Indicates the user can perform `create_vulnerability_export` on this resource |
+| `createVulnerabilityFeedback` | [`Boolean!`](#boolean) | Indicates the user can perform `create_vulnerability_feedback` on this resource |
+| `destroyVulnerabilityFeedback` | [`Boolean!`](#boolean) | Indicates the user can perform `destroy_vulnerability_feedback` on this resource |
+| `readVulnerabilityFeedback` | [`Boolean!`](#boolean) | Indicates the user can perform `read_vulnerability_feedback` on this resource |
+| `updateVulnerabilityFeedback` | [`Boolean!`](#boolean) | Indicates the user can perform `update_vulnerability_feedback` on this resource |
-### VulnerabilityResolvePayload
+### `VulnerabilityResolvePayload`
Autogenerated return type of VulnerabilityResolve.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after state change. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `vulnerability` | [`Vulnerability`](#vulnerability) | The vulnerability after state change. |
-### VulnerabilityRevertToDetectedPayload
+### `VulnerabilityRevertToDetectedPayload`
Autogenerated return type of VulnerabilityRevertToDetected.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after revert. |
+| `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| `errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| `vulnerability` | [`Vulnerability`](#vulnerability) | The vulnerability after revert. |
-### VulnerabilityScanner
+### `VulnerabilityScanner`
Represents a vulnerability scanner.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `externalId` | String | External ID of the vulnerability scanner. |
-| `name` | String | Name of the vulnerability scanner. |
-| `reportType` | VulnerabilityReportType | Type of the vulnerability report. |
-| `vendor` | String | Vendor of the vulnerability scanner. |
+| `externalId` | [`String`](#string) | External ID of the vulnerability scanner. |
+| `name` | [`String`](#string) | Name of the vulnerability scanner. |
+| `reportType` | [`VulnerabilityReportType`](#vulnerabilityreporttype) | Type of the vulnerability report. |
+| `vendor` | [`String`](#string) | Vendor of the vulnerability scanner. |
+
+### `VulnerabilityScannerConnection`
+
+The connection type for VulnerabilityScanner.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `edges` | [`[VulnerabilityScannerEdge]`](#vulnerabilityscanneredge) | A list of edges. |
+| `nodes` | [`[VulnerabilityScanner]`](#vulnerabilityscanner) | A list of nodes. |
+| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+### `VulnerabilityScannerEdge`
+
+An edge in a connection.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| `node` | [`VulnerabilityScanner`](#vulnerabilityscanner) | The item at the end of the edge. |
-### VulnerabilitySeveritiesCount
+### `VulnerabilitySeveritiesCount`
Represents vulnerability counts by severity.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `critical` | Int | Number of vulnerabilities of CRITICAL severity of the project |
-| `high` | Int | Number of vulnerabilities of HIGH severity of the project |
-| `info` | Int | Number of vulnerabilities of INFO severity of the project |
-| `low` | Int | Number of vulnerabilities of LOW severity of the project |
-| `medium` | Int | Number of vulnerabilities of MEDIUM severity of the project |
-| `unknown` | Int | Number of vulnerabilities of UNKNOWN severity of the project |
+| `critical` | [`Int`](#int) | Number of vulnerabilities of CRITICAL severity of the project |
+| `high` | [`Int`](#int) | Number of vulnerabilities of HIGH severity of the project |
+| `info` | [`Int`](#int) | Number of vulnerabilities of INFO severity of the project |
+| `low` | [`Int`](#int) | Number of vulnerabilities of LOW severity of the project |
+| `medium` | [`Int`](#int) | Number of vulnerabilities of MEDIUM severity of the project |
+| `unknown` | [`Int`](#int) | Number of vulnerabilities of UNKNOWN severity of the project |
-### VulnerableDependency
+### `VulnerableDependency`
Represents a vulnerable dependency. Used in vulnerability location data.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `package` | VulnerablePackage | The package associated with the vulnerable dependency. |
-| `version` | String | The version of the vulnerable dependency. |
+| `package` | [`VulnerablePackage`](#vulnerablepackage) | The package associated with the vulnerable dependency. |
+| `version` | [`String`](#string) | The version of the vulnerable dependency. |
-### VulnerablePackage
+### `VulnerablePackage`
Represents a vulnerable package. Used in vulnerability dependency data.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `name` | String | The name of the vulnerable package. |
+| `name` | [`String`](#string) | The name of the vulnerable package. |
-### VulnerableProjectsByGrade
+### `VulnerableProjectsByGrade`
Represents vulnerability letter grades with associated projects.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `count` | Int! | Number of projects within this grade. |
-| `grade` | VulnerabilityGrade! | Grade based on the highest severity vulnerability present. |
-| `projects` | ProjectConnection! | Projects within this grade. |
+| `count` | [`Int!`](#int) | Number of projects within this grade. |
+| `grade` | [`VulnerabilityGrade!`](#vulnerabilitygrade) | Grade based on the highest severity vulnerability present. |
+| `projects` | [`ProjectConnection!`](#projectconnection) | Projects within this grade. |
## Enumeration types
@@ -4541,67 +7074,68 @@ For more information, see
[Enumeration Types](https://graphql.org/learn/schema/#enumeration-types)
on `graphql.org`.
-### AccessLevelEnum
+### `AccessLevelEnum`
Access level to a resource.
| Value | Description |
| ----- | ----------- |
-| `DEVELOPER` | |
-| `GUEST` | |
-| `MAINTAINER` | |
-| `NO_ACCESS` | |
-| `OWNER` | |
-| `REPORTER` | |
+| `DEVELOPER` | Developer access |
+| `GUEST` | Guest access |
+| `MAINTAINER` | Maintainer access |
+| `MINIMAL_ACCESS` | Minimal access |
+| `NO_ACCESS` | No access |
+| `OWNER` | Owner access |
+| `REPORTER` | Reporter access |
-### AlertManagementAlertSort
+### `AlertManagementAlertSort`
Values for sorting alerts.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `CREATED_TIME_ASC` | Created time by ascending order |
-| `CREATED_TIME_DESC` | Created time by descending order |
-| `ENDED_AT_ASC` | End time by ascending order |
-| `ENDED_AT_DESC` | End time by descending order |
-| `EVENT_COUNT_ASC` | Events count by ascending order |
-| `EVENT_COUNT_DESC` | Events count by descending order |
-| `SEVERITY_ASC` | Severity from less critical to more critical |
-| `SEVERITY_DESC` | Severity from more critical to less critical |
-| `STARTED_AT_ASC` | Start time by ascending order |
-| `STARTED_AT_DESC` | Start time by descending order |
-| `STATUS_ASC` | Status by order: Ignored > Resolved > Acknowledged > Triggered |
-| `STATUS_DESC` | Status by order: Triggered > Acknowledged > Resolved > Ignored |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
-| `UPDATED_TIME_ASC` | Created time by ascending order |
-| `UPDATED_TIME_DESC` | Created time by descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `CREATED_TIME_ASC` | Created time by ascending order. |
+| `CREATED_TIME_DESC` | Created time by descending order. |
+| `ENDED_AT_ASC` | End time by ascending order. |
+| `ENDED_AT_DESC` | End time by descending order. |
+| `EVENT_COUNT_ASC` | Events count by ascending order. |
+| `EVENT_COUNT_DESC` | Events count by descending order. |
+| `SEVERITY_ASC` | Severity from less critical to more critical. |
+| `SEVERITY_DESC` | Severity from more critical to less critical. |
+| `STARTED_AT_ASC` | Start time by ascending order. |
+| `STARTED_AT_DESC` | Start time by descending order. |
+| `STATUS_ASC` | Status by order: Ignored > Resolved > Acknowledged > Triggered. |
+| `STATUS_DESC` | Status by order: Triggered > Acknowledged > Resolved > Ignored. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
+| `UPDATED_TIME_ASC` | Created time by ascending order. |
+| `UPDATED_TIME_DESC` | Created time by descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### AlertManagementDomainFilter
+### `AlertManagementDomainFilter`
Filters the alerts based on given domain.
| Value | Description |
| ----- | ----------- |
-| `operations` | Alerts for operations domain |
-| `threat_monitoring` | Alerts for threat monitoring domain |
+| `operations` | Alerts for operations domain. |
+| `threat_monitoring` | Alerts for threat monitoring domain. |
-### AlertManagementIntegrationType
+### `AlertManagementIntegrationType`
Values of types of integrations.
| Value | Description |
| ----- | ----------- |
-| `HTTP` | Integration with any monitoring tool |
-| `PROMETHEUS` | Prometheus integration |
+| `HTTP` | Integration with any monitoring tool. |
+| `PROMETHEUS` | Prometheus integration. |
-### AlertManagementPayloadAlertFieldName
+### `AlertManagementPayloadAlertFieldName`
Values for alert field names used in the custom mapping.
@@ -4618,17 +7152,17 @@ Values for alert field names used in the custom mapping.
| `START_TIME` | The time of the incident. |
| `TITLE` | The title of the incident. |
-### AlertManagementPayloadAlertFieldType
+### `AlertManagementPayloadAlertFieldType`
Values for alert field types used in the custom mapping.
| Value | Description |
| ----- | ----------- |
-| `ARRAY` | Array field type |
-| `DATETIME` | DateTime field type |
-| `STRING` | String field type |
+| `ARRAY` | Array field type. |
+| `DATETIME` | DateTime field type. |
+| `STRING` | String field type. |
-### AlertManagementSeverity
+### `AlertManagementSeverity`
Alert severity values.
@@ -4641,7 +7175,7 @@ Alert severity values.
| `MEDIUM` | Medium severity |
| `UNKNOWN` | Unknown severity |
-### AlertManagementStatus
+### `AlertManagementStatus`
Alert status values.
@@ -4652,7 +7186,7 @@ Alert status values.
| `RESOLVED` | Resolved status |
| `TRIGGERED` | Triggered status |
-### ApiFuzzingScanMode
+### `ApiFuzzingScanMode`
All possible ways to specify the API surface for an API fuzzing scan.
@@ -4660,8 +7194,9 @@ All possible ways to specify the API surface for an API fuzzing scan.
| ----- | ----------- |
| `HAR` | The API surface is specified by a HAR file. |
| `OPENAPI` | The API surface is specified by a OPENAPI file. |
+| `POSTMAN` | The API surface is specified by a POSTMAN file. |
-### AvailabilityEnum
+### `AvailabilityEnum`
User availability status.
@@ -4670,45 +7205,45 @@ User availability status.
| `BUSY` | Busy |
| `NOT_SET` | Not Set |
-### BlobViewersType
+### `BlobViewersType`
Types of blob viewers.
| Value | Description |
| ----- | ----------- |
-| `auxiliary` | |
-| `rich` | |
-| `simple` | |
+| `auxiliary` | Auxiliary blob viewers type. |
+| `rich` | Rich blob viewers type. |
+| `simple` | Simple blob viewers type. |
-### CiConfigStatus
+### `CiConfigStatus`
Values for YAML processor result.
| Value | Description |
| ----- | ----------- |
-| `INVALID` | The configuration file is not valid |
-| `VALID` | The configuration file is valid |
+| `INVALID` | The configuration file is not valid. |
+| `VALID` | The configuration file is valid. |
-### CommitActionMode
+### `CommitActionMode`
Mode of a commit action.
| Value | Description |
| ----- | ----------- |
-| `CHMOD` | Chmod command |
-| `CREATE` | Create command |
-| `DELETE` | Delete command |
-| `MOVE` | Move command |
-| `UPDATE` | Update command |
+| `CHMOD` | Chmod command. |
+| `CREATE` | Create command. |
+| `DELETE` | Delete command. |
+| `MOVE` | Move command. |
+| `UPDATE` | Update command. |
-### CommitEncoding
+### `CommitEncoding`
| Value | Description |
| ----- | ----------- |
-| `BASE64` | Base64 encoding |
-| `TEXT` | Text encoding |
+| `BASE64` | Base64 encoding. |
+| `TEXT` | Text encoding. |
-### ContainerExpirationPolicyCadenceEnum
+### `ContainerExpirationPolicyCadenceEnum`
| Value | Description |
| ----- | ----------- |
@@ -4718,7 +7253,7 @@ Mode of a commit action.
| `EVERY_TWO_WEEKS` | Every two weeks |
| `EVERY_WEEK` | Every week |
-### ContainerExpirationPolicyKeepEnum
+### `ContainerExpirationPolicyKeepEnum`
| Value | Description |
| ----- | ----------- |
@@ -4729,7 +7264,7 @@ Mode of a commit action.
| `TEN_TAGS` | 10 tags per image name |
| `TWENTY_FIVE_TAGS` | 25 tags per image name |
-### ContainerExpirationPolicyOlderThanEnum
+### `ContainerExpirationPolicyOlderThanEnum`
| Value | Description |
| ----- | ----------- |
@@ -4738,7 +7273,7 @@ Mode of a commit action.
| `SEVEN_DAYS` | 7 days until tags are automatically removed |
| `THIRTY_DAYS` | 30 days until tags are automatically removed |
-### ContainerRepositoryCleanupStatus
+### `ContainerRepositoryCleanupStatus`
Status of the tags cleanup of a container repository.
@@ -4749,24 +7284,24 @@ Status of the tags cleanup of a container repository.
| `UNFINISHED` | The tags cleanup has been partially executed. There are still remaining tags to delete. |
| `UNSCHEDULED` | The tags cleanup is not scheduled. This is the default state. |
-### ContainerRepositorySort
+### `ContainerRepositorySort`
Values for sorting container repositories.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `NAME_ASC` | Name by ascending order |
-| `NAME_DESC` | Name by descending order |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `NAME_ASC` | Name by ascending order. |
+| `NAME_DESC` | Name by descending order. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### ContainerRepositoryStatus
+### `ContainerRepositoryStatus`
Status of a container repository.
@@ -4775,31 +7310,31 @@ Status of a container repository.
| `DELETE_FAILED` | Delete Failed status. |
| `DELETE_SCHEDULED` | Delete Scheduled status. |
-### DastScanTypeEnum
+### `DastScanTypeEnum`
| Value | Description |
| ----- | ----------- |
| `ACTIVE` | Active DAST scan. This scan will make active attacks against the target site. |
| `PASSIVE` | Passive DAST scan. This scan will not make active attacks against the target site. |
-### DastSiteProfileValidationStatusEnum
+### `DastSiteProfileValidationStatusEnum`
| Value | Description |
| ----- | ----------- |
-| `FAILED_VALIDATION` | Site validation process finished but failed |
-| `INPROGRESS_VALIDATION` | Site validation process is in progress |
-| `NONE` | No site validation exists |
-| `PASSED_VALIDATION` | Site validation process finished successfully |
-| `PENDING_VALIDATION` | Site validation process has not started |
+| `FAILED_VALIDATION` | Site validation process finished but failed. |
+| `INPROGRESS_VALIDATION` | Site validation process is in progress. |
+| `NONE` | No site validation exists. |
+| `PASSED_VALIDATION` | Site validation process finished successfully. |
+| `PENDING_VALIDATION` | Site validation process has not started. |
-### DastSiteValidationStrategyEnum
+### `DastSiteValidationStrategyEnum`
| Value | Description |
| ----- | ----------- |
-| `HEADER` | Header validation |
-| `TEXT_FILE` | Text file validation |
+| `HEADER` | Header validation. |
+| `TEXT_FILE` | Text file validation. |
-### DataVisualizationColorEnum
+### `DataVisualizationColorEnum`
Color of the data visualization palette.
@@ -4811,7 +7346,7 @@ Color of the data visualization palette.
| `MAGENTA` | Magenta color |
| `ORANGE` | Orange color |
-### DataVisualizationWeightEnum
+### `DataVisualizationWeightEnum`
Weight of the data visualization palette.
@@ -4829,7 +7364,7 @@ Weight of the data visualization palette.
| `WEIGHT_900` | 900 weight |
| `WEIGHT_950` | 950 weight |
-### DesignCollectionCopyState
+### `DesignCollectionCopyState`
Copy state of a DesignCollection.
@@ -4839,7 +7374,7 @@ Copy state of a DesignCollection.
| `IN_PROGRESS` | The DesignCollection is being copied |
| `READY` | The DesignCollection has no copy in progress |
-### DesignVersionEvent
+### `DesignVersionEvent`
Mutation event of a design within a version.
@@ -4848,18 +7383,18 @@ Mutation event of a design within a version.
| `CREATION` | A creation event |
| `DELETION` | A deletion event |
| `MODIFICATION` | A modification event |
-| `NONE` | No change |
+| `NONE` | No change. |
-### DiffPositionType
+### `DiffPositionType`
Type of file the position refers to.
| Value | Description |
| ----- | ----------- |
-| `image` | |
-| `text` | |
+| `image` | An image |
+| `text` | A text file |
-### EntryType
+### `EntryType`
Type of a tree entry.
@@ -4869,18 +7404,18 @@ Type of a tree entry.
| `commit` | |
| `tree` | |
-### EpicSort
+### `EpicSort`
Roadmap sort values.
| Value | Description |
| ----- | ----------- |
-| `end_date_asc` | End date at ascending order |
-| `end_date_desc` | End date at descending order |
-| `start_date_asc` | Start date at ascending order |
-| `start_date_desc` | Start date at descending order |
+| `end_date_asc` | End date at ascending order. |
+| `end_date_desc` | End date at descending order. |
+| `start_date_asc` | Start date at ascending order. |
+| `start_date_desc` | Start date at descending order. |
-### EpicState
+### `EpicState`
State of an epic.
@@ -4890,25 +7425,25 @@ State of an epic.
| `closed` | |
| `opened` | |
-### EpicStateEvent
+### `EpicStateEvent`
State event of an epic.
| Value | Description |
| ----- | ----------- |
-| `CLOSE` | Close the epic |
-| `REOPEN` | Reopen the epic |
+| `CLOSE` | Close the epic. |
+| `REOPEN` | Reopen the epic. |
-### EpicWildcardId
+### `EpicWildcardId`
Epic ID wildcard values.
| Value | Description |
| ----- | ----------- |
-| `ANY` | Any epic is assigned |
-| `NONE` | No epic is assigned |
+| `ANY` | Any epic is assigned. |
+| `NONE` | No epic is assigned. |
-### EventAction
+### `EventAction`
Event action.
@@ -4928,7 +7463,7 @@ Event action.
| `REOPENED` | Reopened action |
| `UPDATED` | Updated action |
-### GroupMemberRelation
+### `GroupMemberRelation`
Group member relation.
@@ -4938,7 +7473,7 @@ Group member relation.
| `DIRECT` | Direct members |
| `INHERITED` | Inherited members |
-### HealthStatus
+### `HealthStatus`
Health status of an issue or epic.
@@ -4948,7 +7483,7 @@ Health status of an issue or epic.
| `needsAttention` | |
| `onTrack` | |
-### IssuableSeverity
+### `IssuableSeverity`
Incident severity.
@@ -4960,70 +7495,70 @@ Incident severity.
| `MEDIUM` | Medium severity |
| `UNKNOWN` | Unknown severity |
-### IssuableState
+### `IssuableState`
State of a GitLab issue or merge request.
| Value | Description |
| ----- | ----------- |
-| `all` | |
-| `closed` | |
-| `locked` | |
-| `opened` | |
+| `all` | All available. |
+| `closed` | In closed state. |
+| `locked` | Discussion has been locked. |
+| `opened` | In open state. |
-### IssueSort
+### `IssueSort`
Values for sorting issues.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `DUE_DATE_ASC` | Due date by ascending order |
-| `DUE_DATE_DESC` | Due date by descending order |
-| `LABEL_PRIORITY_ASC` | Label priority by ascending order |
-| `LABEL_PRIORITY_DESC` | Label priority by descending order |
-| `MILESTONE_DUE_ASC` | Milestone due date by ascending order |
-| `MILESTONE_DUE_DESC` | Milestone due date by descending order |
-| `PRIORITY_ASC` | Priority by ascending order |
-| `PRIORITY_DESC` | Priority by descending order |
-| `PUBLISHED_ASC` | Published issues shown last |
-| `PUBLISHED_DESC` | Published issues shown first |
-| `RELATIVE_POSITION_ASC` | Relative position by ascending order |
-| `SEVERITY_ASC` | Severity from less critical to more critical |
-| `SEVERITY_DESC` | Severity from more critical to less critical |
-| `SLA_DUE_AT_ASC` | Issues with earliest SLA due time shown first |
-| `SLA_DUE_AT_DESC` | Issues with latest SLA due time shown first |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
-| `WEIGHT_ASC` | Weight by ascending order |
-| `WEIGHT_DESC` | Weight by descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `DUE_DATE_ASC` | Due date by ascending order. |
+| `DUE_DATE_DESC` | Due date by descending order. |
+| `LABEL_PRIORITY_ASC` | Label priority by ascending order. |
+| `LABEL_PRIORITY_DESC` | Label priority by descending order. |
+| `MILESTONE_DUE_ASC` | Milestone due date by ascending order. |
+| `MILESTONE_DUE_DESC` | Milestone due date by descending order. |
+| `PRIORITY_ASC` | Priority by ascending order. |
+| `PRIORITY_DESC` | Priority by descending order. |
+| `PUBLISHED_ASC` | Published issues shown last. |
+| `PUBLISHED_DESC` | Published issues shown first. |
+| `RELATIVE_POSITION_ASC` | Relative position by ascending order. |
+| `SEVERITY_ASC` | Severity from less critical to more critical. |
+| `SEVERITY_DESC` | Severity from more critical to less critical. |
+| `SLA_DUE_AT_ASC` | Issues with earliest SLA due time shown first. |
+| `SLA_DUE_AT_DESC` | Issues with latest SLA due time shown first. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
+| `WEIGHT_ASC` | Weight by ascending order. |
+| `WEIGHT_DESC` | Weight by descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### IssueState
+### `IssueState`
State of a GitLab issue.
| Value | Description |
| ----- | ----------- |
-| `all` | |
-| `closed` | |
-| `locked` | |
-| `opened` | |
+| `all` | All available. |
+| `closed` | In closed state. |
+| `locked` | Discussion has been locked. |
+| `opened` | In open state. |
-### IssueStateEvent
+### `IssueStateEvent`
Values for issue state events.
| Value | Description |
| ----- | ----------- |
-| `CLOSE` | Closes the issue |
-| `REOPEN` | Reopens the issue |
+| `CLOSE` | Closes the issue. |
+| `REOPEN` | Reopens the issue. |
-### IssueType
+### `IssueType`
Issue type.
@@ -5033,7 +7568,7 @@ Issue type.
| `ISSUE` | Issue issue type |
| `TEST_CASE` | Test Case issue type |
-### IterationState
+### `IterationState`
State of a GitLab iteration.
@@ -5045,49 +7580,49 @@ State of a GitLab iteration.
| `started` | |
| `upcoming` | |
-### IterationWildcardId
+### `IterationWildcardId`
Iteration ID wildcard values.
| Value | Description |
| ----- | ----------- |
-| `ANY` | An iteration is assigned |
-| `CURRENT` | Current iteration |
-| `NONE` | No iteration is assigned |
+| `ANY` | An iteration is assigned. |
+| `CURRENT` | Current iteration. |
+| `NONE` | No iteration is assigned. |
-### JobArtifactFileType
+### `JobArtifactFileType`
| Value | Description |
| ----- | ----------- |
-| `ACCESSIBILITY` | |
-| `API_FUZZING` | |
-| `ARCHIVE` | |
-| `BROWSER_PERFORMANCE` | |
-| `CLUSTER_APPLICATIONS` | |
-| `COBERTURA` | |
-| `CODEQUALITY` | |
-| `CONTAINER_SCANNING` | |
-| `COVERAGE_FUZZING` | |
-| `DAST` | |
-| `DEPENDENCY_SCANNING` | |
-| `DOTENV` | |
-| `JUNIT` | |
-| `LICENSE_MANAGEMENT` | |
-| `LICENSE_SCANNING` | |
-| `LOAD_PERFORMANCE` | |
-| `LSIF` | |
-| `METADATA` | |
-| `METRICS` | |
-| `METRICS_REFEREE` | |
-| `NETWORK_REFEREE` | |
-| `PERFORMANCE` | |
-| `REQUIREMENTS` | |
-| `SAST` | |
-| `SECRET_DETECTION` | |
-| `TERRAFORM` | |
-| `TRACE` | |
-
-### ListLimitMetric
+| `ACCESSIBILITY` | ACCESSIBILITY job artifact file type. |
+| `API_FUZZING` | API FUZZING job artifact file type. |
+| `ARCHIVE` | ARCHIVE job artifact file type. |
+| `BROWSER_PERFORMANCE` | BROWSER PERFORMANCE job artifact file type. |
+| `CLUSTER_APPLICATIONS` | CLUSTER APPLICATIONS job artifact file type. |
+| `COBERTURA` | COBERTURA job artifact file type. |
+| `CODEQUALITY` | CODE QUALITY job artifact file type. |
+| `CONTAINER_SCANNING` | CONTAINER SCANNING job artifact file type. |
+| `COVERAGE_FUZZING` | COVERAGE FUZZING job artifact file type. |
+| `DAST` | DAST job artifact file type. |
+| `DEPENDENCY_SCANNING` | DEPENDENCY SCANNING job artifact file type. |
+| `DOTENV` | DOTENV job artifact file type. |
+| `JUNIT` | JUNIT job artifact file type. |
+| `LICENSE_MANAGEMENT` | LICENSE MANAGEMENT job artifact file type. |
+| `LICENSE_SCANNING` | LICENSE SCANNING job artifact file type. |
+| `LOAD_PERFORMANCE` | LOAD PERFORMANCE job artifact file type. |
+| `LSIF` | LSIF job artifact file type. |
+| `METADATA` | METADATA job artifact file type. |
+| `METRICS` | METRICS job artifact file type. |
+| `METRICS_REFEREE` | METRICS REFEREE job artifact file type. |
+| `NETWORK_REFEREE` | NETWORK REFEREE job artifact file type. |
+| `PERFORMANCE` | PERFORMANCE job artifact file type. |
+| `REQUIREMENTS` | REQUIREMENTS job artifact file type. |
+| `SAST` | SAST job artifact file type. |
+| `SECRET_DETECTION` | SECRET DETECTION job artifact file type. |
+| `TERRAFORM` | TERRAFORM job artifact file type. |
+| `TRACE` | TRACE job artifact file type. |
+
+### `ListLimitMetric`
List limit metric setting.
@@ -5097,105 +7632,113 @@ List limit metric setting.
| `issue_count` | |
| `issue_weights` | |
-### MeasurementIdentifier
+### `MeasurementIdentifier`
Possible identifier types for a measurement.
| Value | Description |
| ----- | ----------- |
-| `GROUPS` | Group count |
-| `ISSUES` | Issue count |
-| `MERGE_REQUESTS` | Merge request count |
-| `PIPELINES` | Pipeline count |
-| `PIPELINES_CANCELED` | Pipeline count with canceled status |
-| `PIPELINES_FAILED` | Pipeline count with failed status |
-| `PIPELINES_SKIPPED` | Pipeline count with skipped status |
-| `PIPELINES_SUCCEEDED` | Pipeline count with success status |
-| `PROJECTS` | Project count |
-| `USERS` | User count |
+| `GROUPS` | Group count. |
+| `ISSUES` | Issue count. |
+| `MERGE_REQUESTS` | Merge request count. |
+| `PIPELINES` | Pipeline count. |
+| `PIPELINES_CANCELED` | Pipeline count with canceled status. |
+| `PIPELINES_FAILED` | Pipeline count with failed status. |
+| `PIPELINES_SKIPPED` | Pipeline count with skipped status. |
+| `PIPELINES_SUCCEEDED` | Pipeline count with success status. |
+| `PROJECTS` | Project count. |
+| `USERS` | User count. |
-### MergeRequestNewState
+### `MergeRequestNewState`
-New state to apply to a merge request..
+New state to apply to a merge request.
| Value | Description |
| ----- | ----------- |
| `CLOSED` | Close the merge request if it is open. |
| `OPEN` | Open the merge request if it is closed. |
-### MergeRequestSort
+### `MergeRequestSort`
Values for sorting merge requests.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `LABEL_PRIORITY_ASC` | Label priority by ascending order |
-| `LABEL_PRIORITY_DESC` | Label priority by descending order |
-| `MERGED_AT_ASC` | Merge time by ascending order |
-| `MERGED_AT_DESC` | Merge time by descending order |
-| `MILESTONE_DUE_ASC` | Milestone due date by ascending order |
-| `MILESTONE_DUE_DESC` | Milestone due date by descending order |
-| `PRIORITY_ASC` | Priority by ascending order |
-| `PRIORITY_DESC` | Priority by descending order |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `LABEL_PRIORITY_ASC` | Label priority by ascending order. |
+| `LABEL_PRIORITY_DESC` | Label priority by descending order. |
+| `MERGED_AT_ASC` | Merge time by ascending order. |
+| `MERGED_AT_DESC` | Merge time by descending order. |
+| `MILESTONE_DUE_ASC` | Milestone due date by ascending order. |
+| `MILESTONE_DUE_DESC` | Milestone due date by descending order. |
+| `PRIORITY_ASC` | Priority by ascending order. |
+| `PRIORITY_DESC` | Priority by descending order. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### MergeRequestState
+### `MergeRequestState`
State of a GitLab merge request.
| Value | Description |
| ----- | ----------- |
-| `all` | |
-| `closed` | |
-| `locked` | |
-| `merged` | Merge Request has been merged |
-| `opened` | |
+| `all` | All available. |
+| `closed` | In closed state. |
+| `locked` | Discussion has been locked. |
+| `merged` | Merge Request has been merged. |
+| `opened` | In open state. |
-### MilestoneStateEnum
+### `MergeStrategyEnum`
+
+| Value | Description |
+| ----- | ----------- |
+| `ADD_TO_MERGE_TRAIN_WHEN_PIPELINE_SUCCEEDS` | Use the add_to_merge_train_when_pipeline_succeeds merge strategy. |
+| `MERGE_TRAIN` | Use the merge_train merge strategy. |
+| `MERGE_WHEN_PIPELINE_SUCCEEDS` | Use the merge_when_pipeline_succeeds merge strategy. |
+
+### `MilestoneStateEnum`
Current state of milestone.
| Value | Description |
| ----- | ----------- |
-| `active` | Milestone is currently active |
-| `closed` | Milestone is closed |
+| `active` | Milestone is currently active. |
+| `closed` | Milestone is closed. |
-### MoveType
+### `MoveType`
The position to which the adjacent object should be moved.
| Value | Description |
| ----- | ----------- |
-| `after` | The adjacent object will be moved after the object that is being moved |
-| `before` | The adjacent object will be moved before the object that is being moved |
+| `after` | The adjacent object will be moved after the object that is being moved. |
+| `before` | The adjacent object will be moved before the object that is being moved. |
-### MutationOperationMode
+### `MutationOperationMode`
Different toggles for changing mutator behavior.
| Value | Description |
| ----- | ----------- |
-| `APPEND` | Performs an append operation |
-| `REMOVE` | Performs a removal operation |
-| `REPLACE` | Performs a replace operation |
+| `APPEND` | Performs an append operation. |
+| `REMOVE` | Performs a removal operation. |
+| `REPLACE` | Performs a replace operation. |
-### NamespaceProjectSort
+### `NamespaceProjectSort`
Values for sorting projects.
| Value | Description |
| ----- | ----------- |
-| `SIMILARITY` | Most similar to the search query |
-| `STORAGE` | Sort by storage size |
+| `SIMILARITY` | Most similar to the search query. |
+| `STORAGE` | Sort by storage size. |
-### OncallRotationUnitEnum
+### `OncallRotationUnitEnum`
Rotation length unit of an on-call rotation.
@@ -5205,7 +7748,7 @@ Rotation length unit of an on-call rotation.
| `HOURS` | Hours |
| `WEEKS` | Weeks |
-### PackageTypeEnum
+### `PackageTypeEnum`
| Value | Description |
| ----- | ----------- |
@@ -5220,7 +7763,7 @@ Rotation length unit of an on-call rotation.
| `PYPI` | Packages from the PyPI package manager |
| `RUBYGEMS` | Packages from the Rubygems package manager |
-### PipelineConfigSourceEnum
+### `PipelineConfigSourceEnum`
| Value | Description |
| ----- | ----------- |
@@ -5234,7 +7777,7 @@ Rotation length unit of an on-call rotation.
| `UNKNOWN_SOURCE` | |
| `WEBIDE_SOURCE` | |
-### PipelineStatusEnum
+### `PipelineStatusEnum`
| Value | Description |
| ----- | ----------- |
@@ -5250,7 +7793,7 @@ Rotation length unit of an on-call rotation.
| `SUCCESS` | |
| `WAITING_FOR_RESOURCE` | |
-### ProjectMemberRelation
+### `ProjectMemberRelation`
Project member relation.
@@ -5261,18 +7804,18 @@ Project member relation.
| `INHERITED` | Inherited members |
| `INVITED_GROUPS` | Invited Groups members |
-### RegistryState
+### `RegistryState`
State of a Geo registry.
| Value | Description |
| ----- | ----------- |
-| `FAILED` | Registry that failed to sync |
-| `PENDING` | Registry waiting to be synced |
-| `STARTED` | Registry currently syncing |
-| `SYNCED` | Registry that is synced |
+| `FAILED` | Registry that failed to sync. |
+| `PENDING` | Registry waiting to be synced. |
+| `STARTED` | Registry currently syncing. |
+| `SYNCED` | Registry that is synced. |
-### ReleaseAssetLinkType
+### `ReleaseAssetLinkType`
Type of the link: `other`, `runbook`, `image`, `package`.
@@ -5283,18 +7826,18 @@ Type of the link: `other`, `runbook`, `image`, `package`.
| `PACKAGE` | Package link type |
| `RUNBOOK` | Runbook link type |
-### ReleaseSort
+### `ReleaseSort`
Values for sorting releases.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `RELEASED_AT_ASC` | Released at by ascending order |
-| `RELEASED_AT_DESC` | Released at by descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `RELEASED_AT_ASC` | Released at by ascending order. |
+| `RELEASED_AT_DESC` | Released at by descending order. |
-### RequirementState
+### `RequirementState`
State of a requirement.
@@ -5303,17 +7846,27 @@ State of a requirement.
| `ARCHIVED` | |
| `OPENED` | |
-### SastUiComponentSize
+### `RequirementStatusFilter`
+
+Status of a requirement based on last test report.
+
+| Value | Description |
+| ----- | ----------- |
+| `FAILED` | |
+| `MISSING` | Requirements without any test report. |
+| `PASSED` | |
+
+### `SastUiComponentSize`
Size of UI component in SAST configuration page.
| Value | Description |
| ----- | ----------- |
-| `LARGE` | |
-| `MEDIUM` | |
-| `SMALL` | |
+| `LARGE` | The size of UI component in SAST configuration page is large. |
+| `MEDIUM` | The size of UI component in SAST configuration page is medium. |
+| `SMALL` | The size of UI component in SAST configuration page is small. |
-### SecurityReportTypeEnum
+### `SecurityReportTypeEnum`
| Value | Description |
| ----- | ----------- |
@@ -5325,7 +7878,7 @@ Size of UI component in SAST configuration page.
| `SAST` | SAST scan report |
| `SECRET_DETECTION` | SECRET DETECTION scan report |
-### SecurityScannerType
+### `SecurityScannerType`
The type of the security scanner.
@@ -5339,18 +7892,18 @@ The type of the security scanner.
| `SAST` | |
| `SECRET_DETECTION` | |
-### SentryErrorStatus
+### `SentryErrorStatus`
State of a Sentry error.
| Value | Description |
| ----- | ----------- |
-| `IGNORED` | Error has been ignored |
-| `RESOLVED` | Error has been resolved |
-| `RESOLVED_IN_NEXT_RELEASE` | Error has been ignored until next release |
-| `UNRESOLVED` | Error is unresolved |
+| `IGNORED` | Error has been ignored. |
+| `RESOLVED` | Error has been resolved. |
+| `RESOLVED_IN_NEXT_RELEASE` | Error has been ignored until next release. |
+| `UNRESOLVED` | Error is unresolved. |
-### ServiceType
+### `ServiceType`
| Value | Description |
| ----- | ----------- |
@@ -5391,7 +7944,7 @@ State of a Sentry error.
| `WEBEX_TEAMS_SERVICE` | WebexTeamsService type |
| `YOUTRACK_SERVICE` | YoutrackService type |
-### SnippetBlobActionEnum
+### `SnippetBlobActionEnum`
Type of a snippet blob input action.
@@ -5402,22 +7955,22 @@ Type of a snippet blob input action.
| `move` | |
| `update` | |
-### Sort
+### `Sort`
Common sort values.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### TestReportState
+### `TestReportState`
State of a test report.
@@ -5426,62 +7979,97 @@ State of a test report.
| `FAILED` | |
| `PASSED` | |
-### TodoActionEnum
+### `TodoActionEnum`
| Value | Description |
| ----- | ----------- |
-| `approval_required` | |
-| `assigned` | |
-| `build_failed` | |
-| `directly_addressed` | |
-| `marked` | |
-| `mentioned` | |
-| `unmergeable` | |
-
-### TodoStateEnum
+| `approval_required` | User was set as an approver. |
+| `assigned` | User was assigned. |
+| `build_failed` | Build triggered by the user failed. |
+| `directly_addressed` | User was directly addressed. |
+| `marked` | User added a TODO. |
+| `mentioned` | User was mentioned. |
+| `merge_train_removed` | Merge request authored by the user was removed from the merge train. |
+| `review_requested` | Review was requested from the user. |
+| `unmergeable` | Merge request authored by the user could not be merged. |
+
+### `TodoStateEnum`
| Value | Description |
| ----- | ----------- |
-| `done` | |
-| `pending` | |
+| `done` | The state of the todo is done. |
+| `pending` | The state of the todo is pending. |
-### TodoTargetEnum
+### `TodoTargetEnum`
| Value | Description |
| ----- | ----------- |
-| `ALERT` | An Alert |
-| `COMMIT` | A Commit |
-| `DESIGN` | A Design |
-| `EPIC` | An Epic |
-| `ISSUE` | An Issue |
-| `MERGEREQUEST` | A MergeRequest |
+| `ALERT` | An Alert. |
+| `COMMIT` | A Commit. |
+| `DESIGN` | A Design. |
+| `EPIC` | An Epic. |
+| `ISSUE` | An Issue. |
+| `MERGEREQUEST` | A MergeRequest. |
-### TypeEnum
+### `TypeEnum`
| Value | Description |
| ----- | ----------- |
| `personal` | |
| `project` | |
-### UserState
+### `UserCalloutFeatureNameEnum`
+
+Name of the feature that the callout is for.
+
+| Value | Description |
+| ----- | ----------- |
+| `ACCOUNT_RECOVERY_REGULAR_CHECK` | Callout feature name for account_recovery_regular_check. |
+| `ACTIVE_USER_COUNT_THRESHOLD` | Callout feature name for active_user_count_threshold. |
+| `ADMIN_INTEGRATIONS_MOVED` | Callout feature name for admin_integrations_moved. |
+| `BUY_PIPELINE_MINUTES_NOTIFICATION_DOT` | Callout feature name for buy_pipeline_minutes_notification_dot. |
+| `CANARY_DEPLOYMENT` | Callout feature name for canary_deployment. |
+| `CLUSTER_SECURITY_WARNING` | Callout feature name for cluster_security_warning. |
+| `CUSTOMIZE_HOMEPAGE` | Callout feature name for customize_homepage. |
+| `EOA_BRONZE_PLAN_BANNER` | Callout feature name for eoa_bronze_plan_banner. |
+| `FEATURE_FLAGS_NEW_VERSION` | Callout feature name for feature_flags_new_version. |
+| `GCP_SIGNUP_OFFER` | Callout feature name for gcp_signup_offer. |
+| `GEO_ENABLE_HASHED_STORAGE` | Callout feature name for geo_enable_hashed_storage. |
+| `GEO_MIGRATE_HASHED_STORAGE` | Callout feature name for geo_migrate_hashed_storage. |
+| `GKE_CLUSTER_INTEGRATION` | Callout feature name for gke_cluster_integration. |
+| `GOLD_TRIAL_BILLINGS` | Callout feature name for gold_trial_billings. |
+| `NEW_USER_SIGNUPS_CAP_REACHED` | Callout feature name for new_user_signups_cap_reached. |
+| `PERSONAL_ACCESS_TOKEN_EXPIRY` | Callout feature name for personal_access_token_expiry. |
+| `REGISTRATION_ENABLED_CALLOUT` | Callout feature name for registration_enabled_callout. |
+| `SERVICE_TEMPLATES_DEPRECATED` | Callout feature name for service_templates_deprecated. |
+| `SUGGEST_PIPELINE` | Callout feature name for suggest_pipeline. |
+| `SUGGEST_POPOVER_DISMISSED` | Callout feature name for suggest_popover_dismissed. |
+| `TABS_POSITION_HIGHLIGHT` | Callout feature name for tabs_position_highlight. |
+| `THREAT_MONITORING_INFO` | Callout feature name for threat_monitoring_info. |
+| `ULTIMATE_TRIAL` | Callout feature name for ultimate_trial. |
+| `UNFINISHED_TAG_CLEANUP_CALLOUT` | Callout feature name for unfinished_tag_cleanup_callout. |
+| `WEBHOOKS_MOVED` | Callout feature name for webhooks_moved. |
+| `WEB_IDE_ALERT_DISMISSED` | Callout feature name for web_ide_alert_dismissed. |
+
+### `UserState`
Possible states of a user.
| Value | Description |
| ----- | ----------- |
-| `active` | The user is active and is able to use the system |
-| `blocked` | The user has been blocked and is prevented from using the system |
-| `deactivated` | The user is no longer active and is unable to use the system |
+| `active` | The user is active and is able to use the system. |
+| `blocked` | The user has been blocked and is prevented from using the system. |
+| `deactivated` | The user is no longer active and is unable to use the system. |
-### VisibilityLevelsEnum
+### `VisibilityLevelsEnum`
| Value | Description |
| ----- | ----------- |
-| `internal` | |
-| `private` | |
-| `public` | |
+| `internal` | Internal visibility level. |
+| `private` | Private visibility level. |
+| `public` | Public visibility level. |
-### VisibilityScopesEnum
+### `VisibilityScopesEnum`
| Value | Description |
| ----- | ----------- |
@@ -5489,7 +8077,7 @@ Possible states of a user.
| `private` | |
| `public` | |
-### VulnerabilityDismissalReason
+### `VulnerabilityDismissalReason`
The dismissal reason of the Vulnerability.
@@ -5501,7 +8089,7 @@ The dismissal reason of the Vulnerability.
| `NOT_APPLICABLE` | Other reasons for dismissal |
| `USED_IN_TESTS` | The Vulnerability is used in tests and does not pose an actual risk |
-### VulnerabilityExternalIssueLinkExternalTracker
+### `VulnerabilityExternalIssueLinkExternalTracker`
The external tracker of the external issue link related to a vulnerability.
@@ -5509,7 +8097,7 @@ The external tracker of the external issue link related to a vulnerability.
| ----- | ----------- |
| `JIRA` | Jira external tracker |
-### VulnerabilityExternalIssueLinkType
+### `VulnerabilityExternalIssueLinkType`
The type of the external issue link related to a vulnerability.
@@ -5517,7 +8105,7 @@ The type of the external issue link related to a vulnerability.
| ----- | ----------- |
| `CREATED` | Created link type |
-### VulnerabilityGrade
+### `VulnerabilityGrade`
The grade of the vulnerable project.
@@ -5529,7 +8117,7 @@ The grade of the vulnerable project.
| `D` | |
| `F` | |
-### VulnerabilityIssueLinkType
+### `VulnerabilityIssueLinkType`
The type of the issue link related to a vulnerability.
@@ -5538,7 +8126,7 @@ The type of the issue link related to a vulnerability.
| `CREATED` | |
| `RELATED` | |
-### VulnerabilityReportType
+### `VulnerabilityReportType`
The type of the security scan that found the vulnerability.
@@ -5552,7 +8140,7 @@ The type of the security scan that found the vulnerability.
| `SAST` | |
| `SECRET_DETECTION` | |
-### VulnerabilitySeverity
+### `VulnerabilitySeverity`
The severity of the vulnerability.
@@ -5565,24 +8153,24 @@ The severity of the vulnerability.
| `MEDIUM` | |
| `UNKNOWN` | |
-### VulnerabilitySort
+### `VulnerabilitySort`
Vulnerability sort values.
| Value | Description |
| ----- | ----------- |
-| `detected_asc` | Detection timestamp in ascending order |
-| `detected_desc` | Detection timestamp in descending order |
-| `report_type_asc` | Report Type in ascending order |
-| `report_type_desc` | Report Type in descending order |
-| `severity_asc` | Severity in ascending order |
-| `severity_desc` | Severity in descending order |
-| `state_asc` | State in ascending order |
-| `state_desc` | State in descending order |
-| `title_asc` | Title in ascending order |
-| `title_desc` | Title in descending order |
-
-### VulnerabilityState
+| `detected_asc` | Detection timestamp in ascending order. |
+| `detected_desc` | Detection timestamp in descending order. |
+| `report_type_asc` | Report Type in ascending order. |
+| `report_type_desc` | Report Type in descending order. |
+| `severity_asc` | Severity in ascending order. |
+| `severity_desc` | Severity in descending order. |
+| `state_asc` | State in ascending order. |
+| `state_desc` | State in descending order. |
+| `title_asc` | Title in ascending order. |
+| `title_desc` | Title in descending order. |
+
+### `VulnerabilityState`
The state of the vulnerability.
@@ -5592,3 +8180,593 @@ The state of the vulnerability.
| `DETECTED` | |
| `DISMISSED` | |
| `RESOLVED` | |
+
+## Scalar types
+
+Scalar values are atomic values, and do not have fields of their own.
+Basic scalars include strings, boolean values, and numbers. This schema also
+defines various custom scalar values, such as types for times and dates.
+
+This schema includes custom scalar types for identifiers, with a specific type for
+each kind of object.
+
+For more information, read about [Scalar Types](https://graphql.org/learn/schema/#scalar-types) on `graphql.org`.
+
+### `AlertManagementHttpIntegrationID`
+
+A `AlertManagementHttpIntegrationID` is a global ID. It is encoded as a string.
+
+An example `AlertManagementHttpIntegrationID` is: `"gid://gitlab/AlertManagement::HttpIntegration/1"`.
+
+### `AnalyticsDevopsAdoptionSegmentID`
+
+A `AnalyticsDevopsAdoptionSegmentID` is a global ID. It is encoded as a string.
+
+An example `AnalyticsDevopsAdoptionSegmentID` is: `"gid://gitlab/Analytics::DevopsAdoption::Segment/1"`.
+
+### `AwardableID`
+
+A `AwardableID` is a global ID. It is encoded as a string.
+
+An example `AwardableID` is: `"gid://gitlab/Awardable/1"`.
+
+### `BigInt`
+
+Represents non-fractional signed whole numeric values. Since the value may exceed the size of a 32-bit integer, it's encoded as a string.
+
+### `BoardID`
+
+A `BoardID` is a global ID. It is encoded as a string.
+
+An example `BoardID` is: `"gid://gitlab/Board/1"`.
+
+### `BoardsEpicBoardID`
+
+A `BoardsEpicBoardID` is a global ID. It is encoded as a string.
+
+An example `BoardsEpicBoardID` is: `"gid://gitlab/Boards::EpicBoard/1"`.
+
+### `BoardsEpicListID`
+
+A `BoardsEpicListID` is a global ID. It is encoded as a string.
+
+An example `BoardsEpicListID` is: `"gid://gitlab/Boards::EpicList/1"`.
+
+### `Boolean`
+
+Represents `true` or `false` values.
+
+### `CiPipelineID`
+
+A `CiPipelineID` is a global ID. It is encoded as a string.
+
+An example `CiPipelineID` is: `"gid://gitlab/Ci::Pipeline/1"`.
+
+### `ClustersAgentID`
+
+A `ClustersAgentID` is a global ID. It is encoded as a string.
+
+An example `ClustersAgentID` is: `"gid://gitlab/Clusters::Agent/1"`.
+
+### `ClustersAgentTokenID`
+
+A `ClustersAgentTokenID` is a global ID. It is encoded as a string.
+
+An example `ClustersAgentTokenID` is: `"gid://gitlab/Clusters::AgentToken/1"`.
+
+### `ClustersClusterID`
+
+A `ClustersClusterID` is a global ID. It is encoded as a string.
+
+An example `ClustersClusterID` is: `"gid://gitlab/Clusters::Cluster/1"`.
+
+### `ComplianceManagementFrameworkID`
+
+A `ComplianceManagementFrameworkID` is a global ID. It is encoded as a string.
+
+An example `ComplianceManagementFrameworkID` is: `"gid://gitlab/ComplianceManagement::Framework/1"`.
+
+### `ContainerRepositoryID`
+
+A `ContainerRepositoryID` is a global ID. It is encoded as a string.
+
+An example `ContainerRepositoryID` is: `"gid://gitlab/ContainerRepository/1"`.
+
+### `CustomEmojiID`
+
+A `CustomEmojiID` is a global ID. It is encoded as a string.
+
+An example `CustomEmojiID` is: `"gid://gitlab/CustomEmoji/1"`.
+
+### `DastProfileID`
+
+A `DastProfileID` is a global ID. It is encoded as a string.
+
+An example `DastProfileID` is: `"gid://gitlab/Dast::Profile/1"`.
+
+### `DastScannerProfileID`
+
+A `DastScannerProfileID` is a global ID. It is encoded as a string.
+
+An example `DastScannerProfileID` is: `"gid://gitlab/DastScannerProfile/1"`.
+
+### `DastSiteProfileID`
+
+A `DastSiteProfileID` is a global ID. It is encoded as a string.
+
+An example `DastSiteProfileID` is: `"gid://gitlab/DastSiteProfile/1"`.
+
+### `DastSiteTokenID`
+
+A `DastSiteTokenID` is a global ID. It is encoded as a string.
+
+An example `DastSiteTokenID` is: `"gid://gitlab/DastSiteToken/1"`.
+
+### `DastSiteValidationID`
+
+A `DastSiteValidationID` is a global ID. It is encoded as a string.
+
+An example `DastSiteValidationID` is: `"gid://gitlab/DastSiteValidation/1"`.
+
+### `Date`
+
+Date represented in ISO 8601.
+
+### `DesignManagementDesignAtVersionID`
+
+A `DesignManagementDesignAtVersionID` is a global ID. It is encoded as a string.
+
+An example `DesignManagementDesignAtVersionID` is: `"gid://gitlab/DesignManagement::DesignAtVersion/1"`.
+
+### `DesignManagementDesignID`
+
+A `DesignManagementDesignID` is a global ID. It is encoded as a string.
+
+An example `DesignManagementDesignID` is: `"gid://gitlab/DesignManagement::Design/1"`.
+
+### `DesignManagementVersionID`
+
+A `DesignManagementVersionID` is a global ID. It is encoded as a string.
+
+An example `DesignManagementVersionID` is: `"gid://gitlab/DesignManagement::Version/1"`.
+
+### `DiffNoteID`
+
+A `DiffNoteID` is a global ID. It is encoded as a string.
+
+An example `DiffNoteID` is: `"gid://gitlab/DiffNote/1"`.
+
+### `DiscussionID`
+
+A `DiscussionID` is a global ID. It is encoded as a string.
+
+An example `DiscussionID` is: `"gid://gitlab/Discussion/1"`.
+
+### `EnvironmentID`
+
+A `EnvironmentID` is a global ID. It is encoded as a string.
+
+An example `EnvironmentID` is: `"gid://gitlab/Environment/1"`.
+
+### `EpicID`
+
+A `EpicID` is a global ID. It is encoded as a string.
+
+An example `EpicID` is: `"gid://gitlab/Epic/1"`.
+
+### `EpicTreeSortingID`
+
+A `EpicTreeSortingID` is a global ID. It is encoded as a string.
+
+An example `EpicTreeSortingID` is: `"gid://gitlab/EpicTreeSorting/1"`.
+
+### `Float`
+
+Represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).
+
+### `GitlabErrorTrackingDetailedErrorID`
+
+A `GitlabErrorTrackingDetailedErrorID` is a global ID. It is encoded as a string.
+
+An example `GitlabErrorTrackingDetailedErrorID` is: `"gid://gitlab/Gitlab::ErrorTracking::DetailedError/1"`.
+
+### `GroupID`
+
+A `GroupID` is a global ID. It is encoded as a string.
+
+An example `GroupID` is: `"gid://gitlab/Group/1"`.
+
+### `ID`
+
+Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"VXNlci0xMA=="`) or integer (such as `4`) input value will be accepted as an ID.
+
+### `ISO8601Date`
+
+An ISO 8601-encoded date.
+
+### `IncidentManagementOncallParticipantID`
+
+A `IncidentManagementOncallParticipantID` is a global ID. It is encoded as a string.
+
+An example `IncidentManagementOncallParticipantID` is: `"gid://gitlab/IncidentManagement::OncallParticipant/1"`.
+
+### `IncidentManagementOncallRotationID`
+
+A `IncidentManagementOncallRotationID` is a global ID. It is encoded as a string.
+
+An example `IncidentManagementOncallRotationID` is: `"gid://gitlab/IncidentManagement::OncallRotation/1"`.
+
+### `Int`
+
+Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
+
+### `IssueID`
+
+A `IssueID` is a global ID. It is encoded as a string.
+
+An example `IssueID` is: `"gid://gitlab/Issue/1"`.
+
+### `IterationID`
+
+A `IterationID` is a global ID. It is encoded as a string.
+
+An example `IterationID` is: `"gid://gitlab/Iteration/1"`.
+
+### `IterationsCadenceID`
+
+A `IterationsCadenceID` is a global ID. It is encoded as a string.
+
+An example `IterationsCadenceID` is: `"gid://gitlab/Iterations::Cadence/1"`.
+
+### `JSON`
+
+Represents untyped JSON.
+
+### `JsonString`
+
+JSON object as raw string.
+
+### `LabelID`
+
+A `LabelID` is a global ID. It is encoded as a string.
+
+An example `LabelID` is: `"gid://gitlab/Label/1"`.
+
+### `ListID`
+
+A `ListID` is a global ID. It is encoded as a string.
+
+An example `ListID` is: `"gid://gitlab/List/1"`.
+
+### `MergeRequestID`
+
+A `MergeRequestID` is a global ID. It is encoded as a string.
+
+An example `MergeRequestID` is: `"gid://gitlab/MergeRequest/1"`.
+
+### `MetricsDashboardAnnotationID`
+
+A `MetricsDashboardAnnotationID` is a global ID. It is encoded as a string.
+
+An example `MetricsDashboardAnnotationID` is: `"gid://gitlab/Metrics::Dashboard::Annotation/1"`.
+
+### `MilestoneID`
+
+A `MilestoneID` is a global ID. It is encoded as a string.
+
+An example `MilestoneID` is: `"gid://gitlab/Milestone/1"`.
+
+### `NamespaceID`
+
+A `NamespaceID` is a global ID. It is encoded as a string.
+
+An example `NamespaceID` is: `"gid://gitlab/Namespace/1"`.
+
+### `NoteID`
+
+A `NoteID` is a global ID. It is encoded as a string.
+
+An example `NoteID` is: `"gid://gitlab/Note/1"`.
+
+### `NoteableID`
+
+A `NoteableID` is a global ID. It is encoded as a string.
+
+An example `NoteableID` is: `"gid://gitlab/Noteable/1"`.
+
+### `PackagesPackageID`
+
+A `PackagesPackageID` is a global ID. It is encoded as a string.
+
+An example `PackagesPackageID` is: `"gid://gitlab/Packages::Package/1"`.
+
+### `ProjectID`
+
+A `ProjectID` is a global ID. It is encoded as a string.
+
+An example `ProjectID` is: `"gid://gitlab/Project/1"`.
+
+### `PrometheusServiceID`
+
+A `PrometheusServiceID` is a global ID. It is encoded as a string.
+
+An example `PrometheusServiceID` is: `"gid://gitlab/PrometheusService/1"`.
+
+### `ReleasesLinkID`
+
+A `ReleasesLinkID` is a global ID. It is encoded as a string.
+
+An example `ReleasesLinkID` is: `"gid://gitlab/Releases::Link/1"`.
+
+### `SnippetID`
+
+A `SnippetID` is a global ID. It is encoded as a string.
+
+An example `SnippetID` is: `"gid://gitlab/Snippet/1"`.
+
+### `String`
+
+Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.
+
+### `TerraformStateID`
+
+A `TerraformStateID` is a global ID. It is encoded as a string.
+
+An example `TerraformStateID` is: `"gid://gitlab/Terraform::State/1"`.
+
+### `Time`
+
+Time represented in ISO 8601.
+
+For example: "2021-03-09T14:58:50+00:00".
+
+See `https://www.iso.org/iso-8601-date-and-time-format.html`.
+
+### `TodoID`
+
+A `TodoID` is a global ID. It is encoded as a string.
+
+An example `TodoID` is: `"gid://gitlab/Todo/1"`.
+
+### `TodoableID`
+
+A `TodoableID` is a global ID. It is encoded as a string.
+
+An example `TodoableID` is: `"gid://gitlab/Todoable/1"`.
+
+### `UntrustedRegexp`
+
+A regexp containing patterns sourced from user input.
+
+### `Upload`
+
+### `UserID`
+
+A `UserID` is a global ID. It is encoded as a string.
+
+An example `UserID` is: `"gid://gitlab/User/1"`.
+
+### `VulnerabilitiesExternalIssueLinkID`
+
+A `VulnerabilitiesExternalIssueLinkID` is a global ID. It is encoded as a string.
+
+An example `VulnerabilitiesExternalIssueLinkID` is: `"gid://gitlab/Vulnerabilities::ExternalIssueLink/1"`.
+
+### `VulnerabilityID`
+
+A `VulnerabilityID` is a global ID. It is encoded as a string.
+
+An example `VulnerabilityID` is: `"gid://gitlab/Vulnerability/1"`.
+
+## Abstract types
+
+Abstract types (unions and interfaces) are ways the schema can represent
+values that may be one of several concrete types.
+
+- A [`Union`](https://graphql.org/learn/schema/#union-types) is a set of possible types.
+ The types might not have any fields in common.
+- An [`Interface`](https://graphql.org/learn/schema/#interfaces) is a defined set of fields.
+ Types may `implement` an interface, which
+ guarantees that they have all the fields in the set. A type may implement more than
+ one interface.
+
+See the [GraphQL documentation](https://graphql.org/learn/) for more information on using
+abstract types.
+
+### Unions
+
+#### `PackageMetadata`
+
+Represents metadata associated with a Package.
+
+One of:
+
+- [`ComposerMetadata`](#composermetadata)
+
+#### `VulnerabilityDetail`
+
+Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type.
+
+One of:
+
+- [`VulnerabilityDetailBase`](#vulnerabilitydetailbase)
+- [`VulnerabilityDetailBoolean`](#vulnerabilitydetailboolean)
+- [`VulnerabilityDetailCode`](#vulnerabilitydetailcode)
+- [`VulnerabilityDetailCommit`](#vulnerabilitydetailcommit)
+- [`VulnerabilityDetailDiff`](#vulnerabilitydetaildiff)
+- [`VulnerabilityDetailFileLocation`](#vulnerabilitydetailfilelocation)
+- [`VulnerabilityDetailInt`](#vulnerabilitydetailint)
+- [`VulnerabilityDetailList`](#vulnerabilitydetaillist)
+- [`VulnerabilityDetailMarkdown`](#vulnerabilitydetailmarkdown)
+- [`VulnerabilityDetailModuleLocation`](#vulnerabilitydetailmodulelocation)
+- [`VulnerabilityDetailTable`](#vulnerabilitydetailtable)
+- [`VulnerabilityDetailText`](#vulnerabilitydetailtext)
+- [`VulnerabilityDetailUrl`](#vulnerabilitydetailurl)
+
+#### `VulnerabilityLocation`
+
+Represents a vulnerability location. The fields with data will depend on the vulnerability report type.
+
+One of:
+
+- [`VulnerabilityLocationContainerScanning`](#vulnerabilitylocationcontainerscanning)
+- [`VulnerabilityLocationCoverageFuzzing`](#vulnerabilitylocationcoveragefuzzing)
+- [`VulnerabilityLocationDast`](#vulnerabilitylocationdast)
+- [`VulnerabilityLocationDependencyScanning`](#vulnerabilitylocationdependencyscanning)
+- [`VulnerabilityLocationSast`](#vulnerabilitylocationsast)
+- [`VulnerabilityLocationSecretDetection`](#vulnerabilitylocationsecretdetection)
+
+### Interfaces
+
+#### `AlertManagementIntegration`
+
+Implementations:
+
+- [`AlertManagementHttpIntegration`](#alertmanagementhttpintegration)
+- [`AlertManagementPrometheusIntegration`](#alertmanagementprometheusintegration)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `active` | [`Boolean`](#boolean) | Whether the endpoint is currently accepting alerts. |
+| `apiUrl` | [`String`](#string) | URL at which Prometheus metrics can be queried to populate the metrics dashboard. |
+| `id` | [`ID!`](#id) | ID of the integration. |
+| `name` | [`String`](#string) | Name of the integration. |
+| `token` | [`String`](#string) | Token used to authenticate alert notification requests. |
+| `type` | [`AlertManagementIntegrationType!`](#alertmanagementintegrationtype) | Type of integration. |
+| `url` | [`String`](#string) | Endpoint which accepts alert notifications. |
+
+#### `CurrentUserTodos`
+
+Implementations:
+
+- [`BoardEpic`](#boardepic)
+- [`Design`](#design)
+- [`Epic`](#epic)
+- [`EpicIssue`](#epicissue)
+- [`Issue`](#issue)
+- [`MergeRequest`](#mergerequest)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `currentUserTodos` | [`TodoConnection!`](#todoconnection) | To-do items for the current user. |
+
+#### `DesignFields`
+
+Implementations:
+
+- [`Design`](#design)
+- [`DesignAtVersion`](#designatversion)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `diffRefs` | [`DiffRefs!`](#diffrefs) | The diff refs for this design. |
+| `event` | [`DesignVersionEvent!`](#designversionevent) | How this design was changed in the current version. |
+| `filename` | [`String!`](#string) | The filename of the design. |
+| `fullPath` | [`String!`](#string) | The full path to the design file. |
+| `id` | [`ID!`](#id) | The ID of this design. |
+| `image` | [`String!`](#string) | The URL of the full-sized image. |
+| `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 |
+| `issue` | [`Issue!`](#issue) | The issue the design belongs to. |
+| `notesCount` | [`Int!`](#int) | The total count of user-created notes for this design. |
+| `project` | [`Project!`](#project) | The project the design belongs to. |
+
+#### `Entry`
+
+Implementations:
+
+- [`Blob`](#blob)
+- [`Submodule`](#submodule)
+- [`TreeEntry`](#treeentry)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `flatPath` | [`String!`](#string) | Flat path of the entry. |
+| `id` | [`ID!`](#id) | ID of the entry. |
+| `name` | [`String!`](#string) | Name of the entry. |
+| `path` | [`String!`](#string) | Path of the entry. |
+| `sha` | [`String!`](#string) | Last commit SHA for the entry. |
+| `type` | [`EntryType!`](#entrytype) | Type of tree entry. |
+
+#### `Eventable`
+
+Implementations:
+
+- [`BoardEpic`](#boardepic)
+- [`Epic`](#epic)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `events` | [`EventConnection`](#eventconnection) | A list of events associated with the object. |
+
+#### `MemberInterface`
+
+Implementations:
+
+- [`GroupMember`](#groupmember)
+- [`ProjectMember`](#projectmember)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `accessLevel` | [`AccessLevel`](#accesslevel) | GitLab::Access level. |
+| `createdAt` | [`Time`](#time) | Date and time the membership was created. |
+| `createdBy` | [`User`](#user) | User that authorized membership. |
+| `expiresAt` | [`Time`](#time) | Date and time the membership expires. |
+| `id` | [`ID!`](#id) | ID of the member. |
+| `updatedAt` | [`Time`](#time) | Date and time the membership was last updated. |
+| `user` | [`User!`](#user) | User that is associated with the member object. |
+
+#### `Noteable`
+
+Implementations:
+
+- [`AlertManagementAlert`](#alertmanagementalert)
+- [`BoardEpic`](#boardepic)
+- [`Design`](#design)
+- [`Epic`](#epic)
+- [`EpicIssue`](#epicissue)
+- [`Issue`](#issue)
+- [`MergeRequest`](#mergerequest)
+- [`Snippet`](#snippet)
+- [`Vulnerability`](#vulnerability)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. |
+| `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. |
+
+#### `ResolvableInterface`
+
+Implementations:
+
+- [`Discussion`](#discussion)
+- [`Note`](#note)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `resolvable` | [`Boolean!`](#boolean) | Indicates if the object can be resolved. |
+| `resolved` | [`Boolean!`](#boolean) | Indicates if the object is resolved. |
+| `resolvedAt` | [`Time`](#time) | Timestamp of when the object was resolved. |
+| `resolvedBy` | [`User`](#user) | User who resolved the object. |
+
+#### `Service`
+
+Implementations:
+
+- [`BaseService`](#baseservice)
+- [`JiraService`](#jiraservice)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `active` | [`Boolean`](#boolean) | Indicates if the service is active. |
+| `type` | [`String`](#string) | Class name of the service. |
+
+#### `TimeboxReportInterface`
+
+Implementations:
+
+- [`Iteration`](#iteration)
+- [`Milestone`](#milestone)
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `report` | [`TimeboxReport`](#timeboxreport) | Historically accurate report about the timebox. |
diff --git a/doc/api/graphql/removed_items.md b/doc/api/graphql/removed_items.md
index 2761c1a1c84..a76f1fb7418 100644
--- a/doc/api/graphql/removed_items.md
+++ b/doc/api/graphql/removed_items.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GraphQL is a versionless API, unlike the REST API.
Occasionally, items have to be updated or removed from the GraphQL API.
-According to our [process for removing items](index.md#deprecation-process), here are the items that have been removed.
+According to our [process for removing items](index.md#deprecation-and-removal-process), here are the items that have been removed.
## GitLab 13.6
diff --git a/doc/api/group_boards.md b/doc/api/group_boards.md
index 16ab81af1fe..a0121388194 100644
--- a/doc/api/group_boards.md
+++ b/doc/api/group_boards.md
@@ -33,14 +33,14 @@ Example response:
[
{
"id": 1,
- "name:": "group issue board",
+ "name": "group issue board",
"group": {
"id": 5,
"name": "Documentcloud",
"web_url": "http://example.com/groups/documentcloud"
},
"milestone": {
- "id": 12
+ "id": 12,
"title": "10.0"
},
"lists" : [
@@ -85,14 +85,14 @@ Example response:
[
{
"id": 1,
- "name:": "group issue board",
+ "name": "group issue board",
"group": {
"id": 5,
"name": "Documentcloud",
"web_url": "http://example.com/groups/documentcloud"
},
"milestone": {
- "id": 12
+ "id": 12,
"title": "10.0"
},
"lists" : [
@@ -150,14 +150,14 @@ Example response:
```json
{
"id": 1,
- "name:": "group issue board",
+ "name": "group issue board",
"group": {
"id": 5,
"name": "Documentcloud",
"web_url": "http://example.com/groups/documentcloud"
},
"milestone": {
- "id": 12
+ "id": 12,
"title": "10.0"
},
"lists" : [
@@ -200,14 +200,14 @@ Example response:
```json
{
"id": 1,
- "name:": "group issue board",
+ "name": "group issue board",
"group": {
"id": 5,
"name": "Documentcloud",
"web_url": "http://example.com/groups/documentcloud"
},
"milestone": {
- "id": 12
+ "id": 12,
"title": "10.0"
},
"lists" : [
diff --git a/doc/api/group_repository_storage_moves.md b/doc/api/group_repository_storage_moves.md
index 8a19a43d31f..f4d89c34f38 100644
--- a/doc/api/group_repository_storage_moves.md
+++ b/doc/api/group_repository_storage_moves.md
@@ -197,7 +197,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `group_id` | integer | yes | ID of the group. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
@@ -236,7 +236,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `source_storage_name` | string | yes | Name of the source storage shard. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
diff --git a/doc/api/groups.md b/doc/api/groups.md
index 6031d780436..b3ab00b362e 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -1258,7 +1258,7 @@ Read more in the [Group Import/Export](group_import_export.md) documentation.
## Share Groups with Groups
-These endpoints create and delete links for sharing a group with another group. For more information, see the related discussion in the [GitLab Groups](../user/group/index.md#sharing-a-group-with-another-group) page.
+These endpoints create and delete links for sharing a group with another group. For more information, see the related discussion in the [GitLab Groups](../user/group/index.md#share-a-group-with-another-group) page.
### Create a link to share a group with another group
diff --git a/doc/api/invitations.md b/doc/api/invitations.md
index 7259dddec8c..905e4c2e288 100644
--- a/doc/api/invitations.md
+++ b/doc/api/invitations.md
@@ -38,7 +38,7 @@ POST /projects/:id/invitations
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
-| `email` | integer/string | yes | The email of the new member or multiple emails separated by commas |
+| `email` | string | yes | The email of the new member or multiple emails separated by commas |
| `access_level` | integer | yes | A valid access level |
| `expires_at` | string | no | A date string in the format YEAR-MONTH-DAY |
@@ -107,6 +107,36 @@ Example response:
]
```
+## Update an invitation to a group or project
+
+Updates a pending invitation's access level or access expiry date.
+
+```plaintext
+PUT /groups/:id/invitations/:email
+PUT /projects/:id/invitations/:email
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `email` | string | yes | The email address to which the invitation was previously sent. |
+| `access_level` | integer | no | A valid access level (defaults: `30`, developer access level). |
+| `expires_at` | string | no | A date string in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`). |
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/55/invitations/email@example.org?access_level=40"
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/55/invitations/email@example.org?access_level=40"
+```
+
+Example response:
+
+```json
+{
+ "expires_at": "2012-10-22T14:13:35Z",
+ "access_level": 40,
+}
+```
+
## Delete an invitation to a group or project
Deletes a pending invitation by email address.
diff --git a/doc/api/issue_links.md b/doc/api/issue_links.md
index 0d55b77df0e..40f536c86ba 100644
--- a/doc/api/issue_links.md
+++ b/doc/api/issue_links.md
@@ -166,7 +166,7 @@ DELETE /projects/:id/issues/:issue_iid/links/:issue_link_id
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
| `issue_link_id` | integer/string | yes | The ID of an issue relationship |
-| `link_type` | string | no | The type of the relation ('relates_to', 'blocks', 'is_blocked_by'), defaults to 'relates_to' |
+| `link_type` | string | no | The type of the relation (`relates_to`, `blocks`, `is_blocked_by`), defaults to `relates_to` |
```json
{
diff --git a/doc/api/issues.md b/doc/api/issues.md
index c333967b36c..23028b44169 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -67,7 +67,7 @@ GET /issues?state=opened
| `milestone` | string | no | The milestone title. `None` lists all issues with no milestone. `Any` lists all issues that have an assigned milestone. |
| `my_reaction_emoji` | string | no | Return issues reacted by the authenticated user by the given `emoji`. `None` returns issues not given a reaction. `Any` returns issues given at least one reaction. _([Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14016) in GitLab 10.0)_ |
| `non_archived` | boolean | no | Return issues only from non-archived projects. If `false`, the response returns issues from both archived and non-archived projects. Default is `true`. _(Introduced in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/197170))_ |
-| `not` | Hash | no | Return issues that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `my_reaction_emoji` |
+| `not` | Hash | no | Return issues that do not match the parameters supplied. Accepts: `assignee_id`, `assignee_username`, `author_id`, `author_username`, `iids`, `iteration_id`, `iteration_title`, `labels`, `milestone`, and `weight`. |
| `order_by` | string | no | Return issues ordered by `created_at`, `updated_at`, `priority`, `due_date`, `relative_position`, `label_priority`, `milestone_due`, `popularity`, `weight` fields. Default is `created_at` |
| `scope` | string | no | Return issues for the given scope: `created_by_me`, `assigned_to_me` or `all`. Defaults to `created_by_me`<br> For versions before 11.0, use the now deprecated `created-by-me` or `assigned-to-me` scopes instead.<br> _([Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13004) in GitLab 9.5. [Changed to snake_case](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18935) in GitLab 11.0)_ |
| `search` | string | no | Search issues against their `title` and `description` |
diff --git a/doc/api/job_artifacts.md b/doc/api/job_artifacts.md
index a6b5e9e4711..0dbb35a62cd 100644
--- a/doc/api/job_artifacts.md
+++ b/doc/api/job_artifacts.md
@@ -128,7 +128,8 @@ Possible response status codes:
## Download a single artifact file by job ID
-> Introduced in GitLab 10.0
+> - Introduced in GitLab 10.0.
+> - The use of `CI_JOB_TOKEN` in the artifacts download API was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55042) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.10.
Download a single artifact file from a job with a specified ID from inside
the job's artifacts zipped archive. The file is extracted from the archive and
@@ -145,6 +146,7 @@ Parameters
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | The unique job identifier. |
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
+| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/README.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
Example request:
@@ -162,7 +164,8 @@ Possible response status codes:
## Download a single artifact file from specific tag or branch
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23538) in GitLab 11.5.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23538) in GitLab 11.5.
+> - The use of `CI_JOB_TOKEN` in the artifacts download API was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55042) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.10.
Download a single artifact file for a specific job of the latest successful
pipeline for the given reference name from inside the job's artifacts archive.
@@ -185,6 +188,7 @@ Parameters:
| `ref_name` | string | yes | Branch or tag name in repository. `HEAD` or `SHA` references are not supported. |
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
| `job` | string | yes | The name of the job. |
+| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/README.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
Example request:
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index 18d2e5ec3df..981aec07bdb 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -61,6 +61,7 @@ Example of response
"name": "teaspoon",
"pipeline": {
"id": 6,
+ "project_id": 1,
"ref": "master",
"sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
"status": "pending"
@@ -114,6 +115,7 @@ Example of response
"name": "rspec:other",
"pipeline": {
"id": 6,
+ "project_id": 1,
"ref": "master",
"sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
"status": "pending"
@@ -193,6 +195,7 @@ Example of response
"name": "rspec:other",
"pipeline": {
"id": 6,
+ "project_id": 1,
"ref": "master",
"sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
"status": "pending"
@@ -256,6 +259,7 @@ Example of response
"name": "teaspoon",
"pipeline": {
"id": 6,
+ "project_id": 1,
"ref": "master",
"sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
"status": "pending"
@@ -338,6 +342,7 @@ Example of response
"name": "teaspoon",
"pipeline": {
"id": 6,
+ "project_id": 1,
"ref": "master",
"sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
"status": "pending",
@@ -380,6 +385,77 @@ Example of response
]
```
+## Get job token's job
+
+Retrieve the job that generated a job token.
+
+```plaintext
+GET /job
+```
+
+Examples
+
+```shell
+curl --header "JOB-TOKEN: <your_job_token>" "https://gitlab.example.com/api/v4/job"
+curl "https://gitlab.example.com/api/v4/job?job_token=<your_job_token>"
+```
+
+Example of response
+
+```json
+{
+ "commit": {
+ "author_email": "admin@example.com",
+ "author_name": "Administrator",
+ "created_at": "2015-12-24T16:51:14.000+01:00",
+ "id": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
+ "message": "Test the CI integration.",
+ "short_id": "0ff3ae19",
+ "title": "Test the CI integration."
+ },
+ "coverage": null,
+ "allow_failure": false,
+ "created_at": "2015-12-24T15:51:21.880Z",
+ "started_at": "2015-12-24T17:54:30.733Z",
+ "finished_at": "2015-12-24T17:54:31.198Z",
+ "duration": 0.465,
+ "artifacts_expire_at": "2016-01-23T17:54:31.198Z",
+ "id": 8,
+ "name": "rubocop",
+ "pipeline": {
+ "id": 6,
+ "project_id": 1,
+ "ref": "master",
+ "sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
+ "status": "pending"
+ },
+ "ref": "master",
+ "artifacts": [],
+ "runner": null,
+ "stage": "test",
+ "status": "failed",
+ "tag": false,
+ "web_url": "https://example.com/foo/bar/-/jobs/8",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "state": "active",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "web_url": "http://gitlab.dev/root",
+ "created_at": "2015-12-21T13:14:24.077Z",
+ "bio": null,
+ "location": null,
+ "public_email": "",
+ "skype": "",
+ "linkedin": "",
+ "twitter": "",
+ "website_url": "",
+ "organization": ""
+ }
+}
+```
+
## Get a single job
Get a single job of a project
@@ -424,6 +500,7 @@ Example of response
"name": "rubocop",
"pipeline": {
"id": 6,
+ "project_id": 1,
"ref": "master",
"sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
"status": "pending"
diff --git a/doc/api/members.md b/doc/api/members.md
index bf2bf8c1220..286be10dd6e 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -237,6 +237,8 @@ Example response:
Gets a list of group members that count as billable. The list includes members in the subgroup or subproject.
+This API endpoint works on top-level groups only. It does not work on subgroups.
+
NOTE:
Unlike other API endpoints, billable members is updated once per day at 12:00 UTC.
@@ -308,6 +310,27 @@ Example response:
]
```
+## Remove a billable member from a group
+
+Removes a billable member from a group and its subgroups and projects.
+
+The user does not need to be a group member to qualify for removal.
+For example, if the user was added directly to a project within the group, you can
+still use this API to remove them.
+
+```plaintext
+DELETE /groups/:id/billable_members/:user_id
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `user_id` | integer | yes | The user ID of the member |
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/billable_members/:user_id"
+```
+
## Add a member to a group or project
Adds a member to a group or project.
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index 5b8bad1d685..ea049c46e73 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -388,7 +388,7 @@ You can update project approval rules using the following endpoint:
PUT /projects/:id/approval_rules/:approval_rule_id
```
-**Important:** Approvers and groups not in the `users`/`groups` parameters will be **removed**
+**Important:** Approvers and groups not in the `users`/`groups` parameters are **removed**
**Parameters:**
@@ -516,7 +516,7 @@ the following endpoint:
PUT /projects/:id/approvers
```
-**Important:** Approvers and groups not in the request will be **removed**
+**Important:** Approvers and groups not in the request are **removed**
**Parameters:**
@@ -567,6 +567,120 @@ PUT /projects/:id/approvers
}
```
+## External Project-level MR approvals **(ULTIMATE)**
+
+Configuration for approvals on a specific Merge Request which makes a call to an external HTTP resource.
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3869) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../user/feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-external-project-level-mr-approvals). **(ULTIMATE SELF)**
+
+### Get project external approval rules **(ULTIMATE)**
+
+You can request information about a project's external approval rules using the following endpoint:
+
+```plaintext
+GET /projects/:id/external_approval_rules
+```
+
+**Parameters:**
+
+| Attribute | Type | Required | Description |
+|---------------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+
+```json
+[
+ {
+ "id": 1,
+ "name": "Compliance Check",
+ "project_id": 6,
+ "external_url": "https://gitlab.com/example/test.json",
+ "protected_branches": [
+ {
+ "id": 14,
+ "project_id": 6,
+ "name": "master",
+ "created_at": "2020-10-12T14:04:50.787Z",
+ "updated_at": "2020-10-12T14:04:50.787Z",
+ "code_owner_approval_required": false
+ }
+ ]
+ }
+]
+```
+
+### Create external approval rule **(ULTIMATE)**
+
+You can create a new external approval rule for a project using the following endpoint:
+
+```plaintext
+POST /projects/:id/external_approval_rules
+```
+
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|----------------------------------------------------|
+| `id` | integer | yes | The ID of a project |
+| `name` | string | yes | Display name of approval rule |
+| `external_url` | string | yes | URL of external approval resource |
+| `protected_branch_ids` | `array<Integer>` | no | The ids of protected branches to scope the rule by |
+
+### Delete external approval rule **(ULTIMATE)**
+
+You can delete an external approval rule for a project using the following endpoint:
+
+```plaintext
+DELETE /projects/:id/external_approval_rules/:rule_id
+```
+
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|----------------------------------------------------|
+| `rule_id` | integer | yes | The ID of an approval rule |
+| `id` | integer | yes | The ID of a project |
+
+### Update external approval rule **(ULTIMATE)**
+
+You can update an existing external approval rule for a project using the following endpoint:
+
+```plaintext
+PATCH /projects/:id/external_approval_rules/:rule_id
+```
+
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|----------------------------------------------------|
+| `id` | integer | yes | The ID of a project |
+| `rule_id` | integer | yes | The ID of an external approval rule |
+| `name` | string | no | Display name of approval rule |
+| `external_url` | string | no | URL of external approval resource |
+| `protected_branch_ids` | `array<Integer>` | no | The ids of protected branches to scope the rule by |
+
+### Enable or disable External Project-level MR approvals **(ULTIMATE SELF)**
+
+Enable or disable External Project-level MR approvals is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../user/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+# For the instance
+Feature.enable(:ff_compliance_approval_gates)
+# For a single project
+Feature.enable(:ff_compliance_approval_gates, Project.find(<project id>))
+```
+
+To disable it:
+
+```ruby
+# For the instance
+Feature.disable(:ff_compliance_approval_gates)
+# For a single project
+Feature.disable(:ff_compliance_approval_gates, Project.find(<project id>))
+```
+
## Merge Request-level MR approvals
Configuration for approvals on a specific Merge Request. Must be authenticated for all endpoints.
@@ -670,7 +784,7 @@ the following endpoint:
PUT /projects/:id/merge_requests/:merge_request_iid/approvers
```
-**Important:** Approvers and groups not in the request will be **removed**
+**Important:** Approvers and groups not in the request are **removed**
**Parameters:**
@@ -741,8 +855,8 @@ You can request information about a merge request's approval state by using the
GET /projects/:id/merge_requests/:merge_request_iid/approval_state
```
-The `approval_rules_overwritten` will be `true` if the merge request level rules
-are created for the merge request. If there's none, it'll be `false`.
+The `approval_rules_overwritten` are `true` if the merge request level rules
+are created for the merge request. If there are none, it is `false`.
This includes additional information about the users who have already approved
(`approved_by`) and whether a rule is already approved (`approved`).
@@ -905,8 +1019,8 @@ POST /projects/:id/merge_requests/:merge_request_iid/approval_rules
| `group_ids` | Array | no | The ids of groups as approvers |
**Important:** When `approval_project_rule_id` is set, the `name`, `users` and
-`groups` of project-level rule will be copied. The `approvals_required` specified
-will be used.
+`groups` of project-level rule are copied. The `approvals_required` specified
+is used.
```json
{
@@ -977,7 +1091,7 @@ You can update merge request approval rules using the following endpoint:
PUT /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id
```
-**Important:** Approvers and groups not in the `users`/`groups` parameters will be **removed**
+**Important:** Approvers and groups not in the `users`/`groups` parameters are **removed**
**Important:** Updating a `report_approver` or `code_owner` rule is not allowed.
These are system generated rules.
@@ -1098,7 +1212,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/approve
The `sha` parameter works in the same way as
when [accepting a merge request](merge_requests.md#accept-mr): if it is passed, then it must
match the current HEAD of the merge request for the approval to be added. If it
-does not match, the response code will be `409`.
+does not match, the response code is `409`.
```json
{
diff --git a/doc/api/merge_request_context_commits.md b/doc/api/merge_request_context_commits.md
index 0b4b96b889b..cd38d972320 100644
--- a/doc/api/merge_request_context_commits.md
+++ b/doc/api/merge_request_context_commits.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference, api
---
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index d9bcba96fdc..b77b1a59cd9 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference, api
---
@@ -44,7 +44,10 @@ is fetched from its project, `relative` format would be the same as `short` form
diffs associated with the set of changes have the same size limitations applied as other diffs
returned by the API or viewed via the UI. When these limits impact the results, the `overflow`
field contains a value of `true`. Diff data without these limits applied can be retrieved by
-adding the `access_raw_diffs` parameter, but it is slower and more resource-intensive.
+adding the `access_raw_diffs` parameter, accessing diffs not from the database but from Gitaly directly.
+This approach is generally slower and more resource-intensive, but isn't subject to size limits
+placed on database-backed diffs. [Limits inherent to Gitaly](../development/diffs.md#diff-limits)
+still apply.
## List merge requests
@@ -101,7 +104,7 @@ Parameters:
| `target_branch` | string | no | Return merge requests with the given target branch. |
| `search` | string | no | Search merge requests against their `title` and `description`. |
| `in` | string | no | Modify the scope of the `search` attribute. `title`, `description`, or a string joining them with comma. Default is `title,description`. |
-| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* WIP merge requests, `no` to return *non* WIP merge requests. |
+| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* draft merge requests, `no` to return *non-draft* merge requests. |
| `not` | Hash | no | Return merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. |
| `environment` | string | no | Returns merge requests deployed to the given environment. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `deployed_before` | datetime | no | Return merge requests deployed before the given date/time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
@@ -287,7 +290,7 @@ Parameters:
| `source_branch` | string | no | Return merge requests with the given source branch. |
| `target_branch` | string | no | Return merge requests with the given target branch. |
| `search` | string | no | Search merge requests against their `title` and `description`. |
-| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* WIP merge requests, `no` to return *non* WIP merge requests. |
+| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* draft merge requests, `no` to return *non-draft* merge requests. |
| `not` | Hash | no | Return merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. |
```json
@@ -846,7 +849,7 @@ Parameters:
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
-| `access_raw_diffs` | boolean | no | Retrieve change diffs without size limitations. |
+| `access_raw_diffs` | boolean | no | Retrieve change diffs via Gitaly. |
```json
{
@@ -1061,7 +1064,7 @@ POST /projects/:id/merge_requests
| `title` | string | yes | Title of MR. |
| `assignee_id` | integer | no | Assignee user ID. |
| `assignee_ids` | integer array | no | The ID of the user(s) to assign the MR to. Set to `0` or provide an empty value to unassign all assignees. |
-| `reviewer_ids` | integer array | no | The ID of the user(s) added as a reviewer to the MR. If set to `0` or left empty, there will be no reviewers added. |
+| `reviewer_ids` | integer array | no | The ID of the user(s) added as a reviewer to the MR. If set to `0` or left empty, no reviewers are added. |
| `description` | string | no | Description of MR. Limited to 1,048,576 characters. |
| `target_project_id` | integer | no | The target project (numeric ID). |
| `labels` | string | no | Labels for MR as a comma-separated list. |
diff --git a/doc/api/merge_trains.md b/doc/api/merge_trains.md
index d8c0acb3896..9fc17930c92 100644
--- a/doc/api/merge_trains.md
+++ b/doc/api/merge_trains.md
@@ -26,7 +26,7 @@ Read more on [pagination](README.md#pagination).
Get all Merge Trains of the requested project:
-```txt
+```shell
GET /projects/:id/merge_trains
GET /projects/:id/merge_trains?scope=complete
```
diff --git a/doc/api/notification_settings.md b/doc/api/notification_settings.md
index a85c6475331..57eac61de46 100644
--- a/doc/api/notification_settings.md
+++ b/doc/api/notification_settings.md
@@ -39,6 +39,7 @@ If the `custom` level is used, specific email events can be controlled. Availabl
- `fixed_pipeline`
- `success_pipeline`
- `moved_project`
+- `merge_when_pipeline_succeeds`
- `new_epic` **(ULTIMATE)**
## Global notification settings
@@ -94,6 +95,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
| `fixed_pipeline` | boolean | no | Enable/disable this notification |
| `success_pipeline` | boolean | no | Enable/disable this notification |
| `moved_project` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30371) in GitLab 13.3) |
+| `merge_when_pipeline_succeeds` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/244840) in GitLab 13.9) |
| `new_epic` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5863) in GitLab 11.3) **(ULTIMATE)** |
Example response:
@@ -165,6 +167,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
| `fixed_pipeline` | boolean | no | Enable/disable this notification |
| `success_pipeline` | boolean | no | Enable/disable this notification |
| `moved_project` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30371) in GitLab 13.3) |
+| `merge_when_pipeline_succeeds` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/244840) in GitLab 13.9) |
| `new_epic` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5863) in GitLab 11.3) **(ULTIMATE)** |
Example responses:
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index 92d109cac5f..2bcf86a031c 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -270,13 +270,18 @@ the following parameters:
}
```
-Also you must use HTTP Basic authentication using the `client_id` and`client_secret`
-values to authenticate the client that performs a request.
-
Example cURL request:
```shell
echo 'grant_type=password&username=<your_username>&password=<your_password>' > auth.txt
+curl --data "@auth.txt" --request POST "https://gitlab.example.com/oauth/token"
+```
+
+You can also use this grant flow with registered OAuth applications, by using
+HTTP Basic Authentication with the application's `client_id` and `client_secret`:
+
+```shell
+echo 'grant_type=password&username=<your_username>&password=<your_password>' > auth.txt
curl --data "@auth.txt" --user client_id:client_secret --request POST "https://gitlab.example.com/oauth/token"
```
@@ -354,3 +359,13 @@ These are aliases for `scope` and `expires_in` respectively, and have been inclu
prevent breaking changes introduced in [doorkeeper 5.0.2](https://github.com/doorkeeper-gem/doorkeeper/wiki/Migration-from-old-versions#from-4x-to-5x).
Don't rely on these fields as they will be removed in a later release.
+
+## OAuth2 tokens and GitLab registries
+
+Standard OAuth2 tokens support different degrees of access to GitLab registries, as they:
+
+- Do not allow users to authenticate to:
+ - The GitLab [Container registry](../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
+ - Packages listed in the GitLab [Package registry](../user/packages/package_registry/index.md).
+- Allow users to get, list, and delete registries through
+ the [Container registry API](container_registry.md).
diff --git a/doc/api/openapi/openapi_interactive.md b/doc/api/openapi/openapi_interactive.md
index 0f1544b139d..95d7bba8081 100644
--- a/doc/api/openapi/openapi_interactive.md
+++ b/doc/api/openapi/openapi_interactive.md
@@ -27,7 +27,7 @@ and example server responses. Some parameters include a default or a list of all
![API viewer screenshot](img/apiviewer04-fs8.png)
-## Starting an interactive sesssion
+## Starting an interactive session
A [Personal access token](../../user/profile/personal_access_tokens.md) (PAT) is one way to
start an interactive session. To do this, select **Authorize** from the main page, and a
diff --git a/doc/api/pipeline_schedules.md b/doc/api/pipeline_schedules.md
index a400db37b22..67529adee93 100644
--- a/doc/api/pipeline_schedules.md
+++ b/doc/api/pipeline_schedules.md
@@ -115,7 +115,7 @@ POST /projects/:id/pipeline_schedules
| `description` | string | yes | The description of the pipeline schedule. |
| `ref` | string | yes | The branch or tag name that is triggered. |
| `cron` | string | yes | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
-| `cron_timezone` | string | no | The timezone supported by `ActiveSupport::TimeZone`, for example: `Pacific Time (US & Canada)` (default: `'UTC'`). |
+| `cron_timezone` | string | no | The timezone supported by `ActiveSupport::TimeZone`, for example: `Pacific Time (US & Canada)` (default: `UTC`). |
| `active` | boolean | no | The activation of pipeline schedule. If false is set, the pipeline schedule is initially deactivated (default: `true`). |
```shell
diff --git a/doc/api/pipelines.md b/doc/api/pipelines.md
index 14ded7c569d..975c4a5746f 100644
--- a/doc/api/pipelines.md
+++ b/doc/api/pipelines.md
@@ -54,6 +54,7 @@ Example of response
[
{
"id": 47,
+ "project_id": 1,
"status": "pending",
"ref": "new-pipeline",
"sha": "a91957a858320c0e17f3a0eca7cfacbff50ea29a",
@@ -63,6 +64,7 @@ Example of response
},
{
"id": 48,
+ "project_id": 1,
"status": "pending",
"ref": "new-pipeline",
"sha": "eb94b618fb5865b26e80fdd8ae531b7a63ad851a",
@@ -95,6 +97,7 @@ Example of response
```json
{
"id": 46,
+ "project_id": 1,
"status": "success",
"ref": "master",
"sha": "a91957a858320c0e17f3a0eca7cfacbff50ea29a",
@@ -230,6 +233,7 @@ Example of response
```json
{
"id": 61,
+ "project_id": 1,
"sha": "384c444e840a515b23f21915ee5766b87068a70d",
"ref": "master",
"status": "pending",
@@ -277,6 +281,7 @@ Response:
```json
{
"id": 46,
+ "project_id": 1,
"status": "pending",
"ref": "master",
"sha": "a91957a858320c0e17f3a0eca7cfacbff50ea29a",
@@ -324,6 +329,7 @@ Response:
```json
{
"id": 46,
+ "project_id": 1,
"status": "canceled",
"ref": "master",
"sha": "a91957a858320c0e17f3a0eca7cfacbff50ea29a",
diff --git a/doc/api/plan_limits.md b/doc/api/plan_limits.md
new file mode 100644
index 00000000000..105cf13f9de
--- /dev/null
+++ b/doc/api/plan_limits.md
@@ -0,0 +1,81 @@
+---
+stage: Manage
+group: Access
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Plan limits API **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54232) in GitLab 13.10.
+
+The plan limits API allows you to maintain the application limits for the existing subscription plans.
+
+The existing plans depend on the GitLab edition. In the Community Edition, only the plan `default`
+is available. In the Enterprise Edition, additional plans are available as well.
+
+NOTE:
+Administrator access is required to use this API.
+
+## Get current plan limits
+
+List the current limits of a plan on the GitLab instance.
+
+```plaintext
+GET /application/plan_limits
+```
+
+| Attribute | Type | Required | Description |
+| --------------------------------- | ------- | -------- | ----------- |
+| `plan_name` | string | no | Name of the plan to get the limits from. Default: `default`. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/plan_limits"
+```
+
+Example response:
+
+```json
+{
+ "conan_max_file_size": 3221225472,
+ "generic_packages_max_file_size": 5368709120,
+ "maven_max_file_size": 3221225472,
+ "npm_max_file_size": 524288000,
+ "nuget_max_file_size": 524288000,
+ "pypi_max_file_size": 3221225472
+}
+```
+
+## Change plan limits
+
+Modify the limits of a plan on the GitLab instance.
+
+```plaintext
+PUT /application/plan_limits
+```
+
+| Attribute | Type | Required | Description |
+| --------------------------------- | ------- | -------- | ----------- |
+| `plan_name` | string | yes | Name of the plan to update. |
+| `conan_max_file_size` | integer | no | Maximum Conan package file size in bytes. |
+| `generic_packages_max_file_size` | integer | no | Maximum generic package file size in bytes. |
+| `maven_max_file_size` | integer | no | Maximum Maven package file size in bytes. |
+| `npm_max_file_size` | integer | no | Maximum NPM package file size in bytes. |
+| `nuget_max_file_size` | integer | no | Maximum NuGet package file size in bytes. |
+| `pypi_max_file_size` | integer | no | Maximum PyPI package file size in bytes. |
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/plan_limits?plan_name=default&conan_max_file_size=3221225472"
+```
+
+Example response:
+
+```json
+{
+ "conan_max_file_size": 3221225472,
+ "generic_packages_max_file_size": 5368709120,
+ "maven_max_file_size": 3221225472,
+ "npm_max_file_size": 524288000,
+ "nuget_max_file_size": 524288000,
+ "pypi_max_file_size": 3221225472
+}
+```
diff --git a/doc/api/project_badges.md b/doc/api/project_badges.md
index 041f67157f7..58f5b000958 100644
--- a/doc/api/project_badges.md
+++ b/doc/api/project_badges.md
@@ -11,14 +11,14 @@ type: reference, api
## Placeholder tokens
-Badges support placeholders that will be replaced in real time in both the link and image URL. The allowed placeholders are:
+Badges support placeholders that are replaced in real time in both the link and image URL. The allowed placeholders are:
<!-- vale gitlab.Spelling = NO -->
-- **%{project_path}**: will be replaced by the project path.
-- **%{project_id}**: will be replaced by the project ID.
-- **%{default_branch}**: will be replaced by the project default branch.
-- **%{commit_sha}**: will be replaced by the last project's commit SHA.
+- **%{project_path}**: Replaced by the project path.
+- **%{project_id}**: Replaced by the project ID.
+- **%{default_branch}**: Replaced by the project default branch.
+- **%{commit_sha}**: Replaced by the last project's commit SHA.
<!-- vale gitlab.Spelling = YES -->
## List all badges of a project
@@ -162,7 +162,7 @@ Example response:
## Remove a badge from a project
-Removes a badge from a project. Only project's badges will be removed by using this endpoint.
+Removes a badge from a project. Only project badges are removed by using this endpoint.
```plaintext
DELETE /projects/:id/badges/:badge_id
diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md
index cd8adf49f1d..c895a7c4155 100644
--- a/doc/api/project_import_export.md
+++ b/doc/api/project_import_export.md
@@ -50,7 +50,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
```
NOTE:
-The upload request will be sent with `Content-Type: application/gzip` header. Ensure that your pre-signed URL includes this as part of the signature.
+The upload request is sent with `Content-Type: application/gzip` header. Ensure that your pre-signed URL includes this as part of the signature.
## Export status
@@ -138,14 +138,14 @@ POST /projects/import
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `namespace` | integer/string | no | The ID or path of the namespace that the project will be imported to. Defaults to the current user's namespace |
+| `namespace` | integer/string | no | The ID or path of the namespace to import the project to. Defaults to the current user's namespace |
| `name` | string | no | The name of the project to be imported. Defaults to the path of the project if not provided |
| `file` | string | yes | The file to be uploaded |
| `path` | string | yes | Name and path for new project |
-| `overwrite` | boolean | no | If there is a project with the same path the import will overwrite it. Default to false |
+| `overwrite` | boolean | no | If there is a project with the same path the import overwrites it. Default to false |
| `override_params` | Hash | no | Supports all fields defined in the [Project API](projects.md) |
-The override parameters passed will take precedence over all values defined inside the export file.
+The override parameters passed take precedence over all values defined inside the export file.
To upload a file from your file system, use the `--form` argument. This causes
cURL to post data using the header `Content-Type: multipart/form-data`.
@@ -220,7 +220,7 @@ Status can be one of:
- `started`
- `finished`
-If the status is `failed`, it will include the import error message under `import_error`.
+If the status is `failed`, it includes the import error message under `import_error`.
If the status is `failed`, `started` or `finished`, the `failed_relations` array might
be populated with any occurrences of relations that failed to import either due to
unrecoverable errors or because retries were exhausted (a typical example are query timeouts.)
diff --git a/doc/api/project_repository_storage_moves.md b/doc/api/project_repository_storage_moves.md
index be922b441d6..a7fe25d03cd 100644
--- a/doc/api/project_repository_storage_moves.md
+++ b/doc/api/project_repository_storage_moves.md
@@ -211,7 +211,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `project_id` | integer | yes | ID of the project |
-| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected automatically if not provided |
+| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided |
Example request:
@@ -255,7 +255,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `source_storage_name` | string | yes | Name of the source storage shard. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md
index c5adf361fb6..fc8882be283 100644
--- a/doc/api/project_snippets.md
+++ b/doc/api/project_snippets.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Project snippets
+# Project snippets **(FREE)**
## Snippet visibility level
@@ -140,7 +140,7 @@ Parameters:
| `description` | string | no | Description of a snippet |
| `visibility` | string | no | Snippet's [visibility](#snippet-visibility-level) |
| `files` | array of hashes | no | An array of snippet files |
-| `files:action` | string | yes | Type of action to perform on the file, one of: 'create', 'update', 'delete', 'move' |
+| `files:action` | string | yes | Type of action to perform on the file, one of: `create`, `update`, `delete`, `move` |
| `files:file_path` | string | no | File path of the snippet file |
| `files:previous_path` | string | no | Previous path of the snippet file |
| `files:content` | string | no | Content of the snippet file |
diff --git a/doc/api/project_templates.md b/doc/api/project_templates.md
index 6251d31660c..186b6a956a4 100644
--- a/doc/api/project_templates.md
+++ b/doc/api/project_templates.md
@@ -16,7 +16,7 @@ This API is a project-specific version of these endpoints:
- [Issue and merge request templates](../user/project/description_templates.md)
([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37890) in GitLab 13.3)
-It deprecates these endpoints, which will be removed for API version 5.
+It deprecates these endpoints, which are scheduled for removal in API version 5.
In addition to templates common to the entire instance, project-specific
templates are also available from this API endpoint.
@@ -34,7 +34,7 @@ GET /projects/:id/templates/:type
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `type` | string | yes | The type `(dockerfiles|gitignores|gitlab_ci_ymls|licenses|issues|merge_requests)` of the template |
+| `type` | string | yes | The type of the template. Accepted values are: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, `merge_requests` |
Example response (licenses):
@@ -100,7 +100,7 @@ GET /projects/:id/templates/:type/:name
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `type` | string | yes| The type `(dockerfiles|gitignores|gitlab_ci_ymls|licenses|issues|merge_requests)` of the template |
+| `type` | string | yes| The type of the template. One of: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, or `merge_requests`. |
| `name` | string | yes | The key of the template, as obtained from the collection endpoint |
| `source_template_project_id` | integer | no | The project ID where a given template is being stored. This is useful when multiple templates from different projects have the same name. If multiple templates have the same name, the match from `closest ancestor` is returned if `source_template_project_id` is not specified |
| `project` | string | no | The project name to use when expanding placeholders in the template. Only affects licenses |
diff --git a/doc/api/project_vulnerabilities.md b/doc/api/project_vulnerabilities.md
index 1f6a1a58276..969ebe1f9c6 100644
--- a/doc/api/project_vulnerabilities.md
+++ b/doc/api/project_vulnerabilities.md
@@ -18,7 +18,7 @@ Every API call to vulnerabilities must be [authenticated](README.md#authenticati
Vulnerability permissions inherit permissions from their project. If a project is
private, and a user isn't a member of the project to which the vulnerability
-belongs, requests to that project will return a `404 Not Found` status code.
+belongs, requests to that project returns a `404 Not Found` status code.
## Vulnerabilities pagination
@@ -32,7 +32,7 @@ List all of a project's vulnerabilities.
If an authenticated user does not have permission to
[use the Project Security Dashboard](../user/permissions.md#project-members-permissions),
-`GET` requests for vulnerabilities of this project will result in a `403` status code.
+`GET` requests for vulnerabilities of this project result in a `403` status code.
```plaintext
GET /projects/:id/vulnerabilities
@@ -109,7 +109,7 @@ Creates a new vulnerability.
If an authenticated user does not have a permission to
[create a new vulnerability](../user/permissions.md#project-members-permissions),
-this request will result in a `403` status code.
+this request results in a `403` status code.
```plaintext
POST /projects/:id/vulnerabilities?finding_id=<your_finding_id>
@@ -118,7 +118,7 @@ POST /projects/:id/vulnerabilities?finding_id=<your_finding_id>
| Attribute | Type | Required | Description |
| ------------------- | ----------------- | ---------- | -----------------------------------------------------------------------------------------------------------------------------|
| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) which the authenticated user is a member of |
-| `finding_id` | integer or string | yes | The ID of a Vulnerability Finding from which the new Vulnerability will be created |
+| `finding_id` | integer or string | yes | The ID of a Vulnerability Finding to create the new Vulnerability from |
The other attributes of a newly created Vulnerability are populated from
its source Vulnerability Finding, or with these default values:
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 321a95af8b5..46997a1e8ae 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -45,8 +45,8 @@ GET /projects
| `archived` | boolean | **{dotted-circle}** No | Limit by archived status. |
| `id_after` | integer | **{dotted-circle}** No | Limit results to projects with IDs greater than the specified ID. |
| `id_before` | integer | **{dotted-circle}** No | Limit results to projects with IDs less than the specified ID. |
-| `last_activity_after` | datetime | **{dotted-circle}** No | Limit results to projects with last_activity after specified time. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ |
-| `last_activity_before` | datetime | **{dotted-circle}** No | Limit results to projects with last_activity before specified time. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ |
+| `last_activity_after` | datetime | **{dotted-circle}** No | Limit results to projects with last_activity after specified time. Format: ISO 8601 `YYYY-MM-DDTHH:MM:SSZ` |
+| `last_activity_before` | datetime | **{dotted-circle}** No | Limit results to projects with last_activity before specified time. Format: ISO 8601 `YYYY-MM-DDTHH:MM:SSZ` |
| `membership` | boolean | **{dotted-circle}** No | Limit by projects that the current user is a member of. |
| `min_access_level` | integer | **{dotted-circle}** No | Limit by current user minimal [access level](members.md#valid-access-levels). |
| `order_by` | string | **{dotted-circle}** No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. `repository_size`, `storage_size`, `packages_size` or `wiki_size` fields are only allowed for admins. Default is `created_at`. |
@@ -179,6 +179,7 @@ When the user is authenticated and `simple` is not set this returns something li
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -284,6 +285,7 @@ When the user is authenticated and `simple` is not set this returns something li
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -439,6 +441,7 @@ GET /users/:user_id/projects
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -544,6 +547,7 @@ GET /users/:user_id/projects
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -658,6 +662,7 @@ Example response:
"lfs_objects_size": 0,
"job_artifacts_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -758,6 +763,7 @@ Example response:
"lfs_objects_size": 0,
"job_artifacts_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -921,6 +927,7 @@ GET /projects/:id
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -998,6 +1005,23 @@ If the project is a fork, and you provide a valid token to authenticate, the
}
```
+### Templates for issues and merge requests **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55718) in GitLab 13.10.
+
+Users of [GitLab Premium or higher](https://about.gitlab.com/pricing/)
+can also see the `issues_template` and `merge_requests_template` parameters for managing
+[issue and merge request description templates](../user/project/description_templates.md).
+
+```json
+{
+ "id": 3,
+ "issues_template": null,
+ "merge_requests_template": null,
+ ...
+}
+```
+
## Get project users
Get the users list of a project.
@@ -1033,6 +1057,43 @@ GET /projects/:id/users
]
```
+## List a project's groups
+
+Get a list of ancestor groups for this project.
+
+```plaintext
+GET /projects/:id/groups
+```
+
+| Attribute | Type | Required | Description |
+|-----------------------------|-------------------|------------------------|-------------|
+| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `search` | string | **{dotted-circle}** No | Search for specific groups. |
+| `skip_groups` | array of integers | **{dotted-circle}** No | Skip the group IDs passed. |
+| `with_shared` | boolean | **{dotted-circle}** No | Include projects shared with this group. Default is `false`. |
+| `shared_min_access_level` | integer | **{dotted-circle}** No | Limit to shared groups with at least this [access level](members.md#valid-access-levels). |
+
+```json
+[
+ {
+ "id": 1,
+ "name": "Foobar Group",
+ "avatar_url": "http://localhost:3000/uploads/group/avatar/1/foo.jpg",
+ "web_url": "http://localhost:3000/groups/foo-bar",
+ "full_name": "Foobar Group",
+ "full_path": "foo-bar",
+ },
+ {
+ "id": 2,
+ "name": "Shared Group",
+ "avatar_url": "http://gitlab.example.com/uploads/group/avatar/1/bar.jpg",
+ "web_url": "http://gitlab.example.com/groups/foo/bar",
+ "full_name": "Shared Group",
+ "full_path": "foo/shared",
+ }
+]
+```
+
## Get project events
Refer to the [Events API documentation](events.md#list-a-projects-visible-events).
@@ -1052,7 +1113,7 @@ POST /projects
| Attribute | Type | Required | Description |
|-------------------------------------------------------------|---------|------------------------|-------------|
| `allow_merge_on_skipped_pipeline` | boolean | **{dotted-circle}** No | Set whether or not merge requests can be merged with skipped jobs. |
-| `analytics_access_level` | string | no | One of `disabled`, `private` or `enabled` |
+| `analytics_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private` or `enabled` |
| `approvals_before_merge` **(PREMIUM)** | integer | **{dotted-circle}** No | How many approvers should approve merge requests by default. |
| `auto_cancel_pending_pipelines` | string | **{dotted-circle}** No | Auto-cancel pending pipelines. This isn't a boolean, but enabled/disabled. |
| `auto_devops_deploy_strategy` | string | **{dotted-circle}** No | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`). |
@@ -1061,7 +1122,7 @@ POST /projects
| `avatar` | mixed | **{dotted-circle}** No | Image file for avatar of the project. |
| `build_coverage_regex` | string | **{dotted-circle}** No | Test coverage parsing. |
| `build_git_strategy` | string | **{dotted-circle}** No | The Git strategy. Defaults to `fetch`. |
-| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time in minutes that a job is able run (in seconds). |
+| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time, in seconds, that a job can run. |
| `builds_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `ci_config_path` | string | **{dotted-circle}** No | The path to CI configuration file. |
| `container_expiration_policy_attributes` | hash | **{dotted-circle}** No | Update the image cleanup policy for this project. Accepts: `cadence` (string), `keep_n` (integer), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean). |
@@ -1126,7 +1187,7 @@ POST /projects/user/:user_id
| Attribute | Type | Required | Description |
|-------------------------------------------------------------|---------|------------------------|-------------|
| `allow_merge_on_skipped_pipeline` | boolean | **{dotted-circle}** No | Set whether or not merge requests can be merged with skipped jobs. |
-| `analytics_access_level` | string | no | One of `disabled`, `private` or `enabled` |
+| `analytics_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private` or `enabled` |
| `approvals_before_merge` **(PREMIUM)** | integer | **{dotted-circle}** No | How many approvers should approve merge requests by default. |
| `auto_cancel_pending_pipelines` | string | **{dotted-circle}** No | Auto-cancel pending pipelines. This isn't a boolean, but enabled/disabled. |
| `auto_devops_deploy_strategy` | string | **{dotted-circle}** No | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`). |
@@ -1199,7 +1260,7 @@ PUT /projects/:id
| Attribute | Type | Required | Description |
|-------------------------------------------------------------|----------------|------------------------|-------------|
| `allow_merge_on_skipped_pipeline` | boolean | **{dotted-circle}** No | Set whether or not merge requests can be merged with skipped jobs. |
-| `analytics_access_level` | string | no | One of `disabled`, `private` or `enabled` |
+| `analytics_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private` or `enabled` |
| `approvals_before_merge` **(PREMIUM)** | integer | **{dotted-circle}** No | How many approvers should approve merge request by default. |
| `auto_cancel_pending_pipelines` | string | **{dotted-circle}** No | Auto-cancel pending pipelines. This isn't a boolean, but enabled/disabled. |
| `auto_devops_deploy_strategy` | string | **{dotted-circle}** No | Auto Deploy strategy (`continuous`, `manual`, or `timed_incremental`). |
@@ -1259,6 +1320,8 @@ PUT /projects/:id
| `visibility` | string | **{dotted-circle}** No | See [project visibility level](#project-visibility-level). |
| `wiki_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `wiki_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable wiki for this project. Use `wiki_access_level` instead. |
+| `issues_template` **(PREMIUM)** | string | **{dotted-circle}** No | Default description for Issues. Description is parsed with GitLab Flavored Markdown. See [Templates for issues and merge requests](#templates-for-issues-and-merge-requests). |
+| `merge_requests_template` **(PREMIUM)** | string | **{dotted-circle}** No | Default description for Merge Requests. Description is parsed with GitLab Flavored Markdown. See [Templates for issues and merge requests](#templates-for-issues-and-merge-requests). |
## Fork project
@@ -1373,6 +1436,7 @@ Example responses:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1467,6 +1531,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1559,6 +1624,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1745,6 +1811,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1858,6 +1925,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1878,7 +1946,7 @@ This endpoint:
merge requests).
- From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) on
[Premium or higher](https://about.gitlab.com/pricing/) tiers, group
- admins can [configure](../user/group/index.md#enabling-delayed-project-removal)
+ admins can [configure](../user/group/index.md#enable-delayed-project-removal)
projects within a group to be deleted after a delayed period. When enabled,
actual deletion happens after the number of days specified in the
[default deletion delay](../user/admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
@@ -1886,7 +1954,7 @@ This endpoint:
WARNING:
The default behavior of [Delayed Project deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/32935)
in GitLab 12.6 was changed to [Immediate deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/220382)
-in GitLab 13.2, as discussed in [Enabling delayed project removal](../user/group/index.md#enabling-delayed-project-removal).
+in GitLab 13.2, as discussed in [Enable delayed project removal](../user/group/index.md#enable-delayed-project-removal).
```plaintext
DELETE /projects/:id
@@ -2354,6 +2422,7 @@ Example response:
"avatar_url": null,
"web_url": "https://gitlab.example.com/groups/cute-cats"
},
+ "container_registry_image_prefix": "registry.example.com/cute-cats/hello-world",
"_links": {
"self": "https://gitlab.example.com/api/v4/projects/7",
"issues": "https://gitlab.example.com/api/v4/projects/7/issues",
@@ -2471,12 +2540,6 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
Read more in the [Project Badges](project_badges.md) documentation.
-## Issue and merge request description templates
-
-The non-default [issue and merge request description templates](../user/project/description_templates.md)
-are managed inside the project's repository. So you can manage them with the API
-through the [Repositories API](repositories.md) and the [Repository Files API](repository_files.md).
-
## Download snapshot of a Git repository
> Introduced in GitLab 10.7
diff --git a/doc/api/protected_branches.md b/doc/api/protected_branches.md
index 12ba40d5df5..e5560360532 100644
--- a/doc/api/protected_branches.md
+++ b/doc/api/protected_branches.md
@@ -56,7 +56,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
},
...
]
@@ -88,7 +89,8 @@ Example response:
"access_level_description": "Example Merge Group"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
},
...
]
@@ -129,7 +131,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -158,7 +161,8 @@ Example response:
"access_level_description": "Example Merge Group"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -182,6 +186,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
| `push_access_level` | string | no | Access levels allowed to push (defaults: `40`, maintainer access level) |
| `merge_access_level` | string | no | Access levels allowed to merge (defaults: `40`, maintainer access level) |
| `unprotect_access_level` | string | no | Access levels allowed to unprotect (defaults: `40`, maintainer access level) |
+| `allow_force_push` | boolean | no | Allow force push for all users with push access. (defaults: false) |
| `allowed_to_push` | array | no | **(PREMIUM)** Array of access levels allowed to push, with each described by a hash |
| `allowed_to_merge` | array | no | **(PREMIUM)** Array of access levels allowed to merge, with each described by a hash |
| `allowed_to_unprotect` | array | no | **(PREMIUM)** Array of access levels allowed to unprotect, with each described by a hash |
@@ -211,7 +216,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -248,7 +254,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -291,7 +298,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -354,6 +362,7 @@ Example response:
"group_id": null
}
],
+ "allow_force_push":false,
"code_owner_approval_required": false
}
```
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index be9512ed0e0..67e441ee7e4 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -350,7 +350,7 @@ Example response:
## Create a release
-Create a Release. You need push access to the repository to create a Release.
+Create a release. Developer level access to the project is required to create a release.
```plaintext
POST /projects/:id/releases
@@ -524,7 +524,7 @@ Example response:
## Update a release
-Update a Release.
+Update a release. Developer level access to the project is required to update a release.
```plaintext
PUT /projects/:id/releases/:tag_name
@@ -631,7 +631,7 @@ Example response:
## Delete a Release
-Delete a Release. Deleting a Release doesn't delete the associated tag.
+Delete a release. Deleting a release doesn't delete the associated tag. Maintainer level access to the project is required to delete a release.
```plaintext
DELETE /projects/:id/releases/:tag_name
diff --git a/doc/api/remote_mirrors.md b/doc/api/remote_mirrors.md
index 638d4a3b917..c85454d66ee 100644
--- a/doc/api/remote_mirrors.md
+++ b/doc/api/remote_mirrors.md
@@ -48,14 +48,14 @@ Example response:
```
NOTE:
-For security reasons, the `url` attribute will always be scrubbed of username
+For security reasons, the `url` attribute is always scrubbed of username
and password information.
## Create a remote mirror
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24189) in GitLab 12.9.
-Create a remote mirror for a project. The mirror will be disabled by default. You can enable it by including the optional parameter `enabled` when creating it:
+Create a remote mirror for a project. The mirror is disabled by default. You can enable it by including the optional parameter `enabled` when creating it:
```plaintext
POST /projects/:id/remote_mirrors
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index b0b3160e075..50dc0803646 100644
--- a/doc/api/repositories.md
+++ b/doc/api/repositories.md
@@ -285,8 +285,8 @@ Example response:
Generate changelog data based on commits in a repository.
-Given a version (using semantic versioning) and a range of commits,
-GitLab generates a changelog for all commits that use a particular
+Given a version (using [semantic versioning](https://semver.org/)) and a range
+of commits, GitLab generates a changelog for all commits that use a particular
[Git trailer](https://git-scm.com/docs/git-interpret-trailers).
The output of this process is a new section in a changelog file in the Git
@@ -303,7 +303,7 @@ Supported attributes:
| :-------- | :------- | :--------- | :---------- |
| `version` | string | yes | The version to generate the changelog for. The format must follow [semantic versioning](https://semver.org/). |
| `from` | string | no | The start of the range of commits (as a SHA) to use for generating the changelog. This commit itself isn't included in the list. |
-| `to` | string | yes | The end of the range of commits (as a SHA) to use for the changelog. This commit _is_ included in the list. |
+| `to` | string | no | The end of the range of commits (as a SHA) to use for the changelog. This commit _is_ included in the list. Defaults to the branch specified in the `branch` attribute. |
| `date` | datetime | no | The date and time of the release, defaults to the current time. |
| `branch` | string | no | The branch to commit the changelog changes to, defaults to the project's default branch. |
| `trailer` | string | no | The Git trailer to use for including commits, defaults to `Changelog`. |
@@ -311,28 +311,72 @@ Supported attributes:
| `message` | string | no | The commit message to produce when committing the changes, defaults to `Add changelog for version X` where X is the value of the `version` argument. |
If the `from` attribute is unspecified, GitLab uses the Git tag of the last
-version that came before the version specified in the `version` attribute. For
-this to work, your project must create Git tags for versions using the
-following format:
+stable version that came before the version specified in the `version`
+attribute. For this to work, your project must create Git tags for versions
+using one of the following formats:
-```plaintext
-vX.Y.Z
-```
+- `vX.Y.Z`
+- `X.Y.Z`
-Where `X.Y.Z` is a version that follows semantic versioning. For example,
-consider a project with the following tags:
+Where `X.Y.Z` is a version that follows [semantic
+versioning](https://semver.org/). For example, consider a project with the
+following tags:
+- v1.0.0-pre1
- v1.0.0
- v1.1.0
- v2.0.0
If the `version` attribute is `2.1.0`, GitLab uses tag v2.0.0. And when the
-version is `1.1.1`, or `1.2.0`, GitLab uses tag v1.1.0.
+version is `1.1.1`, or `1.2.0`, GitLab uses tag v1.1.0. The tag `v1.0.0-pre1` is
+never used, because pre-release tags are ignored.
If `from` is unspecified and no tag to use is found, the API produces an error.
To solve such an error, you must explicitly specify a value for the `from`
attribute.
+### Examples
+
+These examples use [cURL](https://curl.se/) to perform HTTP requests.
+The example commands use these values:
+
+- **Project ID**: 42
+- **Location**: hosted on GitLab.com
+- **Example API token**: `token`
+
+This command generates a changelog for version `1.0.0`.
+
+The commit range:
+
+- Starts with the tag of the last release.
+- Ends with the last commit on the target branch. The default target branch is the project's default branch.
+
+If the last tag is `v0.9.0` and the default branch is `main`, the range of commits
+included in this example is `v0.9.0..main`:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
+To generate the data on a different branch, specify the `branch` parameter. This
+command generates data from the `foo` branch:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0&branch=foo" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
+To use a different trailer, use the `trailer` parameter:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0&trailer=Type" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
+To store the results in a different file, use the `file` parameter:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0&file=NEWS" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
### How it works
Changelogs are generated based on commit titles. Commits are only included if
@@ -351,6 +395,26 @@ these as the changelog entries. You can enrich entries with additional data,
such as a link to the merge request or details about the commit author. You can
[customize the format of a changelog](#customize-the-changelog-output) section with a template.
+### Reverted commits
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55537) in GitLab 13.10.
+
+When generating a changelog for a range, GitLab ignores commits both added and
+reverted in that range. Revert commits themselves _are_ included if they use the
+Git trailer used for generating changelogs.
+
+Imagine the following scenario: you have three commits: A, B, and C. To generate
+changelogs, you use the default trailer `Changelog`. Both A and B use this
+trailer. Commit C is a commit that reverts commit B. When generating a changelog
+for this range, GitLab only includes commit A.
+
+Revert commits are detected by looking for commits where the message contains
+the pattern `This reverts commit SHA`, where `SHA` is the SHA of the commit that
+is reverted.
+
+If a revert commit includes the trailer used for generating changelogs
+(`Changelog` in the above example), the revert commit itself _is_ included.
+
### Customize the changelog output
The output is customized using a YAML configuration file stored in your
diff --git a/doc/api/repository_files.md b/doc/api/repository_files.md
index 19684b4ac0e..58559fe9a5f 100644
--- a/doc/api/repository_files.md
+++ b/doc/api/repository_files.md
@@ -203,7 +203,7 @@ Parameters:
- `file_path` (required) - URL encoded full path to new file. Ex. lib%2Fclass%2Erb
- `branch` (required) - Name of the branch
- `start_branch` (optional) - Name of the branch to start the new commit from
-- `encoding` (optional) - Change encoding to 'base64'. Default is text.
+- `encoding` (optional) - Change encoding to `base64`. Default is `text`.
- `author_email` (optional) - Specify the commit author's email address
- `author_name` (optional) - Specify the commit author's name
- `content` (required) - File content
@@ -238,7 +238,7 @@ Parameters:
- `file_path` (required) - URL encoded full path to new file. Ex. lib%2Fclass%2Erb
- `branch` (required) - Name of the branch
- `start_branch` (optional) - Name of the branch to start the new commit from
-- `encoding` (optional) - Change encoding to 'base64'. Default is text.
+- `encoding` (optional) - Change encoding to `base64`. Default is `text`.
- `author_email` (optional) - Specify the commit author's email address
- `author_name` (optional) - Specify the commit author's name
- `content` (required) - New file content
diff --git a/doc/api/repository_submodules.md b/doc/api/repository_submodules.md
index c014bb44861..1d7ca903fee 100644
--- a/doc/api/repository_submodules.md
+++ b/doc/api/repository_submodules.md
@@ -26,7 +26,7 @@ PUT /projects/:id/repository/submodules/:submodule
| `submodule` | string | yes | URL-encoded full path to the submodule. For example, `lib%2Fclass%2Erb` |
| `branch` | string | yes | Name of the branch to commit into |
| `commit_sha` | string | yes | Full commit SHA to update the submodule to |
-| `commit_message` | string | no | Commit message. If no message is provided, a default one will be set |
+| `commit_message` | string | no | Commit message. If no message is provided, a default is set |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/repository/submodules/lib%2Fmodules%2Fexample" \
diff --git a/doc/api/resource_access_tokens.md b/doc/api/resource_access_tokens.md
index 50f5ea73634..2b6400a6f0d 100644
--- a/doc/api/resource_access_tokens.md
+++ b/doc/api/resource_access_tokens.md
@@ -78,7 +78,8 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"created_at" : "2021-01-21T19:35:37.921Z",
"user_id" : 166,
"id" : 58,
- "expires_at" : "2021-01-31"
+ "expires_at" : "2021-01-31",
+ "token" : "D4y...Wzr"
}
```
diff --git a/doc/api/search.md b/doc/api/search.md
index 9e1407fdffd..c8f24c0924a 100644
--- a/doc/api/search.md
+++ b/doc/api/search.md
@@ -12,7 +12,7 @@ type: reference, api
Every API call to search must be authenticated.
-## Global Search API
+## Advanced Search API
Search globally across the GitLab instance.
@@ -26,8 +26,8 @@ GET /search
| `search` | string | yes | The search query |
| `state` | string | no | Filter by state. Issues and merge requests are supported; it is ignored for other scopes. |
| `confidential` | boolean | no | Filter by confidentiality. Issues scope is supported; it is ignored for other scopes. |
-| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
-| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
Search the expression within the specified scope. Currently these scopes are supported: projects, issues, merge_requests, milestones, snippet_titles, users.
@@ -295,7 +295,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: commits **(PREMIUM)**
@@ -371,7 +371,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the file name and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: notes **(PREMIUM)**
@@ -434,7 +434,7 @@ Example response:
Search within the specified group.
-If a user is not a member of a group and the group is private, a `GET` request on that group will result to a `404` status code.
+If a user is not a member of a group and the group is private, a `GET` request on that group results in a `404` status code.
```plaintext
GET /groups/:id/search
@@ -447,8 +447,8 @@ GET /groups/:id/search
| `search` | string | yes | The search query |
| `state` | string | no | Filter by state. Issues and merge requests are supported; it is ignored for other scopes. |
| `confidential` | boolean | no | Filter by confidentiality. Issues scope is supported; it is ignored for other scopes. |
-| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
-| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
Search the expression within the specified scope. Currently these scopes are supported: projects, issues, merge_requests, milestones, users.
@@ -685,7 +685,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: commits **(PREMIUM)**
@@ -761,7 +761,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the file name and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: notes **(PREMIUM)**
@@ -824,7 +824,7 @@ Example response:
Search within the specified project.
-If a user is not a member of a project and the project is private, a `GET` request on that project will result to a `404` status code.
+If a user is not a member of a project and the project is private, a `GET` request on that project results in a `404` status code.
```plaintext
GET /projects/:id/search
@@ -838,8 +838,8 @@ GET /projects/:id/search
| `ref` | string | no | The name of a repository branch or tag to search on. The project's default branch is used by default. This is only applicable for scopes: commits, blobs, and wiki_blobs. |
| `state` | string | no | Filter by state. Issues and merge requests are supported; it is ignored for other scopes. |
| `confidential` | boolean | no | Filter by confidentiality. Issues scope is supported; it is ignored for other scopes. |
-| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
-| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
Search the expression within the specified scope. Currently these scopes are supported: issues, merge_requests, milestones, notes, wiki_blobs, commits, blobs, users.
@@ -1096,7 +1096,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` are intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: commits **(PREMIUM)**
@@ -1178,7 +1178,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: users
diff --git a/doc/api/services.md b/doc/api/services.md
index 16431937c7a..765f459e704 100644
--- a/doc/api/services.md
+++ b/doc/api/services.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Services API
+# Services API **(FREE)**
NOTE:
This API requires an access token with Maintainer or Owner permissions
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 2fd58917aad..91cbbeaf50a 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -305,8 +305,10 @@ listed in the descriptions of the relevant settings.
| `housekeeping_incremental_repack_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which an incremental `git repack` is run. |
| `html_emails_enabled` | boolean | no | Enable HTML emails. |
| `import_sources` | array of strings | no | Sources to allow project import from, possible values: `github`, `bitbucket`, `bitbucket_server`, `gitlab`, `fogbugz`, `git`, `gitlab_project`, `gitea`, `manifest`, and `phabricator`. |
+| `in_product_marketing_emails_enabled` | boolean | no | Enable in-product marketing emails. Enabled by default. |
| `invisible_captcha_enabled` | boolean | no | <!-- vale gitlab.Spelling = NO --> Enable Invisible Captcha <!-- vale gitlab.Spelling = YES --> spam detection during sign-up. Disabled by default. |
| `issues_create_limit` | integer | no | Max number of issue creation requests per minute per user. Disabled by default.|
+| `keep_latest_artifact` | boolean | no | Prevent the deletion of the artifacts from the most recent successful jobs, regardless of the expiry time. Enabled by default. |
| `local_markdown_version` | integer | no | Increase this value when any cached Markdown should be invalidated. |
| `maintenance_mode_message` | string | no | **(PREMIUM)** Message displayed when instance is in maintenance mode |
| `maintenance_mode` | boolean | no | **(PREMIUM)** When instance is in maintenance mode, non-administrative users can sign in with read-only access and make read-only API requests |
@@ -334,7 +336,7 @@ listed in the descriptions of the relevant settings.
| `polling_interval_multiplier` | decimal | no | Interval multiplier used by endpoints that perform polling. Set to `0` to disable polling. |
| `project_export_enabled` | boolean | no | Enable project export. |
| `prometheus_metrics_enabled` | boolean | no | Enable Prometheus metrics. |
-| `protected_ci_variables` | boolean | no | Environment variables are protected by default. |
+| `protected_ci_variables` | boolean | no | CI/CD variables are protected by default. |
| `pseudonymizer_enabled` | boolean | no | **(PREMIUM)** When enabled, GitLab runs a background job that produces pseudonymized CSVs of the GitLab database to upload to your configured object storage directory.
| `push_event_activities_limit` | integer | no | Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push events are created. [Bulk push events are created](../user/admin_area/settings/push_event_activities_limit.md) if it surpasses that value. |
| `push_event_hooks_limit` | integer | no | Number of changes (branches or tags) in a single push to determine whether webhooks and services fire or not. Webhooks and services aren't submitted if it surpasses that value. |
@@ -398,3 +400,8 @@ listed in the descriptions of the relevant settings.
| `version_check_enabled` | boolean | no | Let GitLab inform you when an update is available. |
| `web_ide_clientside_preview_enabled` | boolean | no | Live Preview (allow live previews of JavaScript projects in the Web IDE using CodeSandbox Live Preview). |
| `wiki_page_max_content_bytes` | integer | no | Maximum wiki page content size in **bytes**. Default: 52428800 Bytes (50 MB). The minimum value is 1024 bytes. |
+
+### Package Registry: Package file size limits
+
+The package file size limits are not part of the Application settings API.
+Instead, these settings can be accessed using the [Plan limits API](plan_limits.md).
diff --git a/doc/api/snippet_repository_storage_moves.md b/doc/api/snippet_repository_storage_moves.md
index 393ca30c28d..80037dd7aa3 100644
--- a/doc/api/snippet_repository_storage_moves.md
+++ b/doc/api/snippet_repository_storage_moves.md
@@ -225,7 +225,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `snippet_id` | integer | yes | ID of the snippet. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
@@ -274,7 +274,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `source_storage_name` | string | yes | Name of the source storage shard. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
diff --git a/doc/api/snippets.md b/doc/api/snippets.md
index 670045df66d..629dfebbefc 100644
--- a/doc/api/snippets.md
+++ b/doc/api/snippets.md
@@ -5,11 +5,13 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Snippets API
+# Snippets API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6373) in GitLab 8.15.
-Snippets API operates on [snippets](../user/snippets.md).
+Snippets API operates on [snippets](../user/snippets.md). Related APIs exist for
+[project snippets](project_snippets.md) and
+[moving snippets between storages](snippet_repository_storage_moves.md).
## Snippet visibility level
@@ -230,7 +232,7 @@ curl --request POST "https://gitlab.example.com/api/v4/snippets" \
"content": "Hello world",
"file_path": "test.txt"
}
- ]
+ ]
}
```
@@ -289,14 +291,12 @@ Parameters:
| `content` | string | no | Deprecated: Use `files` instead. Content of a snippet |
| `description` | string | no | Description of a snippet |
| `visibility` | string | no | Snippet's [visibility](#snippet-visibility-level) |
-| `files` | array of hashes | no | An array of snippet files |
-| `files:action` | string | yes | Type of action to perform on the file, one of: 'create', 'update', 'delete', 'move' |
+| `files` | array of hashes | sometimes | An array of snippet files. Required when updating snippets with multiple files. |
+| `files:action` | string | yes | Type of action to perform on the file, one of: `create`, `update`, `delete`, `move` |
| `files:file_path` | string | no | File path of the snippet file |
| `files:previous_path` | string | no | Previous path of the snippet file |
| `files:content` | string | no | Content of the snippet file |
-Updates to snippets with multiple files *must* use the `files` attribute.
-
Example request:
```shell
diff --git a/doc/api/tags.md b/doc/api/tags.md
index eef4504aa5b..3ac4e8bb6ab 100644
--- a/doc/api/tags.md
+++ b/doc/api/tags.md
@@ -160,11 +160,10 @@ Example response:
}
```
-The message will be `null` when creating a lightweight tag otherwise
-it will contain the annotation.
+The message is `null` when creating a lightweight tag. Otherwise, it contains the annotation.
-The target will contain the tag objects ID when creating annotated tags,
-otherwise it will contain the commit ID when creating lightweight tags.
+The target contains the tag objects ID when creating annotated tags,
+otherwise it contains the commit ID when creating lightweight tags.
In case of an error,
status code `405` with an explaining error message is returned.
diff --git a/doc/api/users.md b/doc/api/users.md
index 76b0bb3491c..b8917f3e215 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -53,6 +53,9 @@ For example:
GET /users?username=jack_smith
```
+NOTE:
+Username search is case insensitive.
+
In addition, you can filter users based on the states `blocked` and `active`.
It does not support `active=false` or `blocked=false`. The list of billable users
is the total number of users minus the blocked users.
@@ -65,17 +68,33 @@ GET /users?active=true
GET /users?blocked=true
```
+In addition, you can search for external users only with `external=true`.
+It does not support `external=false`.
+
+```plaintext
+GET /users?external=true
+```
+
GitLab supports bot users such as the [alert bot](../operations/incident_management/integrations.md)
or the [support bot](../user/project/service_desk.md#support-bot-user).
-To exclude these users from the users' list, you can use the parameter `exclude_internal=true`
+You can exclude the following types of [internal users](../development/internal_users.md#internal-users)
+from the users' list, with the `exclude_internal=true` parameter,
([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241144) in GitLab 13.4).
+- Alert bot
+- Support bot
+
+However, this action does not exclude [project bot users](../user/project/settings/project_access_tokens.md#project-bot-users).
+
```plaintext
GET /users?exclude_internal=true
```
-NOTE:
-Username search is case insensitive.
+In addition, to exclude external users from the users' list, you can use the parameter `exclude_external=true`.
+
+```plaintext
+GET /users?exclude_external=true
+```
### For admins
@@ -217,10 +236,6 @@ For example:
GET /users?extern_uid=1234567&provider=github
```
-Instance administrators can search for users who are external with: `/users?external=true`
-
-You cannot search for external users if you are not an instance administrator.
-
You can search users by creation date time range with:
```plaintext
@@ -433,6 +448,7 @@ Parameters:
| `theme_id` | No | The GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | Yes | Username |
+| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
| `website_url` | No | Website URL |
## User modification
@@ -474,6 +490,7 @@ Parameters:
| `theme_id` | No | The GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | No | Username |
+| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
| `website_url` | No | Website URL |
On password update, the user is forced to change it upon next login.
diff --git a/doc/api/vulnerability_findings.md b/doc/api/vulnerability_findings.md
index 95e4774ae96..4144a912617 100644
--- a/doc/api/vulnerability_findings.md
+++ b/doc/api/vulnerability_findings.md
@@ -49,7 +49,6 @@ GET /projects/:id/vulnerability_findings?scope=all
GET /projects/:id/vulnerability_findings?scope=dismissed
GET /projects/:id/vulnerability_findings?severity=high
GET /projects/:id/vulnerability_findings?confidence=unknown,experimental
-GET /projects/:id/vulnerability_findings?scanner=bandit,find_sec_bugs
GET /projects/:id/vulnerability_findings?pipeline_id=42
```
@@ -63,7 +62,6 @@ Beginning with GitLab 12.9, the `undefined` severity and confidence level is no
| `scope` | string | no | Returns vulnerability findings for the given scope: `all` or `dismissed`. Defaults to `dismissed`. |
| `severity` | string array | no | Returns vulnerability findings belonging to specified severity level: `info`, `unknown`, `low`, `medium`, `high`, or `critical`. Defaults to all. |
| `confidence` | string array | no | Returns vulnerability findings belonging to specified confidence level: `ignore`, `unknown`, `experimental`, `low`, `medium`, `high`, or `confirmed`. Defaults to all. |
-| `scanner` | string array | no | Returns vulnerability findings detected by specified scanner.
| `pipeline_id` | integer/string | no | Returns vulnerability findings belonging to specified pipeline. |
```shell
diff --git a/doc/api/wikis.md b/doc/api/wikis.md
index 43587da9473..1b8d091e3fd 100644
--- a/doc/api/wikis.md
+++ b/doc/api/wikis.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Project wikis API
+# Project wikis API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13372) in GitLab 10.0.
diff --git a/doc/architecture/blueprints/container_registry_metadata_database/index.md b/doc/architecture/blueprints/container_registry_metadata_database/index.md
new file mode 100644
index 00000000000..f9b59ec92f9
--- /dev/null
+++ b/doc/architecture/blueprints/container_registry_metadata_database/index.md
@@ -0,0 +1,359 @@
+---
+stage: package
+group: package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+comments: false
+description: 'Container Registry metadata database'
+---
+
+# Container Registry Metadata Database
+
+## Usage of the GitLab Container Registry
+
+With the [Container Registry](https://gitlab.com/gitlab-org/container-registry) integrated into GitLab, every GitLab project can have its own space to store its Docker images. You can use the registry to build, push and share images using the Docker client, CI/CD or the GitLab API.
+
+Each day on GitLab.com, between [150k and 200k images are pushed to the registry](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9620193&udv=0), generating about [700k API events](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=7601761&udv=0). It’s also worth noting that although some customers use other registry vendors, [more than 96% of instances](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9832282&udv=0) are using the GitLab Container Registry.
+
+For GitLab.com and for GitLab customers, the Container Registry is a critical component to building and deploying software.
+
+## Current Architecture
+
+The Container Registry is a single [Go](https://golang.org/) application. Its only dependency is the storage backend on which images and metadata are stored.
+
+```mermaid
+graph LR
+ C((Client)) -- HTTP request --> R(Container Registry) -- Upload/download blobs --> B(Storage Backend)
+ R -- Write/read metadata --> B
+```
+
+Client applications (e.g. GitLab Rails and Docker CLI) interact with the Container Registry through its [HTTP API](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md). The most common operations are pushing and pulling images to/from the registry, which require a series of HTTP requests in a specific order. The request flow for these operations is detailed [here](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/push-pull-request-flow.md).
+
+The registry supports multiple [storage backends](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#storage), including Google Cloud Storage (GCS) which is used for the GitLab.com registry. In the storage backend, images are stored as blobs, deduplicated, and shared across repositories. These are then linked (like a symlink) to each repository that relies on them, giving them access to the central storage location.
+
+The name and hierarchy of repositories, as well as image manifests and tags are also stored in the storage backend, represented by a nested structure of folders and files. [This video](https://www.youtube.com/watch?v=i5mbF2bgWoM&feature=youtu.be) gives a practical overview of the registry storage structure.
+
+### Clients
+
+The Container Registry has two main clients: the GitLab Rails application and the Docker client/CLI.
+
+#### Docker
+
+The Docker client (`docker` CLI) interacts with the GitLab Container Registry mainly using the [login](https://docs.docker.com/engine/reference/commandline/login/), [push](https://docs.docker.com/engine/reference/commandline/push/) and [pull](https://docs.docker.com/engine/reference/commandline/pull/) commands.
+
+##### Login and Authentication
+
+GitLab Rails is the default token-based authentication provider for the GitLab Container Registry.
+
+Once the registry receives a request sent by an unauthenticated Docker client, it will reply with `401 Unauthorized` and instruct the client to obtain a token from the GitLab Rails API. The Docker client will then request a Bearer token and embed it in the `Authorization` header of all requests. The registry is responsible for determining if the user is authentication/authorized to perform those requests based on the provided token.
+
+```mermaid
+sequenceDiagram
+ participant C as Docker client
+ participant R as GitLab Container Registry
+ participant G as GitLab Rails
+
+ C->>R: docker login gitlab.example.com
+ R->>C: 401 Unauthorized
+ Note left of R: The response includes the realm (e.g., https://gitlab.example.com/jwt/auth)<br> from where a token should be obtained
+ C->>G: Obtain Bearer token
+ G->>C: 200 OK
+ C-->>R: Push/pull requests
+ Note right of C: Bearer token included in the Authorization header
+```
+
+Please refer to the [Docker documentation](https://docs.docker.com/registry/spec/auth/token/) for more details.
+
+##### Push and Pull
+
+Push and pull commands are used to upload and download images, more precisely manifests and blobs. The push/pull flow is described in the [documentation](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/push-pull-request-flow.md).
+
+#### GitLab Rails
+
+GitLab Rails interacts with the registry through the HTTP API and consumes its webhook notifications.
+
+##### From GitLab Rails to Registry
+
+The single entrypoint for the registry is the [HTTP API](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md). GitLab Rails invokes the API to perform all operations, which include:
+
+| Operation | UI | Background | Observations |
+| ------------------------------------------------------------ | ------------------ | ------------------------ | ------------------------------------------------------------ |
+| [Check API version](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#api-version-check) | :heavy_check_mark: | :heavy_check_mark: | Used globally to ensure that the registry supports the Docker Distribution V2 API, as well as for identifying whether GitLab Rails is talking to the GitLab Container Registry or a third-party one (used to toggle features only available in the former). |
+| [List repository tags](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#listing-image-tags) | :heavy_check_mark: | :heavy_check_mark: | Used to list and show tags in the UI. Used to list tags in the background for [cleanup policies](../../../user/packages/container_registry/#cleanup-policy) and [Geo replication](../../../administration/geo/replication/docker_registry.md). |
+| [Check if manifest exists](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#existing-manifests) | :heavy_check_mark: | :heavy_multiplication_x: | Used to get the digest of a manifest by tag. This is then used to pull the manifest and show the tag details in the UI. |
+| [Pull manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pulling-an-image-manifest) | :heavy_check_mark: | :heavy_multiplication_x: | Used to show the image size and the manifest digest in the tag details UI. |
+| [Pull blob](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pulling-a-layer) | :heavy_check_mark: | :heavy_multiplication_x: | Used to show the configuration digest and the creation date in the tag details UI. |
+| [Delete tag](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#deleting-a-tag) | :heavy_check_mark: | :heavy_check_mark: | Used to delete a tag from the UI and in background (cleanup policies). |
+
+A valid authentication token is generated in GitLab Rails and embedded in all these requests before sending them to the registry.
+
+##### From Registry to GitLab Rails
+
+The registry supports [webhook notifications](https://docs.docker.com/registry/notifications/) to notify external applications when an event occurs, such as an image push.
+
+For GitLab, the registry is currently [configured](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#notifications) to deliver notifications for image push events to the GitLab Rails API. These notifications are currently used for Snowplow metrics and Geo replication.
+
+### Challenges
+
+#### Garbage Collection
+
+The container registry relies on an offline *mark* and *sweep* garbage collection (GC) algorithm. To run it, the registry needs to be either shutdown or set to read-only, remaining like that during the whole GC run.
+
+During the *mark* phase, the registry analyzes all repositories, creating a list of configurations, layers, and manifests that are referenced/linked in each one of them. The registry will then list all existing configurations, layers, and manifests (stored centrally) and obtain a list of those that are not referenced/linked in any repository. This is the list of blobs eligible for deletion.
+
+With the output from the *mark* phase in hand, the registry starts the *sweep* phase, where it will loop over all blobs identified as eligible for deletion and delete them from the storage backend, one by one.
+
+Doing this for a huge registry may require multiple hours/days to complete, during which the registry must remain in read-only mode. This is not feasible for platforms with tight availability requirements, such as GitLab.com.
+
+This limitation is also described in the upstream [Docker Distribution documentation](https://github.com/docker/distribution/blob/749f6afb4572201e3c37325d0ffedb6f32be8950/ROADMAP.md#deletes).
+
+#### Performance
+
+Due to the current architecture and its reliance on the (possibly remote) storage backend to store repository and image metadata, even the most basic operations, such as listing repositories or tags, can become prohibitively slow, and it only gets worse as the registry grows in size.
+
+For example, to be able to tell which repositories exist, the registry has to walk through all folders in the storage backend and identify repositories in them. Only when all folders that exist have been visited, the registry can then reply to the client with the list of repositories. If using a remote storage backend (such as GCS or S3), performance becomes even worse, as for each visited folder multiple HTTP requests are required to list and inspect their contents.
+
+#### Consistency
+
+Some storage backends, like S3, can only provide [eventual consistency](https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel). As an example, reading a blob after deleting it can succeed for a short amount of time. Eventual consistency could be problematic when paired with online garbage collection, as read requests at the API level could continue to succeed for deleted blobs.
+
+#### Insights
+
+For similar reasons as highlighted above, currently, it's not feasible to extract valuable information from the registry, such as how much space a repository is using, which repositories are using the most space, which ones are more active, detailed push/pull metrics for each image or tag, and others. Not having access to these insights and metrics strongly weakens the ability to make informed decisions in regards to the product strategy.
+
+#### Additional Features
+
+Due to the metadata limitations, it's currently not feasible to implement valuable features such as [pagination](https://gitlab.com/gitlab-org/container-registry/-/issues/13#note_271769891), filtering and sorting for HTTP API, and more advanced features such as the ability to [distinguish between Docker and Helm charts images](https://gitlab.com/gitlab-org/gitlab/issues/38047).
+
+Because of all these constraints, we decided to [freeze the development of new features](https://gitlab.com/gitlab-org/container-registry/-/issues/44) until we have a solution in place to overcome all these foundational limitations.
+
+## New Architecture
+
+To overcome all challenges described above, we started an effort to migrate the registry metadata (the list of blobs, repositories, and which manifest/layers are referenced/linked in each one of them) from the storage backend into a [PostgreSQL database](#database).
+
+The ultimate goal of the new architecture is to enable online garbage collection ([&2313](https://gitlab.com/groups/gitlab-org/-/epics/2313)), but once the database is in place, we will also be able to implement all features that have been blocked by the metadata limitations. The performance of the existing API should drastically increase as well.
+
+The introduction of a database will affect the registry architecture, as we will have one more component involved:
+
+```mermaid
+graph LR
+ C((Client)) -- HTTP request --> R(Container Registry) -- Upload/download blobs --> B(Storage Backend)
+ R -- Write/read metadata --> D[(Database)]
+```
+
+With a database in place, the registry will no longer use the storage backend to write and read metadata. Instead, metadata will be stored and manipulated on the PostgreSQL database. The storage backend will then be used only for uploading and downloading blobs.
+
+The interaction between the registry and its clients, including GitLab Rails and the Docker client, will remain unchanged, as documented in the [Current Architecture](#current-architecture) section. The architectural changes and the database are internal only. The registry HTTP API and webhook notifications will also remain unchanged.
+
+### Database
+
+Following the GitLab [Go standards and style guidelines](../../../development/go_guide), no ORM is used to manage the database, only the [`database/sql`](https://golang.org/pkg/database/sql/) package from the Go standard library, a PostgreSQL driver ([`lib/pq`](https://pkg.go.dev/github.com/lib/pq?tab=doc)) and raw SQL queries, over a TCP connection pool.
+
+The design and development of the registry database adhere to the GitLab [database guidelines](../../../development/database/). Being a Go application, the required tooling to support the database will have to be developed, such as for running database migrations.
+
+Running *online* and [*post deployment*](../../../development/post_deployment_migrations.md) migrations is already supported by the registry CLI, as described in the [documentation](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/database-migrations.md).
+
+#### Partitioning
+
+The registry database will be partitioned from start to achieve greater performance (by limiting the amount of data to act upon and enable parallel execution), easier maintenance (by splitting tables and indexes into smaller units), and high availability (with partition independence). By partitioning the database from start we can also facilitate a sharding implementation later on if necessary.
+
+Although blobs are shared across repositories, manifest and tag metadata are scoped by repository. This is also visible at the API level, where all write and read requests (except [listing repositories](https://gitlab.com/gitlab-org/container-registry/-/blob/a113d0f0ab29b49cf88e173ee871893a9fc56a90/docs/spec/api.md#listing-repositories)) are scoped by repository, with its namespace being part of the request URI. For this reason, after [identifying access patterns](https://gitlab.com/gitlab-org/gitlab/-/issues/234255), we decided to partition manifests and tags by repository and blobs by digest, ensuring that lookups are always performed by partition key for optimal performance. The initial version of the partitioned schema was documented [here](https://gitlab.com/gitlab-com/www-gitlab-com/-/merge_requests/60918).
+
+#### GitLab.com
+
+Due to scale, performance and isolation concerns, for GitLab.com the registry database will be on a separate dedicated PostgreSQL cluster. Please see [#93](https://gitlab.com/gitlab-org/container-registry/-/issues/93) and [GitLab-com/gl-infra/infrastructure#10109](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/10109) for additional context.
+
+The diagram below illustrates the architecture of the database cluster:
+
+![GitLab.com database architecture](https://gitlab.com/gitlab-org/gitlab/uploads/949ae16d993bca6d4813830dfc501aa2/gitlabcom_database_architecture.png)
+
+##### Expected Rate and Size Requirements
+
+[Rate](https://gitlab.com/gitlab-org/container-registry/-/issues/94) and [size](https://gitlab.com/gitlab-org/container-registry/-/issues/61#note_446609886) requirements for the GitLab.com database were extrapolated based on the `dev.gitlab.org` registry and are available in the linked issues.
+
+#### Self-Managed Instances
+
+By default, for self-managed instances, the registry will have a separate logical database in the same PostgreSQL instance/cluster as the GitLab database. However, it will be possible to configure the registry to use a separate instance/cluster if needed.
+
+#### PostgreSQL
+
+During the discussion of the [initial database schema](https://gitlab.com/gitlab-org/gitlab/-/issues/207147), we have decided to opt for PostgreSQL over other database engines mainly because:
+
+- It offers all the features we need, including the ACID guarantees of an RDBMS, and partitioning;
+- It is already used for GitLab, thus we have the required experience and tools in place to manage it;
+- We want to offer self-managed customers the possibility of hosting the registry database within the same PostgreSQL instance that they already have for GitLab.
+
+##### Version 12
+
+PostgreSQL introduced significant improvements for partitioning in [version 12](https://www.postgresql.org/docs/12/release-12.html#id-1.11.6.9.5), among which we highlight:
+
+- It's now possible for foreign keys to reference partitioned tables. This is a hard requirement for this project not only to guarantee consistency and integrity but also to enable cascading deletes at the database level;
+- Major performance improvements for inserts, selects, and updates with less locking and consistent performance for a large number of partitions ([benchmarks](https://www.2ndquadrant.com/en/blog/postgresql-12-partitioning));
+- Major improvements to the planning algorithm for tables with a large number of partitions, with some tests finding speedups of up to 10,000 times ([source](https://aws.amazon.com/blogs/database/postgresql-12-a-deep-dive-into-some-new-functionality/));
+- Attaching new partitions to an existing table no longer requires locking the entire table;
+- Bulk load (`COPY`) now uses bulk inserts instead of inserting one row at a time;
+
+To leverage these features and performance improvements, we need to use PostgreSQL 12 from the start.
+
+GitLab currently ships with PostgreSQL 11 for self-managed instances. That is _likely_ to change in 14.0, with PostgreSQL 12 becoming the minimum required version, which will likely happen before the upgraded registry becomes available for self-managed instances. If not, self-managed instances will have two options:
+
+1. Administrators can manually provision and configure a separate PostgreSQL 12 database for the registry, allowing them to benefit from features provided by the new registry and its metadata database.
+1. Continue to use the current registry without the database if online garbage collection is not a concern or provisioning a separate database is not possible. We will continue supporting the current version with security backports and bug fixes for the foreseeable feature.
+
+It's important to note that apart from online garbage collection, the metadata database's availability will unblock the implementation of many requested features for the GitLab Container Registry, which will only be available for instances using the new version backed by the metadata database.
+
+### Availability
+
+Apart from the authentication service and the blob storage backend, the registry gains one more dependency with the new architecture - the database. Given that the registry can only be as reliable as its dependencies, the database deployment should be projected for high availability. A gradual migration approach should help to identify and mitigate implementation and resource constraints for high availability environments.
+
+#### HTTP API
+
+This is a list of all the registry HTTP API operations and how they depend on the storage backend and the new database. The registry will return an error response if any dependencies are not available when processing a request.
+
+| Operation | Method | Path | Requires Database | Requires Storage | Used by GitLab Rails * |
+|--------------------------------------------------------------------------------------------------------------------------------|----------|-----------------------------------------|-------------------|------------------|------------------------|
+| [Check API version](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#api-version-check) | `GET` | `/v2/` | ✖ | ✖ | ✔ |
+| [List repositories](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#listing-repositories) | `GET` | `/v2/_catalog` | ✔ | ✖ | ✖ |
+| [List repository tags](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#listing-image-tags) | `GET` | `/v2/<name>/tags/list` | ✔ | ✖ | ✔ |
+| [Delete tag](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#deleting-a-tag) | `DELETE` | `/v2/<name>/tags/reference/<reference>` | ✔ | ✖ | ✔ |
+| [Check if manifest exists](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#existing-manifests) | `HEAD` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✔ |
+| [Pull manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pulling-an-image-manifest) | `GET` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✔ |
+| [Push manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pushing-an-image-manifest) | `PUT` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✖ |
+| [Delete manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#deleting-an-image) | `DELETE` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✖ |
+| [Check if blob exists](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#existing-layers) | `HEAD` | `/v2/<name>/blobs/<digest>` | ✔ | ✖ | ✖ |
+| [Pull blob](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#fetch-blob) | `GET` | `/v2/<name>/blobs/<digest>` | ✔ | ✔ | ✔ |
+| [Delete blob](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#delete-blob) | `DELETE` | `/v2/<name>/blobs/<digest>` | ✔ | ✖ | ✖ |
+| [Start blob upload](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#starting-an-upload) | `POST` | `/v2/<name>/blobs/uploads/` | ✔ | ✔ | ✖ |
+| [Check blob upload status](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#get-blob-upload) | `GET` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+| [Push blob chunk](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#chunked-upload-1) | `PATCH` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+| [Complete blob upload](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#put-blob-upload) | `PUT` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+| [Cancel blob upload](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#canceling-an-upload) | `DELETE` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+
+`*` Please refer to the [list of interactions between registry and Rails](#from-gitlab-rails-to-registry) to know why and how.
+
+#### Failure Scenarios
+
+With the addition of a database, it is essential to highlight possible failure scenarios, how we expect the registry to behave in such conditions, and their impact on the registry availability and functionality.
+
+##### Database Failover
+
+In case of refused connections or timeouts when attempting to connect to the database, which might happen during a failover scenario, the registry will discard broken connections upfront and attempt to open a new one from the pool immediately.
+
+The application will not panic in this scenario. It will try to establish a new connection for every request. If failed, an HTTP `503 Service Unavailable` error is returned to clients, and the error is logged and reported to Sentry. There is no retry cadence. The registry will only try to establish a new connection when another request that requires database access is received.
+
+It is also possible to configure the registry to periodically check the health of the database server using a TCP health checker with a configurable interval and threshold ([docs](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#tcp)). In case the health check fails, incoming requests will be halted with an HTTP `503 Service Unavailable` error.
+
+Once the database server is available again, the registry will gracefully reconnect on the next incoming request, restoring the full API functionality without human intervention.
+
+The expected registry behavior will be covered with integration tests, using a programmable TCP proxy between the registry and a database server to simulate a failover scenario.
+
+##### Connection Pool Saturation
+
+If unable to pull a connection from the pool to serve a given request, the registry will timeout and return an HTTP `500 Internal Server Error` error to the client and report the error to Sentry. These issues should trigger a development escalation to investigate why the pool is being exhausted. There might be too much load for the preconfigured pool size, or there might be transactions holding on to connections for too long.
+
+Prometheus metrics should be used to create alerts to act on a possible saturation before the application starts erroring. Special attention will be paid to these scenarios during the gradual migration of the GitLab.com registry, where we will have limited, gradual, and controlled exposure on the new registry nodes. During that process, we can identify usage patterns, observe metrics, and fine tune both infrastructure and application settings accordingly as the load increases. If needed, a rate limiting algorithm may be applied to limit impact. Decisions will be based on real data to avoid overly restrictive measures and premature optimizations.
+
+The expected registry behavior will be covered with integration tests by manipulating the pool size and spawning multiple concurrent requests against the API, putting pressure on the pool and eventually exhausting its capacity.
+
+##### Latency
+
+Excessive latency on established connections is hard to detect and debug, as these might not raise an application error or network timeout in normal circumstances but usually precede them.
+
+For this reason, the duration of database queries used to serve HTTP API requests should be instrumented using metrics, allowing the detection of unusual variations and trigger alarms accordingly before an excessive latency becomes a timeout or service unavailability.
+
+The expected registry behavior will be covered with integration tests, using a programmable TCP proxy between the registry and a database server to simulate increasing latency scenarios.
+
+##### Problematic Migrations
+
+Apart from unusual network and systems conditions, problematic migrations and data failures can also affect the database availability and, as a consequence, the registry availability.
+
+Database migrations will adhere to the same [development best practices](../../../development/database/) used for GitLab Rails, except Rails-specific methods and tools, as the registry is a Go application with no ORM, and migrations are therefore expressed with raw SQL statements. Regardless, all changes will require a review and approval from the Database team.
+
+Database migrations will be idempotent, with guard clauses used whenever necessary. It is also intended to guarantee that they are forward compatible. For a clustered environment, a node running registry version `N` should not cause any issues when the database schema is from version `N`+1.
+
+### Observability
+
+Adding one more component to the system makes it even more critical to guarantee that we have proper observability over the registry's behavior and its dependencies. It should be guaranteed that we have all the necessary tools in place before rolling out the new registry backed by the metadata database.
+
+For this purpose, [error reporting with Sentry](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11297), [improved structured logging](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/10933), and [improved HTTP metrics](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/10935) were already implemented and released. At the time of writing, the GitLab.com rollout is in progress.
+
+Additionally, the Prometheus metrics will be augmented with [details on the database connection pool](https://gitlab.com/gitlab-org/container-registry/-/issues/238). These will be added to the registry Grafana dashboards, joining the existing HTTP API, deployment, and storage metrics. The database cluster for the registry [will also have metrics and alerts](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11447).
+
+Together, these resources should provide an adequate level of insight into the registry's performance and behavior.
+
+### New Features and Breaking Changes
+
+#### Third-Party Container Registries
+
+GitLab ships with the GitLab Container Registry by default, but it's also compatible with third-party registries, as long as they comply with the [Docker Distribution V2 Specification](https://docs.docker.com/registry/spec/api/), now superseded by the [Open Container Initiative (OCI) Image Specification](https://github.com/opencontainers/image-spec/blob/master/spec.md).
+
+So far, we strived to maintain full compatibility with third-party registries when adding new features. For example, in 12.8, we introduced a new [tag delete feature](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23325) to delete a single tag without deleting the underlying manifest. Because this feature is not part of the Docker or OCI specifications, we have kept the previous behavior as a fallback option to maintain compatibility with third-party registries.
+
+However, this will likely change in the future. Apart from online garbage collection, and as described in [challenges](#challenges), the metadata database will unblock the implementation of many requested features for the GitLab Container Registry in the mid/long term. Most of these features will only be available for instances using the GitLab Container Registry. They are not part of the Docker Distribution or OCI specifications, neither we will be able to provide a compatible fallback option.
+
+For this reason, any features that require the use of the GitLab Container Registry will be disabled if using a third-party registry, for as long as third-party registries continue to be supported.
+
+#### Synchronizing Changes With GitLab Rails
+
+Currently, the GitLab Rails and GitLab Container Registry releases and deployments have been fully independent, as we have not introduced any new API features or breaking changes, apart from the described tag delete feature.
+
+The registry will remain independent from GitLab Rails changes, but in the mid/long term, the implementation of new features or breaking changes will imply a corresponding change in GitLab Rails, so the latter will depend on a specific minimum version of the registry.
+
+For example, to track the size of each repository, we may extend the metadata database to store that information and then propagate it to GitLab Rails by extending the HTTP API that it consumes. In GitLab Rails, this new information would likely be stored in its database and processed to offer a new feature at the UI/API level.
+
+This kind of changes will require a synchronization between the GitLab Rails and the GitLab Container Registry releases and deployments, as the former will depend on a specific version of the latter.
+
+##### Feature Toggling
+
+All GitLab Rails features dependent on a specific version of the registry should be guarded by validating the registry vendor and version.
+
+This is already done to determine whether a tag should be deleted using the new tag delete feature (only available in the GitLab Container Registry v2.8.1+) or the old method. In this case, GitLab Rails sends an `OPTIONS` request to the registry tag route to determine whether the `DELETE` method is supported or not.
+
+Alternatively, and as the universal long-term solution, we need to determine the registry vendor, version, and supported features (the last two are only applicable if the vendor is GitLab) and persist it in the GitLab Rails database. This information can then be used in realtime to toggle features or fallback to alternative methods, if possible. The initial implementation of this approach was introduced as part of [#204839](https://gitlab.com/gitlab-org/gitlab/-/issues/204839). Currently, it's only used for metrics purposes. Further improvements are required to guarantee that the version information is kept up to date in self-managed instances, where the registry may be hot swapped.
+
+##### Release and Deployment
+
+As described above, feature toggling offers a last line of defense against desynchronized releases and deployments, ensuring that GitLab Rails remains functional in case the registry version that supports new features is not yet available.
+
+However, the release and deployment of GitLab Rails and the GitLab Container Registry should be synchronized to avoid any delays. Contrary to GitLab Rails, the registry release and deployment are manual processes, so special attention must be paid by maintainers to ensure that the GitLab Rails changes are only released and deployed after the corresponding registry changes.
+
+As a solution to strengthen this process, a file can be added to the GitLab Rails codebase, containing the minimum required version of the registry. This file should be updated with every change that depends on a specific version of the registry. It should also be considered when releasing and deploying GitLab Rails, ensuring that the pipeline only goes through once the specified minimum required registry version is deployed.
+
+## Iterations
+
+1. Design metadata database schema;
+1. Add support for managing metadata using the database;
+1. Design plans and tools to facilitate the migration of small, medium and large repositories;
+1. Implement online garbage collection;
+1. Create database clusters in staging and production for GitLab.com;
+1. Create automated deployment pipeline for GitLab.com;
+1. Deployment and gradual migration of the existing registry for GitLab.com;
+1. Rollout support for the metadata database to self-managed installs.
+
+A more detailed list of all tasks, as well as periodic progress updates can be found in the epic [&2313](https://gitlab.com/groups/gitlab-org/-/epics/2313).
+
+## Relevant Links
+
+- [Allow admin to run garbage collection with zero downtime](https://gitlab.com/groups/gitlab-org/-/epics/2313)
+- [Proposal for continuous, on-demand online garbage collection](https://gitlab.com/gitlab-org/container-registry/-/issues/199)
+- [Gradual migration proposal for the GitLab.com container registry](https://gitlab.com/gitlab-org/container-registry/-/issues/191)
+- [Create a self-serve registry deployment](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/316)
+- [Database cluster for container registry](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11154)
+
+## Who
+
+Proposal:
+
+| Role | Who
+|------------------------------|-------------------------|
+| Author | João Pereira |
+| Architecture Evolution Coach | Gerardo Lopez-Fernandez |
+| Engineering Leader | |
+| Domain Expert | Hayley Swimelar |
+
+DRIs:
+
+| Role | Who
+|------------------------------|------------------------|
+| Product | Tim Rizzi |
+| Leadership | |
+| Engineering | João Pereira |
diff --git a/doc/architecture/blueprints/graphql_api/index.md b/doc/architecture/blueprints/graphql_api/index.md
index 40d02168b3b..99047eb5964 100644
--- a/doc/architecture/blueprints/graphql_api/index.md
+++ b/doc/architecture/blueprints/graphql_api/index.md
@@ -178,6 +178,10 @@ DRIs:
|------------------------------|------------------------|
| Leadership | Darva Satcher |
| Product | Patrick Deuley |
-| Engineering | |
+| Engineering | Paul Slaughter |
+| Domain Expert / GraphQL | Charlie Ablett |
+| Domain Expert / GraphQL | Alex Kalderimis |
+| Domain Expert / GraphQL | Natalia Tepluhina |
+| Domain Expert / Scalability | Bob Van Landuyt |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/ci/README.md b/doc/ci/README.md
index 9b555c0ee68..b1bcb578daf 100644
--- a/doc/ci/README.md
+++ b/doc/ci/README.md
@@ -37,6 +37,9 @@ the development cycle, ensuring that all the code deployed to
production complies with the code standards you established for
your app.
+GitLab can also automatically detect, build, test, deploy, and
+monitor your applications by using [Auto DevOps](../topics/autodevops/index.md).
+
For a complete overview of these methodologies and GitLab CI/CD,
read the [Introduction to CI/CD with GitLab](introduction/index.md).
diff --git a/doc/ci/ci_cd_for_external_repos/github_integration.md b/doc/ci/ci_cd_for_external_repos/github_integration.md
index 2a8b050b224..deadc4458a2 100644
--- a/doc/ci/ci_cd_for_external_repos/github_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/github_integration.md
@@ -22,7 +22,7 @@ cannot be used to authenticate with GitHub as an external CI/CD repository.
## Connect with Personal Access Token
Personal access tokens can only be used to connect GitHub.com
-repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/access-permissions-on-github).
+repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/github/getting-started-with-github/access-permissions-on-github).
To perform a one-off authorization with GitHub to grant GitLab access your
repositories:
diff --git a/doc/ci/cloud_deployment/ecs/img/container-name.png b/doc/ci/cloud_deployment/ecs/img/container-name.png
new file mode 100644
index 00000000000..c2b4f23454b
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/container-name.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png b/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png
new file mode 100644
index 00000000000..ca390bf68a0
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png b/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png
new file mode 100644
index 00000000000..389c05d9026
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-policy.png b/doc/ci/cloud_deployment/ecs/img/ecs-policy.png
new file mode 100644
index 00000000000..088a45bb065
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-policy.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png b/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png
new file mode 100644
index 00000000000..e91a8656ae0
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png b/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png
new file mode 100644
index 00000000000..7072f550586
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/rails-template.png b/doc/ci/cloud_deployment/ecs/img/rails-template.png
new file mode 100644
index 00000000000..02c67f8dd21
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/rails-template.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/registry.png b/doc/ci/cloud_deployment/ecs/img/registry.png
new file mode 100644
index 00000000000..694d83fd0ce
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/registry.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/service-parameter.png b/doc/ci/cloud_deployment/ecs/img/service-parameter.png
new file mode 100644
index 00000000000..7252601571b
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/service-parameter.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/service-running.png b/doc/ci/cloud_deployment/ecs/img/service-running.png
new file mode 100644
index 00000000000..2b78960d5f4
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/service-running.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png b/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png
new file mode 100644
index 00000000000..e64a378e11c
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/view-running-app.png b/doc/ci/cloud_deployment/ecs/img/view-running-app.png
new file mode 100644
index 00000000000..360dd285182
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/view-running-app.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/quick_start_guide.md b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
new file mode 100644
index 00000000000..f75680ccd8c
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
@@ -0,0 +1,250 @@
+---
+stage: Release
+group: Release
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Getting started with Continuous Deployment to AWS Elastic Container Service **(FREE)**
+
+This step-by-step guide helps you use [Continuous Deployment to ECS](../index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs)
+that deploys a project hosted on GitLab.com to [Elastic Container Service](https://aws.amazon.com/ecs/)
+(ECS) on AWS.
+
+In this guide, you begin by creating an ECS cluster manually using the AWS console. You create and
+deploy a simple application that you create from a GitLab template.
+
+These instructions work for both SaaS and self-managed GitLab instances.
+Ensure your own [runners are configured](../../runners/README.md).
+
+## Prerequisites
+
+- An [AWS account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).
+ Sign in with an existing AWS account or create a new one.
+- In this guide, you create an infrastructure in [`us-east-2` region](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html).
+ You can use any region, but do not change it after you begin.
+
+## Create an infrastructure and initial deployment on AWS
+
+For deploying an application from GitLab, you must first create an infrastructure and initial
+deployment on AWS.
+This includes an [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+and related components, such as
+[ECS task definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html),
+[ECS services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html),
+and containerized application image.
+
+For the first step here, you create a demo application from a project template.
+
+### Create a new project from a template
+
+Use a GitLab project template to get started. As the name suggests, these projects provide a
+bare-bones application built on some well-known frameworks.
+
+1. In GitLab, click the plus icon (**{plus-square}**) at the top of the navigation bar, and select
+ **New project**.
+
+1. Click the **Create from template** button, where you can choose from a Ruby on Rails, Spring, or
+ NodeJS Express project. For this guide, use the Ruby on Rails template.
+
+ ![Select project template](img/rails-template.png)
+
+1. Give your project a name. In this example, it's named `ecs-demo`. Make it public so that you can
+ take advantage of the features available in the
+ [GitLab Ultimate plan](https://about.gitlab.com/pricing/).
+
+1. Click **Create project**.
+
+Now that you created a demo project, you must containerize the application and push it to the
+container registry.
+
+### Push a containerized application image to GitLab Container Registry
+
+[ECS](https://aws.amazon.com/ecs/) is a container orchestration service, meaning that you must
+provide a containerized application image during the infrastructure build. To do so, you can use
+GitLab [Auto Build](../../../topics/autodevops/stages.md#auto-build)
+and [Container Registry](../../../user/packages/container_registry/index.md).
+
+1. Go to **ecs-demo** project on GitLab.
+1. Click **Setup up CI/CD**. It brings you to a [`.gitlab-ci.yml`](../../README.md#getting-started)
+ creation form.
+1. Copy and paste the following content into the empty `.gitlab-ci.yml`. This defines
+ [a pipeline for continuous deployment to ECS](../index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs).
+
+ ```yaml
+ include:
+ - template: AWS/Deploy-ECS.gitlab-ci.yml
+ ```
+
+1. Click **Commit Changes**. It automatically triggers a new pipeline. In this pipeline, the `build`
+ job containerizes the application and pushes the image to [GitLab Container Registry](../../../user/packages/container_registry/index.md).
+
+ ![Create project](img/initial-pipeline.png)
+
+1. Visit **Packages & Registries > Container Registry**. Make sure the application image has been
+ pushed.
+
+ ![Create project](img/registry.png)
+
+Now you have a containerized application image that can be pulled from AWS. Next, you define the
+spec of how this application image is used in AWS.
+
+Note that the `production_ecs` job fails because ECS Cluster is not connected yet. You'll fix this
+later.
+
+### Create an ECS task definition
+
+[ECS Task definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)
+is a specification about how the application image is started by an [ECS service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html).
+
+1. Go to **ECS > Task Definitions** on [AWS console](https://aws.amazon.com/).
+1. Click **Create new Task Definition**.
+
+ ![Create project](img/ecs-task-definitions.png)
+
+1. Choose **EC2** as the launch type. Click **Next Step**.
+1. Set `ecs_demo` to **Task Definition Name**.
+1. Set `512` to **Task Size > Task memory** and **Task CPU**.
+1. Click **Container Definitions > Add container**. This opens a container registration form.
+1. Set `web` to **Container name**.
+1. Set `registry.gitlab.com/<your-namespace>/ecs-demo/master:latest` to **Image**.
+ Alternatively, you can copy and paste the image path from the [GitLab Container Registry page](#push-a-containerized-application-image-to-gitlab-container-registry).
+
+ ![Create project](img/container-name.png)
+
+1. Add a port mapping. Set `80` to **Host Port** and `5000` to **Container port**.
+
+ ![Create project](img/container-port-mapping.png)
+
+1. Click **Create**.
+
+Now you have the initial task definition. Next, you create an actual infrastructure to run the
+application image.
+
+### Create an ECS cluster
+
+An [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+is a virtual group of [ECS services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html).
+It's also associated with EC2 or Fargate as the computation resource.
+
+1. Go to **ECS > Clusters** on [AWS console](https://aws.amazon.com/).
+1. Click **Create Cluster**.
+1. Select **EC2 Linux + Networking** as the cluster template. Click **Next Step**.
+1. Set `ecs-demo` to **Cluster Name**.
+1. Choose the default [VPC](https://aws.amazon.com/vpc/?vpc-blogs.sort-by=item.additionalFields.createdDate&vpc-blogs.sort-order=desc)
+ in **Networking**. If there are no existing VPCs, you can leave it as-is to create a new one.
+1. Set all available subnets of the VPC to **Subnets**.
+1. Click **Create**.
+1. Make sure that the ECS cluster has been successfully created.
+
+ ![Create project](img/ecs-launch-status.png)
+
+Now you can register an ECS service to the ECS cluster in the next step.
+
+Note the following:
+
+- Optionally, you can set a SSH key pair in the creation form. This allows you to SSH to the EC2
+ instance for debugging.
+- If you don't choose an existing VPC, it creates a new VPC by default. This could cause an error if
+ it reaches the maximum allowed number of internet gateways on your account.
+- The cluster requires an EC2 instance, meaning it costs you [according to the instance-type](https://aws.amazon.com/ec2/pricing/on-demand/).
+
+### Create an ECS Service
+
+[ECS service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html)
+is a daemon to create an application container based on the [ECS task definition](#create-an-ecs-task-definition).
+
+1. Go to **ECS > Clusters > ecs-demo > Services** on the [AWS console](https://aws.amazon.com/)
+1. Click **Deploy**. This opens a service creation form.
+1. Select `EC2` in **Launch Type**.
+1. Set `ecs_demo` to **Task definition**. This corresponds to [the task definition you created above](#create-an-ecs-task-definition).
+1. Set `ecs_demo` to **Service name**.
+1. Set `1` to **Desired tasks**.
+
+ ![Create project](img/service-parameter.png)
+
+1. Click **Deploy**.
+1. Make sure that the created service is active.
+
+ ![Create project](img/service-running.png)
+
+Note that AWS's console UI changes from time to time. If you can't find a relevant component in the
+instructions, select the closest one.
+
+### View the demo application
+
+Now, the demo application is accessible from the internet.
+
+1. Go to **EC2 > Instances** on the [AWS console](https://aws.amazon.com/)
+1. Search by `ECS Instance` to find the corresponding EC2 instance that [the ECS cluster created](#create-an-ecs-cluster).
+1. Click the ID of the EC2 instance. This brings you to the instance detail page.
+1. Copy **Public IPv4 address** and paste it in the browser. Now you can see the demo application
+ running.
+
+ ![Create project](img/view-running-app.png)
+
+In this guide, HTTPS/SSL is **NOT** configured. You can access to the application through HTTP only
+(for example, `http://<ec2-ipv4-address>`).
+
+## Setup Continuous Deployment from GitLab
+
+Now that you have an application running on ECS, you can set up continuous deployment from GitLab.
+
+### Create a new IAM user as a deployer
+
+For GitLab to access the ECS cluster, service, and task definition that you created above, You must
+create a deployer user on AWS:
+
+1. Go to **IAM > Users** on [AWS console](https://aws.amazon.com/).
+1. Click **Add user**.
+1. Set `ecs_demo` to **User name**.
+1. Enable **Programmatic access** checkbox. Click **Next: Permissions**.
+1. Select `Attach existing policies directly` in **Set permissions**.
+1. Select `AmazonECS_FullAccess` from the policy list. Click **Next: Tags** and **Next: Review**.
+
+ ![Create project](img/ecs-policy.png)
+
+1. Click **Create user**.
+1. Take note of the **Access key ID** and **Secret access key** of the created user.
+
+NOTE:
+Do not share the secret access key in a public place. You must save it in a secure place.
+
+### Setup credentials in GitLab to let pipeline jobs access to ECS
+
+You can register the access information in [GitLab Environment Variables](../../variables/README.md#create-a-custom-variable-in-the-ui).
+These variables are injected into the pipeline jobs and can access the ECS API.
+
+1. Go to **ecs-demo** project on GitLab.
+1. Go to **Settings > CI/CD > Variables**.
+1. Click **Add Variable** and set the following key-value pairs.
+
+ |Key|Value|Note|
+ |---|---|---|
+ |`AWS_ACCESS_KEY_ID`|`<Access key ID of the deployer>`| For authenticating `aws` CLI. |
+ |`AWS_SECRET_ACCESS_KEY`|`<Secret access key of the deployer>`| For authenticating `aws` CLI. |
+ |`AWS_DEFAULT_REGION`|`us-east-2`| For authenticating `aws` CLI. |
+ |`CI_AWS_ECS_CLUSTER`|`ecs-demo`| The ECS cluster is accessed by `production_ecs` job. |
+ |`CI_AWS_ECS_SERVICE`|`ecs_demo`| The ECS service of the cluster is updated by `production_ecs` job. |
+ |`CI_AWS_ECS_TASK_DEFINITION`|`ecs_demo`| The ECS task definition is updated by `production_ecs` job. |
+
+### Make a change to the demo application
+
+Change a file in the project and see if it's reflected in the demo application on ECS:
+
+1. Go to **ecs-demo** project on GitLab.
+1. Open the file at **app > views > welcome > index.html.erb**.
+1. Click **Edit**.
+1. Change the text to `You're on ECS!`.
+1. Click **Commit Changes**. This automatically triggers a new pipeline. Wait until it finishes.
+1. [Access the running application on the ECS cluster](#view-the-demo-application). You should see
+ this:
+
+ ![Create project](img/view-running-app-2.png)
+
+Congratulations! You successfully set up continuous deployment to ECS.
+
+## Further reading
+
+- If you're interested in more of the continuous deployments to clouds, see [cloud deployments](../index.md).
+- If you want to quickly set up DevSecOps in your project, see [Auto DevOps](../../../topics/autodevops/index.md).
+- If you want to quickly set up the production-grade environment, see [the 5 Minute Production App](https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/blob/master/README.md).
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index ccacb3c61d3..1e53414cd1e 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -20,6 +20,11 @@ CI/CD pipeline, you can interact with your chosen cloud provider more easily.
GitLab provides Docker images that you can use to [run AWS commands from GitLab CI/CD](#run-aws-commands-from-gitlab-cicd), and a template to make
it easier to [deploy to AWS](#deploy-your-application-to-the-aws-elastic-container-service-ecs).
+### Quick start
+
+If you're using GitLab.com, see the [quick start guide](ecs/quick_start_guide.md)
+for setting up Continuous Deployment to [AWS Elastic Container Service](https://aws.amazon.com/ecs/) (ECS).
+
### Run AWS commands from GitLab CI/CD
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31167) in GitLab 12.6.
@@ -37,7 +42,7 @@ Some credentials are required to be able to run `aws` commands:
NOTE:
A new **Access key ID** and **Secret access key** are generated. Please take a note of them right away.
-1. In your GitLab project, go to **Settings > CI / CD**. Set the following as
+1. In your GitLab project, go to **Settings > CI/CD**. Set the following as
[CI/CD variables](../variables/README.md)
(see table below):
@@ -319,4 +324,4 @@ For a video walkthrough of this configuration process, see [Auto Deploy to EC2](
## Deploy to Google Cloud
-- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/solutions/google-cloud-platform/)
+- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/partners/technology-partners/google-cloud-platform/)
diff --git a/doc/ci/docker/index.md b/doc/ci/docker/index.md
index 18a9d63b694..0897bb183e5 100644
--- a/doc/ci/docker/index.md
+++ b/doc/ci/docker/index.md
@@ -8,11 +8,18 @@ type: index
# Docker integration
-GitLab CI/CD can be combined with [Docker](https://www.docker.com) to enable
-integration between the two.
+There are two primary ways to incorporate [Docker](https://www.docker.com) in your CI/CD workflow.
-The following documentation is available for using GitLab CI/CD with Docker:
+- **[Run your CI/CD jobs](using_docker_images.md) in Docker containers.**
-- [Building Docker images with GitLab CI/CD](using_docker_build.md).
-- [Using Docker images](using_docker_images.md).
-- [Building images with kaniko and GitLab CI/CD](using_kaniko.md).
+ You can create CI/CD jobs to do things like test, build, or publish
+ an application. These jobs can run in Docker containers.
+
+ For example, you can tell GitLab CI/CD to use a Node image that's hosted on Docker Hub
+ or in the GitLab Container Registry. Your job then runs in a container that's based on the image.
+ The container has all the Node dependencies you need to build your app.
+
+- **Use [Docker](using_docker_build.md) or [kaniko](using_kaniko.md) to build Docker images.**
+
+ You can create CI/CD jobs to build Docker images and publish
+ them to a container registry.
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index 46ced9b4d6d..2091a80bdf2 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -5,34 +5,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Building Docker images with GitLab CI/CD
+# Use Docker to build Docker images
-You can use GitLab CI/CD with Docker Engine to build and test Docker-based projects.
-
-For example, you might want to:
-
-1. Create an application image.
-1. Run tests against the created image.
-1. Push image to a remote registry.
-1. Deploy to a server from the pushed image.
-
-Or, if your application already has a `Dockerfile`, you can
-use it to create and test an image:
-
-```shell
-docker build -t my-image dockerfiles/
-docker run my-image /script/to/run/tests
-docker tag my-image my-registry:5000/my-image
-docker push my-registry:5000/my-image
-```
+You can use GitLab CI/CD with Docker to create Docker images.
+For example, you can create a Docker image of your application,
+test it, and publish it to a container registry.
To run Docker commands in your CI/CD jobs, you must configure
-GitLab Runner to enable `docker` support.
+GitLab Runner to support `docker` commands.
## Enable Docker commands in your CI/CD jobs
-There are three ways to enable the use of `docker build` and `docker run`
-during jobs, each with their own tradeoffs. You can use:
+To enable Docker commands for your CI/CD jobs, you can use:
- [The shell executor](#use-the-shell-executor)
- [The Docker executor with the Docker image (Docker-in-Docker)](#use-the-docker-executor-with-the-docker-image-docker-in-docker)
@@ -47,12 +31,9 @@ to learn more about how these runners are configured.
### Use the shell executor
-One way to configure GitLab Runner for `docker` support is to use the
-`shell` executor.
-
-After you register a runner and select the `shell` executor,
-your job scripts are executed as the `gitlab-runner` user.
-This user needs permission to run Docker commands.
+You can include Docker commands in your CI/CD jobs if your runner is configured to
+use the `shell` executor. The `gitlab-runner` user runs the Docker commands, but
+needs permission to run them.
1. [Install](https://gitlab.com/gitlab-org/gitlab-runner/#installation) GitLab Runner.
1. [Register](https://docs.gitlab.com/runner/register/) a runner.
@@ -100,9 +81,11 @@ Learn more about the [security of the `docker` group](https://blog.zopyx.com/on-
### Use the Docker executor with the Docker image (Docker-in-Docker)
-Another way to configure GitLab Runner for `docker` support is to
-register a runner with the Docker executor and use the [Docker image](https://hub.docker.com/_/docker/)
-to run your job scripts. This configuration is referred to as "Docker-in-Docker."
+You can use "Docker-in-Docker" to run commands in your CI/CD jobs:
+
+- Register a runner that uses the Docker executor.
+- Use the [Docker image](https://hub.docker.com/_/docker/) provided by Docker to
+ run the jobs that need Docker commands.
The Docker image has all of the `docker` tools installed
and can run the job script in context of the image in privileged mode.
@@ -111,14 +94,18 @@ The `docker-compose` command is not available in this configuration by default.
To use `docker-compose` in your job scripts, follow the `docker-compose`
[installation instructions](https://docs.docker.com/compose/install/).
+An example project that uses this approach can be found here: <https://gitlab.com/gitlab-examples/docker>.
+
WARNING:
When you enable `--docker-privileged`, you are effectively disabling all of
the security mechanisms of containers and exposing your host to privilege
-escalation which can lead to container breakout. For more information, check
+escalation. Doing this can lead to container breakout. For more information, check
out the official Docker documentation on
[runtime privilege and Linux capabilities](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities).
-Docker-in-Docker works well, and is the recommended configuration, but it is
+#### Limitations of Docker-in-Docker
+
+Docker-in-Docker is the recommended configuration, but it is
not without its own challenges:
- When using Docker-in-Docker, each job is in a clean environment without the past
@@ -144,8 +131,6 @@ not without its own challenges:
- docker run -v "$MOUNT_POINT:/mnt" my-docker-image
```
-An example project using this approach can be found here: <https://gitlab.com/gitlab-examples/docker>.
-
In the examples below, we are using Docker images tags to specify a
specific version, such as `docker:19.03.12`. If tags like `docker:stable`
are used, you have no control over what version is used. This can lead to
@@ -373,9 +358,8 @@ build:
### Use Docker socket binding
-Another way to configure GitLab Runner for `docker` support is to
-bind-mount `/var/run/docker.sock` into the
-container so that Docker is available in the context of the image.
+To use Docker commands in your CI/CD jobs, you can bind-mount `/var/run/docker.sock` into the
+container. Docker is then available in the context of the image.
NOTE:
If you bind the Docker socket and you are
@@ -478,13 +462,10 @@ services:
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27173) in GitLab Runner 13.6.
-If you are an administrator of GitLab Runner and you have the `dind`
-service defined for the [Docker
-executor](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersdockerservices-section),
-or the [Kubernetes
-executor](https://docs.gitlab.com/runner/executors/kubernetes.html#using-services)
-you can specify the `command` to configure the registry mirror for the
-Docker daemon.
+If you are a GitLab Runner administrator, you can specify the `command` to configure the registry mirror
+for the Docker daemon. The `dind` service must be defined for the
+[Docker](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersdockerservices-section)
+or [Kubernetes executor](https://docs.gitlab.com/runner/executors/kubernetes.html#using-services).
Docker:
@@ -516,11 +497,10 @@ Kubernetes:
##### Docker executor inside GitLab Runner configuration
-If you are an administrator of GitLab Runner and you want to use
-the mirror for every `dind` service, update the
+If you are a GitLab Runner administrator, you can use
+the mirror for every `dind` service. Update the
[configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html)
-to specify a [volume
-mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section).
+to specify a [volume mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section).
For example, if you have a `/opt/docker/daemon.json` file with the following
content:
@@ -552,11 +532,10 @@ picked up by the `dind` service.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3223) in GitLab Runner 13.6.
-If you are an administrator of GitLab Runner and you want to use
-the mirror for every `dind` service, update the
+If you are a GitLab Runner administrator, you can use
+the mirror for every `dind` service. Update the
[configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html)
-to specify a [ConfigMap volume
-mount](https://docs.gitlab.com/runner/executors/kubernetes.html#using-volumes).
+to specify a [ConfigMap volume mount](https://docs.gitlab.com/runner/executors/kubernetes.html#using-volumes).
For example, if you have a `/tmp/daemon.json` file with the following
content:
@@ -602,7 +581,7 @@ The configuration is picked up by the `dind` service.
When you use Docker-in-Docker, the [normal authentication
methods](using_docker_images.html#define-an-image-from-a-private-container-registry)
-won't work because a fresh Docker daemon is started with the service.
+don't work because a fresh Docker daemon is started with the service.
### Option 1: Run `docker login`
@@ -634,14 +613,14 @@ empty or remove it.
If you are an administrator for GitLab Runner, you can mount a file
with the authentication configuration to `~/.docker/config.json`.
-Then every job that the runner picks up will be authenticated already. If you
+Then every job that the runner picks up is authenticated already. If you
are using the official `docker:19.03.13` image, the home directory is
under `/root`.
If you mount the configuration file, any `docker` command
that modifies the `~/.docker/config.json` (for example, `docker login`)
fails, because the file is mounted as read-only. Do not change it from
-read-only, because other problems will occur.
+read-only, because problems occur.
Here is an example of `/opt/.docker/config.json` that follows the
[`DOCKER_AUTH_CONFIG`](using_docker_images.md#determining-your-docker_auth_config-data)
@@ -743,8 +722,8 @@ build:
When using Docker-in-Docker, Docker downloads all layers of your image every
time you create a build. Recent versions of Docker (Docker 1.13 and above) can
-use a pre-existing image as a cache during the `docker build` step, considerably
-speeding up the build process.
+use a pre-existing image as a cache during the `docker build` step. This considerably
+speeds up the build process.
### How Docker caching works
@@ -754,8 +733,8 @@ any changes. Change in one layer causes all subsequent layers to be recreated.
You can specify a tagged image to be used as a cache source for the `docker build`
command by using the `--cache-from` argument. Multiple images can be specified
-as a cache source by using multiple `--cache-from` arguments. Keep in mind that
-any image that's used with the `--cache-from` argument must first be pulled
+as a cache source by using multiple `--cache-from` arguments. Any image that's used
+with the `--cache-from` argument must first be pulled
(using `docker pull`) before it can be used as a cache source.
### Using Docker caching
@@ -872,4 +851,4 @@ If:
- This is the first time setting it up, carefully read
[using Docker in Docker workflow](#use-the-docker-executor-with-the-docker-image-docker-in-docker).
- You are upgrading from v18.09 or earlier, read our
- [upgrade guide](https://about.gitlab.com/releases/2019/07/31/docker-in-docker-with-docker-19-dot-03/).
+ [upgrade guide](https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03/).
diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md
index 67450d442a9..e8028a862c4 100644
--- a/doc/ci/docker/using_docker_images.md
+++ b/doc/ci/docker/using_docker_images.md
@@ -5,29 +5,25 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Using Docker images
+# Run your CI/CD jobs in Docker containers
-GitLab CI/CD in conjunction with [GitLab Runner](../runners/README.md) can use
-[Docker Engine](https://www.docker.com/) to test and build any application.
+You can run your CI/CD jobs in separate, isolated Docker containers.
-Docker is an open-source project that has predefined images you can use to
-run applications in independent "containers." These containers run in a single Linux
-instance. [Docker Hub](https://hub.docker.com/) is a database of pre-built images you can
-use to test and build your applications.
+When you run a Docker container on your local machine, it acts as a reproducible build environment.
+You can run tests in the container, instead of testing on a dedicated CI/CD server.
-When you use Docker with GitLab CI/CD, Docker runs each job in a separate and isolated
-container. You specify the container image in the project's
-[`.gitlab-ci.yml`](../yaml/README.md) file.
+To run CI/CD jobs in a Docker container, you need to:
-Docker containers provide a reproducible build environment that
-can run on your workstation. When a Docker container is running, you can test
-commands from your shell, rather than having to
-test them on a dedicated CI server.
+- Register a runner that uses the Docker executor. Then all jobs run in a Docker container.
+- Specify an image in your `.gitlab-ci.yml` file. The runner creates a container from this image
+ and runs the jobs in it.
+- Optional. Specify other images in your `.gitlab-ci.yml` file. These containers are known as
+ ["services"](#what-is-a-service) and you can use them to run services like MySQL separately.
-## Register Docker Runner
+## Register a runner that uses the Docker executor
-To use GitLab Runner with Docker you need to [register a new runner](https://docs.gitlab.com/runner/register/)
-to use the `docker` executor.
+To use GitLab Runner with Docker you need to [register a runner](https://docs.gitlab.com/runner/register/)
+that uses the Docker executor.
In this example, we first set up a temporary template to supply the services:
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 2122cf2bf16..0344e736dd4 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Building images with kaniko and GitLab CI/CD
+# Use kaniko to build Docker images
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45512) in GitLab 11.2. Requires GitLab Runner 11.2 and above.
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index eecc8ffd18f..358117ed796 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -74,15 +74,15 @@ runs by enabling the [Skip outdated deployment jobs](../pipelines/settings.md#sk
Example of a problematic pipeline flow **before** enabling Skip outdated deployment jobs:
-1. Pipeline-A is created on the `master` branch.
-1. Later, Pipeline-B is created on the `master` branch (with a newer commit SHA).
+1. Pipeline-A is created on the default branch.
+1. Later, Pipeline-B is created on the default branch (with a newer commit SHA).
1. The `deploy` job in Pipeline-B finishes first, and deploys the newer code.
1. The `deploy` job in Pipeline-A finished later, and deploys the older code, **overwriting** the newer (latest) deployment.
The improved pipeline flow **after** enabling Skip outdated deployment jobs:
-1. Pipeline-A is created on the `master` branch.
-1. Later, Pipeline-B is created on the `master` branch (with a newer SHA).
+1. Pipeline-A is created on the default branch.
+1. Later, Pipeline-B is created on the default branch (with a newer SHA).
1. The `deploy` job in Pipeline-B finishes first, and deploys the newer code.
1. The `deploy` job in Pipeline-A is automatically cancelled, so that it doesn't overwrite the deployment from the newer pipeline.
diff --git a/doc/ci/environments/img/deployments_list.png b/doc/ci/environments/img/deployments_list.png
new file mode 100644
index 00000000000..95afc092d86
--- /dev/null
+++ b/doc/ci/environments/img/deployments_list.png
Binary files differ
diff --git a/doc/ci/environments/img/environment_auto_stop_v13_10.png b/doc/ci/environments/img/environment_auto_stop_v13_10.png
new file mode 100644
index 00000000000..1525f670ff2
--- /dev/null
+++ b/doc/ci/environments/img/environment_auto_stop_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_dynamic_groups_v13_10.png b/doc/ci/environments/img/environments_dynamic_groups_v13_10.png
new file mode 100644
index 00000000000..cf3f9f7c781
--- /dev/null
+++ b/doc/ci/environments/img/environments_dynamic_groups_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_list.png b/doc/ci/environments/img/environments_list.png
new file mode 100644
index 00000000000..6ddfd858ab6
--- /dev/null
+++ b/doc/ci/environments/img/environments_list.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png b/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png
new file mode 100644
index 00000000000..13c8d1cd523
--- /dev/null
+++ b/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png b/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png
new file mode 100644
index 00000000000..fcc3e2b6631
--- /dev/null
+++ b/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index b49fcd72172..abb12852fac 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -10,261 +10,149 @@ disqus_identifier: 'https://docs.gitlab.com/ee/ci/environments.html'
> Introduced in GitLab 8.9.
-Environments allow control of the continuous deployment of your software,
-all within GitLab.
+Environments describe where code is deployed.
-## Introduction
-
-There are many stages required in the software development process before the software is ready
-for public consumption.
-
-For example:
-
-1. Develop your code.
-1. Test your code.
-1. Deploy your code into a testing or staging environment before you release it to the public.
-
-This helps find bugs in your software, and also in the deployment process as well.
-
-GitLab CI/CD is capable of not only testing or building your projects, but also
-deploying them in your infrastructure, with the added benefit of giving you a
-way to track your deployments. In other words, you always know what is
-currently being deployed or has been deployed on your servers.
-
-It's important to know that:
-
-- Environments are like tags for your CI jobs, describing where code gets deployed.
-- Deployments are created when [GitLab CI/CD](../yaml/README.md) is used to deploy versions of code to environments.
+Each time [GitLab CI/CD](../yaml/README.md) deploys a version of code to an environment,
+a deployment is created.
GitLab:
-- Provides a full history of your deployments for each environment.
-- Keeps track of your deployments, so you always know what is currently being deployed on your
+- Provides a full history of deployments to each environment.
+- Tracks your deployments, so you always know what is deployed on your
servers.
-If you have a deployment service such as [Kubernetes](../../user/project/clusters/index.md)
-associated with your project, you can use it to assist with your deployments, and
-can even access a [web terminal](#web-terminals) for your environment from within GitLab!
-
-## Configuring environments
-
-Configuring environments involves:
-
-1. Understanding how [pipelines](../pipelines/index.md) work.
-1. Defining environments in your project's [`.gitlab-ci.yml`](../yaml/README.md) file.
-1. Creating a job configured to deploy your application. For example, a deploy job configured with [`environment`](../yaml/README.md#environment) to deploy your application to a [Kubernetes cluster](../../user/project/clusters/index.md).
-
-The rest of this section illustrates how to configure environments and deployments using
-an example scenario. It assumes you have already:
-
-- Created a [project](../../user/project/working_with_projects.md#create-a-project) in GitLab.
-- Set up [a runner](../runners/README.md).
-
-In the scenario:
-
-- We are developing an application.
-- We want to run tests and build our app on all branches.
-- Our default branch is `master`.
-- We deploy the app only when a pipeline on `master` branch is run.
-
-### Defining environments
-
-Let's consider the following `.gitlab-ci.yml` example:
-
-```yaml
-stages:
- - test
- - build
- - deploy
-
-test:
- stage: test
- script: echo "Running tests"
-
-build:
- stage: build
- script: echo "Building the app"
+If you have a deployment service like [Kubernetes](../../user/project/clusters/index.md)
+associated with your project, you can use it to assist with your deployments.
+You can even access a [web terminal](#web-terminals) for your environment from within GitLab.
-deploy_staging:
- stage: deploy
- script:
- - echo "Deploy to staging server"
- environment:
- name: staging
- url: https://staging.example.com
- only:
- - master
-```
+## View environments and deployments
-We have defined three [stages](../yaml/README.md#stages):
+Prerequisites:
-- `test`
-- `build`
-- `deploy`
+- You must have a minimum of [Reporter permission](../../user/permissions.md#project-members-permissions).
-The jobs assigned to these stages run in this order. If any job fails, then
-the pipeline fails and jobs that are assigned to the next stage don't run.
+To view a list of environments and deployments:
-In our case:
+1. Go to the project's **Operations > Environments** page.
+ The environments are displayed.
-- The `test` job runs first.
-- Then the `build` job.
-- Lastly the `deploy_staging` job.
+ ![Environments list](img/environments_list.png)
-With this configuration, we:
+1. To view a list of deployments for an environment, select the environment name,
+ for example, `staging`.
-- Check that the tests pass.
-- Ensure that our app is able to be built successfully.
-- Lastly we deploy to the staging server.
+ ![Deployments list](img/deployments_list.png)
-Note that the `environment` keyword defines where the app is deployed. The environment `name` and
-`url` is exposed in various places within GitLab. Each time a job that has an environment specified
-succeeds, a deployment is recorded along with the Git SHA and environment name.
+Deployments show up in this list only after a deployment job has created them.
-WARNING:
-Some characters are not allowed in environment names. Use only letters,
-numbers, spaces, and `-`, `_`, `/`, `{`, `}`, or `.`. Also, it must not start nor end with `/`.
+## Types of environments
-In summary, with the above `.gitlab-ci.yml` we have achieved the following:
+There are two types of environments:
-- All branches run the `test` and `build` jobs.
-- The `deploy_staging` job runs [only](../yaml/README.md#onlyexcept-basic) on the `master`
- branch, which means all merge requests that are created from branches don't
- get deployed to the staging server.
-- When a merge request is merged, all jobs run and the `deploy_staging`
- job deploys our code to a staging server while the deployment
- is recorded in an environment named `staging`.
+- Static environments have static names, like `staging` or `production`.
+- Dynamic environments have dynamic names. Dynamic environments
+ are a fundamental part of [Review apps](../review_apps/index.md).
-#### CI/CD variables and runners
+### Create a static environment
-Starting with GitLab 8.15, the environment name is exposed to the runner in
-two forms:
+You can create an environment and deployment in the UI or in your `.gitlab-ci.yml` file.
-- `$CI_ENVIRONMENT_NAME`. The name given in `.gitlab-ci.yml` (with any CI/CD variables
- expanded).
-- `$CI_ENVIRONMENT_SLUG`. A "cleaned-up" version of the name, suitable for use in URLs,
- DNS, etc.
+In the UI:
-If you change the name of an existing environment, the:
+1. Go to the project's **Operations > Environments** page.
+1. Select **New environment**.
+1. Enter a name and external URL.
+1. Select **Save**.
-- `$CI_ENVIRONMENT_NAME` variable is updated with the new environment name.
-- `$CI_ENVIRONMENT_SLUG` variable remains unchanged to prevent unintended side
- effects.
+In your `.gitlab-ci.yml` file:
-Starting with GitLab 9.3, the environment URL is exposed to the runner via
-`$CI_ENVIRONMENT_URL`. The URL is expanded from either:
+1. Specify a name for the environment and optionally, a URL, which determines the deployment URL.
+ For example:
-- `.gitlab-ci.yml`.
-- The external URL from the environment if not defined in `.gitlab-ci.yml`.
+ ```yaml
+ deploy_staging:
+ stage: deploy
+ script:
+ - echo "Deploy to staging server"
+ environment:
+ name: staging
+ url: https://staging.example.com
+ ```
-#### Set dynamic environment URLs after a job finishes
+1. Trigger a deployment. (For example, by creating and pushing a commit.)
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17066) in GitLab 12.9.
+When the job runs, the environment and deployment are created.
-In a job script, you can specify a static [environment URL](#using-the-environment-url).
-However, there may be times when you want a dynamic URL. For example,
-if you deploy a Review App to an external hosting
-service that generates a random URL per deployment, like `https://94dd65b.amazonaws.com/qa-lambda-1234567`,
-you don't know the URL before the deployment script finishes.
-If you want to use the environment URL in GitLab, you would have to update it manually.
-
-To address this problem, you can configure a deployment job to report back a set of
-variables, including the URL that was dynamically-generated by the external service.
-GitLab supports the [dotenv (`.env`)](https://github.com/bkeepers/dotenv) file format,
-and expands the `environment:url` value with variables defined in the `.env` file.
-
-To use this feature, specify the
-[`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see [Set dynamic URLs after a job finished](https://youtu.be/70jDXtOf4Ig).
+NOTE:
+Some characters cannot be used in environment names.
+For more information about the `environment` keywords, see
+[the `.gitlab-ci.yml` keyword reference](../yaml/README.md#environment).
-##### Example of setting dynamic environment URLs
+### Create a dynamic environment
-The following example shows a Review App that creates a new environment
-per merge request. The `review` job is triggered by every push, and
-creates or updates an environment named `review/your-branch-name`.
-The environment URL is set to `$DYNAMIC_ENVIRONMENT_URL`:
+To create a dynamic name and URL for an environment, you can use
+[predefined CI/CD variables](../variables/predefined_variables.md). For example:
```yaml
-review:
- script:
- - DYNAMIC_ENVIRONMENT_URL=$(deploy-script) # In script, get the environment URL.
- - echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> deploy.env # Add the value to a dotenv file.
- artifacts:
- reports:
- dotenv: deploy.env # Report back dotenv file to rails.
- environment:
- name: review/$CI_COMMIT_REF_SLUG
- url: $DYNAMIC_ENVIRONMENT_URL # and set the variable produced in script to `environment:url`
- on_stop: stop_review
-
-stop_review:
+deploy_review:
+ stage: deploy
script:
- - ./teardown-environment
- when: manual
+ - echo "Deploy a review app"
environment:
- name: review/$CI_COMMIT_REF_SLUG
- action: stop
+ name: review/$CI_COMMIT_REF_NAME
+ url: https://$CI_ENVIRONMENT_SLUG.example.com
+ only:
+ - branches
+ except:
+ - master
```
-As soon as the `review` job finishes, GitLab updates the `review/your-branch-name`
-environment's URL.
-It parses the `deploy.env` report artifact, registers a list of variables as runtime-created,
-uses it for expanding `environment:url: $DYNAMIC_ENVIRONMENT_URL` and sets it to the environment URL.
-You can also specify a static part of the URL at `environment:url:`, such as
-`https://$DYNAMIC_ENVIRONMENT_URL`. If the value of `DYNAMIC_ENVIRONMENT_URL` is
-`example.com`, the final result is `https://example.com`.
+In this example:
-The assigned URL for the `review/your-branch-name` environment is [visible in the UI](#using-the-environment-url).
+- The `name` is `review/$CI_COMMIT_REF_NAME`. Because the [environment name](../yaml/README.md#environmentname)
+ can contain slashes (`/`), you can use this pattern to distinguish between dynamic and static environments.
+- For the `url`, you could use `$CI_COMMIT_REF_NAME`, but because this value
+ may contain a `/` or other characters that would not be valid in a domain name or URL,
+ use `$CI_ENVIRONMENT_SLUG` instead. The `$CI_ENVIRONMENT_SLUG` variable is guaranteed to be unique.
-Note the following:
+You do not have to use the same prefix or only slashes (`/`) in the dynamic environment name.
+However, when you use this format, you can [group similar environments](#group-similar-environments).
-- `stop_review` doesn't generate a dotenv report artifact, so it doesn't recognize the
- `DYNAMIC_ENVIRONMENT_URL` environment variable. Therefore you shouldn't set `environment:url:` in the
- `stop_review` job.
-- If the environment URL isn't valid (for example, the URL is malformed), the system doesn't update
- the environment URL.
-- If the script that runs in `stop_review` exists only in your repository and therefore can't use
- `GIT_STRATEGY: none`, configure [pipelines for merge requests](../../ci/merge_request_pipelines/index.md)
- for these jobs. This ensures that runners can fetch the repository even after a feature branch is
- deleted. For more information, see [Ref Specs for Runners](../pipelines/index.md#ref-specs-for-runners).
+NOTE:
+Some variables cannot be used as environment names or URLs.
+For more information about the `environment` keywords, see
+[the `.gitlab-ci.yml` keyword reference](../yaml/README.md#environment).
-### Configuring manual deployments
+## Deployment tier of environments (**FREE**)
-Adding `when: manual` to an automatically executed job's configuration converts it to
-a job requiring manual action.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300741) in GitLab 13.10.
-To expand on the [previous example](#defining-environments), the following includes
-another job that deploys our app to a production server and is
-tracked by a `production` environment.
+There are cases where you might want to use a code name as an environment name instead of using
+an [industry standard](https://en.wikipedia.org/wiki/Deployment_environment). For example, your environment might be called `customer-portal` instead of `production`.
+This is perfectly fine, however, it loses information that the specific
+environment is used as production.
-The `.gitlab-ci.yml` file for this is as follows:
+To keep information that a specific environment is for production or
+some other use, you can set one of the following tiers to each environment:
-```yaml
-stages:
- - test
- - build
- - deploy
+| Environment tier | Environment names examples |
+| ---- | -------- |
+| `production` | Production, Live |
+| `staging` | Staging, Model, Pre, Demo |
+| `testing` | Test, QC |
+| `development` | Dev, [Review apps](../review_apps/index.md), Trunk |
+| `other` | |
-test:
- stage: test
- script: echo "Running tests"
+By default, an approximate tier is automatically guessed and set from [the environment name](../yaml/README.md#environmentname).
+Alternatively, you can specify a specific tier with `deployment_tier` keyword,
+see the [`.gitlab-ci.yml` syntax reference](../yaml/README.md#environmentdeployment_tier) for more details.
-build:
- stage: build
- script: echo "Building the app"
+## Configure manual deployments
-deploy_staging:
- stage: deploy
- script:
- - echo "Deploy to staging server"
- environment:
- name: staging
- url: https://staging.example.com
- only:
- - master
+You can create a job that requires someone to manually start the deployment.
+For example:
+```yaml
deploy_prod:
stage: deploy
script:
@@ -279,106 +167,12 @@ deploy_prod:
The `when: manual` action:
-- Exposes a "play" button in the GitLab UI for that job.
-- Means the `deploy_prod` job is only triggered when the "play" button is clicked.
-
-You can find the "play" button in the pipelines, environments, deployments, and jobs views.
-
-| View | Screenshot |
-|:----------------|:-------------------------------------------------------------------------------|
-| Pipelines | ![Pipelines manual action](../img/environments_manual_action_pipelines.png) |
-| Single pipeline | ![Pipelines manual action](../img/environments_manual_action_single_pipeline.png) |
-| Environments | ![Environments manual action](../img/environments_manual_action_environments.png) |
-| Deployments | ![Deployments manual action](../img/environments_manual_action_deployments.png) |
-| Jobs | ![Builds manual action](../img/environments_manual_action_jobs.png) |
-
-Clicking the play button in any view triggers the `deploy_prod` job. The deployment is recorded as a
-new environment named `production`.
-
-If your environment's name is `production` (all lowercase), it's recorded in
-[Value Stream Analytics](../../user/analytics/value_stream_analytics.md).
-
-### Configuring dynamic environments
-
-Regular environments are good when deploying to "stable" environments like staging or production.
-
-However, for environments for branches other than `master`, dynamic environments
-can be used. Dynamic environments make it possible to create environments on the fly by
-declaring their names dynamically in `.gitlab-ci.yml`.
-
-Dynamic environments are a fundamental part of [Review apps](../review_apps/index.md).
-
-#### Allowed variables
-
-The `name` and `url` keywords for dynamic environments can use most available CI/CD variables,
-including:
-
-- [Predefined CI/CD variables](../variables/README.md#predefined-cicd-variables)
-- [Project and group CI/CD variables](../variables/README.md)
-- [`.gitlab-ci.yml` CI/CD variables](../yaml/README.md#variables)
-
-However, you cannot use variables defined:
-
-- Under `script`.
-- On the runner's side.
-
-There are also other variables that are unsupported in the context of `environment:name`.
-For more information, see [Where variables can be used](../variables/where_variables_can_be_used.md).
+- Exposes a play button for the job in the GitLab UI.
+- Means the `deploy_prod` job is only triggered when the play button is clicked.
-#### Example configuration
+You can find the play button in the pipelines, environments, deployments, and jobs views.
-Runners expose various [predefined CI/CD variables](../variables/predefined_variables.md) when a job runs, so
-you can use them as environment names.
-
-In the following example, the job deploys to all branches except `master`:
-
-```yaml
-deploy_review:
- stage: deploy
- script:
- - echo "Deploy a review app"
- environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_ENVIRONMENT_SLUG.example.com
- only:
- - branches
- except:
- - master
-```
-
-In this example:
-
-- The job's name is `deploy_review` and it runs on the `deploy` stage.
-- We set the `environment` with the `environment:name` as `review/$CI_COMMIT_REF_NAME`.
- Since the [environment name](../yaml/README.md#environmentname) can contain slashes (`/`), we can
- use this pattern to distinguish between dynamic and regular environments.
-- We tell the job to run [`only`](../yaml/README.md#onlyexcept-basic) on branches,
- [`except`](../yaml/README.md#onlyexcept-basic) `master`.
-
-For the value of:
-
-- `environment:name`, the first part is `review`, followed by a `/` and then `$CI_COMMIT_REF_NAME`,
- which receives the value of the branch name.
-- `environment:url`, we want a specific and distinct URL for each branch. `$CI_COMMIT_REF_NAME`
- may contain a `/` or other characters that would be invalid in a domain name or URL,
- so we use `$CI_ENVIRONMENT_SLUG` to guarantee that we get a valid URL.
-
- For example, given a `$CI_COMMIT_REF_NAME` of `100-Do-The-Thing`, the URL is something
- like `https://100-do-the-4f99a2.example.com`. Again, the way you set up
- the web server to serve these requests is based on your setup.
-
- We have used `$CI_ENVIRONMENT_SLUG` here because it is guaranteed to be unique. If
- you're using a workflow like [GitLab Flow](../../topics/gitlab_flow.md), collisions
- are unlikely and you may prefer environment names to be more closely based on the
- branch name. In that case, you could use `$CI_COMMIT_REF_NAME` in `environment:url` in
- the example above: `https://$CI_COMMIT_REF_NAME.example.com`, which would give a URL
- of `https://100-do-the-thing.example.com`.
-
-You aren't required to use the same prefix or only slashes (`/`) in the dynamic environments' names.
-However, using this format enables the [grouping similar environments](#grouping-similar-environments)
-feature.
-
-### Configuring Kubernetes deployments
+## Configure Kubernetes deployments
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
@@ -413,237 +207,147 @@ deploy:
- master
```
-When deploying to a Kubernetes cluster using the GitLab Kubernetes integration,
-information about the cluster and namespace is displayed above the job
+When you use the GitLab Kubernetes integration to deploy to a Kubernetes cluster,
+cluster and namespace information is displayed above the job
trace on the deployment job page:
![Deployment cluster information](../img/environments_deployment_cluster_v12_8.png)
-#### Configuring incremental rollouts
+### Configure incremental rollouts
Learn how to release production changes to only a portion of your Kubernetes pods with
[incremental rollouts](../environments/incremental_rollouts.md).
-### Deployment safety
+## CI/CD variables for environments and deployments
-Deployment jobs can be more sensitive than other jobs in a pipeline,
-and might need to be treated with an extra care. There are multiple features
-in GitLab that helps maintain deployment security and stability.
+When you create an environment, you specify the name and URL.
-- [Restrict write-access to a critical environment](deployment_safety.md#restrict-write-access-to-a-critical-environment)
-- [Limit the job-concurrency for deployment jobs](deployment_safety.md#ensure-only-one-deployment-job-runs-at-a-time)
-- [Skip outdated deployment jobs](deployment_safety.md#skip-outdated-deployment-jobs)
-- [Prevent deployments during deploy freeze windows](deployment_safety.md#prevent-deployments-during-deploy-freeze-windows)
+If you want to use the name or URL in another job, you can use:
-### Complete example
+- `$CI_ENVIRONMENT_NAME`. The name defined in the `.gitlab-ci.yml` file.
+- `$CI_ENVIRONMENT_SLUG`. A "cleaned-up" version of the name, suitable for use in URL and DNS, for example.
+ This variable is guaranteed to be unique.
+- `$CI_ENVIRONMENT_URL`. The environment's URL, which was specified in the
+ `.gitlab-ci.yml` file or automatically assigned.
-The configuration in this section provides a full development workflow where your app is:
+If you change the name of an existing environment, the:
-- Tested.
-- Built.
-- Deployed as a Review App.
-- Deployed to a staging server after the merge request is merged.
-- Finally, able to be manually deployed to the production server.
+- `$CI_ENVIRONMENT_NAME` variable is updated with the new environment name.
+- `$CI_ENVIRONMENT_SLUG` variable remains unchanged to prevent unintended side
+ effects.
-The following combines the previous configuration examples, including:
+## Set dynamic environment URLs after a job finishes
-- Defining [simple environments](#defining-environments) for testing, building, and deployment to staging.
-- Adding [manual actions](#configuring-manual-deployments) for deployment to production.
-- Creating [dynamic environments](#configuring-dynamic-environments) for deployments for reviewing.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17066) in GitLab 12.9.
-```yaml
-stages:
- - test
- - build
- - deploy
+In a job script, you can specify a static environment URL.
+However, there may be times when you want a dynamic URL. For example,
+if you deploy a Review App to an external hosting
+service that generates a random URL per deployment, like `https://94dd65b.amazonaws.com/qa-lambda-1234567`.
+In this case, you don't know the URL before the deployment script finishes.
+If you want to use the environment URL in GitLab, you would have to update it manually.
-test:
- stage: test
- script: echo "Running tests"
+To address this problem, you can configure a deployment job to report back a set of
+variables. These variables include the URL that was dynamically-generated by the external service.
+GitLab supports the [dotenv (`.env`)](https://github.com/bkeepers/dotenv) file format,
+and expands the `environment:url` value with variables defined in the `.env` file.
-build:
- stage: build
- script: echo "Building the app"
+To use this feature, specify the
+[`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
-deploy_review:
- stage: deploy
- script:
- - echo "Deploy a review app"
- environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_ENVIRONMENT_SLUG.example.com
- only:
- - branches
- except:
- - master
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see [Set dynamic URLs after a job finished](https://youtu.be/70jDXtOf4Ig).
-deploy_staging:
- stage: deploy
- script:
- - echo "Deploy to staging server"
- environment:
- name: staging
- url: https://staging.example.com
- only:
- - master
+### Example of setting dynamic environment URLs
-deploy_prod:
- stage: deploy
+The following example shows a Review App that creates a new environment
+per merge request. The `review` job is triggered by every push, and
+creates or updates an environment named `review/your-branch-name`.
+The environment URL is set to `$DYNAMIC_ENVIRONMENT_URL`:
+
+```yaml
+review:
script:
- - echo "Deploy to production server"
+ - DYNAMIC_ENVIRONMENT_URL=$(deploy-script) # In script, get the environment URL.
+ - echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> deploy.env # Add the value to a dotenv file.
+ artifacts:
+ reports:
+ dotenv: deploy.env # Report back dotenv file to rails.
environment:
- name: production
- url: https://example.com
- when: manual
- only:
- - master
-```
-
-A more realistic example would also include copying files to a location where a
-webserver (for example, NGINX) could then access and serve them.
-
-The example below copies the `public` directory to `/srv/nginx/$CI_COMMIT_REF_SLUG/public`:
+ name: review/$CI_COMMIT_REF_SLUG
+ url: $DYNAMIC_ENVIRONMENT_URL # and set the variable produced in script to `environment:url`
+ on_stop: stop_review
-```yaml
-review_app:
- stage: deploy
+stop_review:
script:
- - rsync -av --delete public /srv/nginx/$CI_COMMIT_REF_SLUG
+ - ./teardown-environment
+ when: manual
environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_COMMIT_REF_SLUG.example.com
+ name: review/$CI_COMMIT_REF_SLUG
+ action: stop
```
-This example requires that NGINX and GitLab Runner are set up on the server this job runs on.
-
-See the [limitations](#limitations) section for some edge cases regarding the naming of your
-branches and Review Apps.
-
-The complete example provides the following workflow to developers:
-
-- Create a branch locally.
-- Make changes and commit them.
-- Push the branch to GitLab.
-- Create a merge request.
-
-Behind the scenes, the runner:
-
-- Picks up the changes and starts running the jobs.
-- Runs the jobs sequentially as defined in `stages`:
- - First, run the tests.
- - If the tests succeed, build the app.
- - If the build succeeds, the app is deployed to an environment with a name specific to the
- branch.
-
-So now, every branch:
-
-- Gets its own environment.
-- Is deployed to its own unique location, with the added benefit of:
- - Having a [history of deployments](#viewing-deployment-history).
- - Being able to [rollback changes](#retrying-and-rolling-back) if needed.
-
-For more information, see [Using the environment URL](#using-the-environment-url).
+As soon as the `review` job finishes, GitLab updates the `review/your-branch-name`
+environment's URL.
+It parses the `deploy.env` report artifact, registers a list of variables as runtime-created,
+uses it for expanding `environment:url: $DYNAMIC_ENVIRONMENT_URL` and sets it to the environment URL.
+You can also specify a static part of the URL at `environment:url:`, such as
+`https://$DYNAMIC_ENVIRONMENT_URL`. If the value of `DYNAMIC_ENVIRONMENT_URL` is
+`example.com`, the final result is `https://example.com`.
-### Protected environments
+The assigned URL for the `review/your-branch-name` environment is visible in the UI.
-Environments can be "protected", restricting access to them.
+Note the following:
-For more information, see [Protected environments](protected_environments.md).
+- `stop_review` doesn't generate a dotenv report artifact, so it doesn't recognize the
+ `DYNAMIC_ENVIRONMENT_URL` environment variable. Therefore you shouldn't set `environment:url:` in the
+ `stop_review` job.
+- If the environment URL isn't valid (for example, the URL is malformed), the system doesn't update
+ the environment URL.
+- If the script that runs in `stop_review` exists only in your repository and therefore can't use
+ `GIT_STRATEGY: none`, configure [pipelines for merge requests](../../ci/merge_request_pipelines/index.md)
+ for these jobs. This ensures that runners can fetch the repository even after a feature branch is
+ deleted. For more information, see [Ref Specs for Runners](../pipelines/index.md#ref-specs-for-runners).
## Working with environments
Once environments are configured, GitLab provides many features for working with them,
as documented below.
-### Viewing environments and deployments
-
-A list of environments and deployment statuses is available on each project's **Operations > Environments** page.
-
-For example:
-
-![Environment view](../img/environments_available_13_7.png)
-
-This example shows:
-
-- The environment's name with a link to its deployments.
-- The last deployment ID number and who performed it.
-- The job ID of the last deployment with its respective job name.
-- The commit information of the last deployment, such as who committed it, to what
- branch, and the Git SHA of the commit.
-- The exact time the last deployment was performed.
-- The upcoming deployment, if a deployment for the environment is in progress.
-- When the environment stops automatically.
-- A button that takes you to the URL that you defined under the `environment` keyword
- in `.gitlab-ci.yml`.
-- A number of deployment actions, including:
- - Prevent the environment from [stopping automatically](#automatically-stopping-an-environment).
- - [Open the live environment](#using-the-environment-url).
- - Trigger [a manual deployment to a different environment](#configuring-manual-deployments).
- - [Retry the deployment](#retrying-and-rolling-back).
- - [Stop the environment](#stopping-an-environment).
-
-The information shown in the **Environments** page is limited to the latest
-deployments, but an environment can have multiple deployments.
-
-> **Notes:**
->
-> - While you can create environments manually in the web interface, we recommend
-> that you define your environments in `.gitlab-ci.yml` first. They will
-> be automatically created for you after the first deploy.
-> - The environments page can only be viewed by users with [Reporter permission](../../user/permissions.md#project-members-permissions)
-> and above. For more information on permissions, see the [permissions documentation](../../user/permissions.md).
-> - Only deploys that happen after your `.gitlab-ci.yml` is properly configured
-> show up in the **Environment** and **Last deployment** lists.
-
-### Viewing deployment history
-
-GitLab keeps track of your deployments, so you:
-
-- Always know what is currently being deployed on your servers.
-- Can have the full history of your deployments for every environment.
-
-Clicking on an environment shows the history of its deployments. Here's an example **Environments** page
-with multiple deployments:
+### Environment rollback
-![Deployments](../img/deployments_view.png)
+When you roll back a deployment on a specific commit,
+a _new_ deployment is created. This deployment has its own unique job ID.
+It points to the commit you're rolling back to.
-This view is similar to the **Environments** page, but all deployments are shown. Also in this view
-is a **Rollback** button. For more information, see [Retrying and rolling back](#retrying-and-rolling-back).
+For the rollback to succeed, the deployment process must be defined in
+the job's `script`.
-### Retrying and rolling back
+#### Retry or roll back a deployment
If there is a problem with a deployment, you can retry it or roll it back.
To retry or rollback a deployment:
-1. Navigate to **Operations > Environments**.
-1. Click on the environment.
-1. In the deployment history list for the environment, click the:
- - **Retry** button next to the last deployment, to retry that deployment.
- - **Rollback** button next to a previously successful deployment, to roll back to that deployment.
+1. Go to the project's **Operations > Environments**.
+1. Select the environment.
+1. To the right of the deployment name:
+ - To retry a deployment, select **Re-deploy to environment**.
+ - To roll back to a deployment, next to a previously successful deployment, select **Rollback environment**.
-#### What to expect with a rollback
+### Environment URL
-Pressing the **Rollback** button on a specific commit triggers a _new_ deployment with its own
-unique job ID. This new deployment points to the commit you're
-rolling back to.
+The [environment URL](../yaml/README.md#environmenturl) is displayed in a few
+places in GitLab:
-Note that the defined deployment process in the job's `script` determines whether the rollback
-succeeds.
-
-### Using the environment URL
-
-The [environment URL](../yaml/README.md#environmenturl) is exposed in a few
-places within GitLab:
-
-- In a merge request widget as a link:
+- In a merge request as a link:
![Environment URL in merge request](../img/environments_mr_review_app.png)
- In the Environments view as a button:
- ![Environment URL in environments](../img/environments_available_13_7.png)
+ ![Environment URL in environments](../img/environments_available_13_10.png)
- In the Deployments view as a button:
![Environment URL in deployments](../img/deployments_view.png)
-You can see this information in a merge request itself if:
+You can see this information in a merge request if:
- The merge request is eventually merged to the default branch (usually `master`).
- That branch also deploys to an environment (for example, `staging` or `production`).
@@ -659,24 +363,27 @@ from source files to public pages in the environment set for Review Apps.
### Stopping an environment
-Stopping an environment:
+When you stop an environment:
-- Moves it from the list of **Available** environments to the list of **Stopped**
- environments on the [**Environments** page](#viewing-environments-and-deployments).
-- Executes an [`on_stop` action](../yaml/README.md#environmenton_stop), if defined.
+- On the **Environments** page, it moves from the list of **Available** environments
+ to the list of **Stopped** environments.
+- An [`on_stop` action](../yaml/README.md#environmenton_stop), if defined, is executed.
-This is often used when multiple developers are working on a project at the same time,
-each of them pushing to their own branches, causing many dynamic environments to be created.
-
-Starting with GitLab 8.14, dynamic environments stop automatically when their associated branch is
+Dynamic environments stop automatically when their associated branch is
deleted.
-#### Automatically stopping an environment
+#### Stop an environment when a branch is deleted
+
+You can configure environments to stop when a branch is deleted.
-Environments can be stopped automatically using special configuration.
+The following example shows a `deploy_review` job that calls a `stop_review` job
+to clean up and stop the environment. The `stop_review` job must be in the same
+`stage` as the `deploy_review` job.
-Consider the following example where the `deploy_review` job calls `stop_review`
-to clean up and stop the environment:
+Both jobs must have the same [`rules`](../yaml/README.md#onlyexcept-basic)
+or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration. Otherwise,
+the `stop_review` job might not be included in all pipelines that include the
+`deploy_review` job, and you cannot trigger `action: stop` to stop the environment automatically.
```yaml
deploy_review:
@@ -702,55 +409,30 @@ stop_review:
when: manual
```
-If you can't use [Pipelines for merge requests](../merge_request_pipelines/index.md),
-setting the [`GIT_STRATEGY`](../runners/README.md#git-strategy) to `none` is necessary in the
-`stop_review` job so that the [runner](https://docs.gitlab.com/runner/) doesn't
+If you can't use [pipelines for merge requests](../merge_request_pipelines/index.md),
+set the [`GIT_STRATEGY`](../runners/README.md#git-strategy) to `none` in the
+`stop_review` job. Then the [runner](https://docs.gitlab.com/runner/) doesn't
try to check out the code after the branch is deleted.
-When you have an environment that has a stop action defined (typically when
-the environment describes a Review App), GitLab automatically triggers a
-stop action when the associated branch is deleted. The `stop_review` job must
-be in the same `stage` as the `deploy_review` job in order for the environment
-to automatically stop.
+Read more in the [`.gitlab-ci.yml` reference](../yaml/README.md#environmenton_stop).
-Additionally, both jobs should have matching [`rules`](../yaml/README.md#onlyexcept-basic)
-or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration. In the example
-above, if the configuration isn't identical, the `stop_review` job might not be
-included in all pipelines that include the `deploy_review` job, and it isn't
-possible to trigger `action: stop` to stop the environment automatically.
-
-You can read more in the [`.gitlab-ci.yml` reference](../yaml/README.md#environmenton_stop).
-
-#### Environments auto-stop
+#### Stop an environment after a certain time period
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20956) in GitLab 12.8.
-You can set an expiry time for environments and stop them automatically after a certain period.
-
-For example, consider the use of this feature with Review App environments. When you set up Review
-Apps, sometimes they keep running for a long time because some merge requests are left open and
-forgotten. Such idle environments waste resources and should be terminated as soon as possible.
-
-To address this problem, you can specify an optional expiration date for Review App environments.
-When the expiry time is reached, GitLab automatically triggers a job to stop the environment,
-eliminating the need of manually doing so. In case an environment is updated, the expiration is
-renewed ensuring that only active merge requests keep running Review Apps.
+You can set environments to stop automatically after a certain time period.
-To enable this feature, you must specify the [`environment:auto_stop_in`](../yaml/README.md#environmentauto_stop_in)
-keyword in `.gitlab-ci.yml`. You can specify a human-friendly date as the value, such as
-`1 hour and 30 minutes` or `1 day`. `auto_stop_in` uses the same format of
-[`artifacts:expire_in` docs](../yaml/README.md#artifactsexpire_in).
+In your `.gitlab-ci.yml` file, specify the [`environment:auto_stop_in`](../yaml/README.md#environmentauto_stop_in)
+keyword. You can specify a human-friendly date as the value, such as `1 hour and 30 minutes` or `1 day`.
+After the time period passes, GitLab automatically triggers a job to stop the environment.
-Note that due to resource limitation, a background worker for stopping environments only runs once
+Due to resource limitations, a background worker for stopping environments only runs once
every hour. This means that environments aren't stopped at the exact timestamp specified, but are
instead stopped when the hourly cron worker detects expired environments.
-##### Auto-stop example
-
-In the following example, there is a basic review app setup that creates a new environment
-per merge request. The `review_app` job is triggered by every push and
-creates or updates an environment named `review/your-branch-name`.
-The environment keeps running until `stop_review_app` is executed:
+In the following example, each merge request creates a new Review App environment.
+Each push triggers the `review_app` job and an environment named `review/your-branch-name`
+is created or updated. The environment runs until `stop_review_app` is executed:
```yaml
review_app:
@@ -772,54 +454,54 @@ stop_review_app:
when: manual
```
-As long as a merge request is active and keeps getting new commits,
-the review app doesn't stop, so developers don't need to worry about
-re-initiating review app.
+As long as the merge request is active and keeps getting new commits,
+the Review App doesn't stop. Developers don't need to worry about
+re-initiating Review App.
-On the other hand, since `stop_review_app` is set to `auto_stop_in: 1 week`,
-if a merge request becomes inactive for more than a week,
+Because `stop_review_app` is set to `auto_stop_in: 1 week`,
+if a merge request is inactive for more than a week,
GitLab automatically triggers the `stop_review_app` job to stop the environment.
-You can also check the expiration date of environments through the GitLab UI. To do so,
-go to **Operations > Environments > Environment**. You can see the auto-stop period
-at the left-top section and a pin-mark button at the right-top section. This pin-mark
-button can be used to prevent auto-stopping the environment. By clicking this button, the
-`auto_stop_in` setting is overwritten and the environment is active until it's stopped manually.
+#### View a deployment's scheduled stop time
-![Environment auto stop](../img/environment_auto_stop_v12_8.png)
+You can view a deployment's expiration date in the GitLab UI.
-#### Delete a stopped environment
+1. Go to the project's **Operations > Environments** page.
+1. Select the name of the deployment.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20620) in GitLab 12.10.
+In the top left, next to the environment name, the expiration date is displayed.
-You can delete [stopped environments](#stopping-an-environment) in one of two
-ways: through the GitLab UI or through the API.
+#### Override a deployment's scheduled stop time
-##### Delete environments through the UI
+You can manually override a deployment's expiration date.
-To view the list of **Stopped** environments, navigate to **Operations > Environments**
-and click the **Stopped** tab.
+1. Go to the project's **Operations > Environments** page.
+1. Select the deployment name.
+1. In the top right, select the thumbtack (**{thumbtack}**).
-From there, you can click the **Delete** button directly, or you can click the
-environment name to see its details and **Delete** it from there.
+![Environment auto stop](img/environment_auto_stop_v13_10.png)
-You can also delete environments by viewing the details for a
-stopped environment:
+The `auto_stop_in` setting is overwritten and the environment remains active until it's stopped manually.
- 1. Navigate to **Operations > Environments**.
- 1. Click on the name of an environment within the **Stopped** environments list.
- 1. Click on the **Delete** button that appears at the top for all stopped environments.
- 1. Finally, confirm your chosen environment in the modal that appears to delete it.
+#### Delete a stopped environment
-##### Delete environments through the API
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20620) in GitLab 12.10.
+
+You can delete [stopped environments](#stopping-an-environment) in the GitLab UI or by using
+[the API](../../api/environments.md#delete-an-environment).
-Environments can also be deleted by using the [Environments API](../../api/environments.md#delete-an-environment).
+To delete a stopped environment in the GitLab UI:
+
+1. Go to the project's **Operations > Environments** page.
+1. Select the **Stopped** tab.
+1. Next to the environment you want to delete, select **Delete environment**.
+1. On the confirmation dialog box, select **Delete environment**.
### Prepare an environment
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208655) in GitLab 13.2.
-By default, GitLab creates a [deployment](#viewing-deployment-history) every time a
+By default, GitLab creates a deployment every time a
build with the specified environment runs. Newer deployments can also
[cancel older ones](deployment_safety.md#skip-outdated-deployment-jobs).
@@ -840,19 +522,19 @@ build:
url: https://staging.example.com
```
-### Grouping similar environments
+### Group similar environments
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7015) in GitLab 8.14.
-As documented in [Configuring dynamic environments](#configuring-dynamic-environments), you can
-prepend environment name with a word, followed by a `/`, and finally the branch
-name, which is automatically defined by the `CI_COMMIT_REF_NAME` predefined CI/CD variable.
+You can group environments into collapsible sections in the UI.
+
+For example, if all of your environments start with the name `review`,
+then in the UI, the environments are grouped under that heading:
-In short, environments that are named like `type/foo` are all presented under the same
-group, named `type`.
+![Environment groups](img/environments_dynamic_groups_v13_10.png)
-In our [minimal example](#example-configuration), we named the environments `review/$CI_COMMIT_REF_NAME`
-where `$CI_COMMIT_REF_NAME` is the branch name. Here is a snippet of the example:
+The following example shows how to start your environment names with `review`.
+The `$CI_COMMIT_REF_NAME` variable is populated with the branch name at runtime:
```yaml
deploy_review:
@@ -863,11 +545,6 @@ deploy_review:
name: review/$CI_COMMIT_REF_NAME
```
-In this case, if you visit the **Environments** page and the branches
-exist, you should see something like:
-
-![Environment groups](../img/environments_dynamic_groups.png)
-
### Environment incident management
You have successfully setup a Continuous Delivery/Deployment workflow in your project.
@@ -897,7 +574,7 @@ severity is shown, so you can identify which environments need immediate attenti
When the issue that triggered the alert is resolved, it is removed and is no
longer visible on the environment page.
-If the alert requires a [rollback](#retrying-and-rolling-back), you can select the
+If the alert requires a [rollback](#retry-or-roll-back-a-deployment), you can select the
deployment tab from the environment page and select which deployment to roll back to.
#### Auto Rollback **(ULTIMATE)**
@@ -939,8 +616,6 @@ Once configured, GitLab attempts to retrieve [supported performance metrics](../
for any environment that has had a successful deployment. If monitoring data was
successfully retrieved, a **Monitoring** button appears for each environment.
-![Environment Detail with Metrics](../img/deployments_view.png)
-
Clicking the **Monitoring** button displays a new page showing up to the last
8 hours of performance data. It may take a minute or two for data to appear
after initial deployment.
@@ -971,13 +646,13 @@ Note that container-based deployments often lack basic tools (like an editor), a
be stopped or restarted at any time. If this happens, you lose all your
changes. Treat this as a debugging tool, not a comprehensive online IDE.
-Once enabled, your environments gain a **Terminal** button:
+Once enabled, your environments display a **Terminal** button:
-![Terminal button on environment index](../img/environments_terminal_button_on_index.png)
+![Terminal button on environment index](img/environments_terminal_button_on_index_v13_10.png)
You can also access the terminal button from the page for a specific environment:
-![Terminal button for an environment](../img/environments_terminal_button_on_show.png)
+![Terminal button for an environment](img/environments_terminal_button_on_show_v13_10.png)
Wherever you find it, clicking the button takes you to a separate page to
establish the terminal session:
@@ -1054,24 +729,15 @@ such as [Review Apps](../review_apps/index.md) (`review/*`).
Note that the most _specific_ spec takes precedence over the other wildcard matching. In this case,
the `review/feature-1` spec takes precedence over `review/*` and `*` specs.
-### Environments Dashboard **(PREMIUM)**
-
-See [Environments Dashboard](../environments/environments_dashboard.md) for a summary of each
-environment's operational health.
-
-## Limitations
-
-In the `environment: name`, you are limited to only the [predefined CI/CD variables](../variables/predefined_variables.md).
-Re-using variables defined inside `script` as part of the environment name doesn't work.
-
-## Further reading
-
-Below are some links you may find interesting:
+## Related topics
-- [The `.gitlab-ci.yml` definition of environments](../yaml/README.md#environment)
-- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
-- [Review Apps - Use dynamic environments to deploy your code for every branch](../review_apps/index.md)
-- [Deploy Boards for your applications running on Kubernetes](../../user/project/deploy_boards.md)
+- [Use GitLab CI to deploy to multiple environments (blog post)](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
+- [Review Apps](../review_apps/index.md): Use dynamic environments to deploy your code for every branch.
+- [Deploy Boards](../../user/project/deploy_boards.md): View the status of your applications running on Kubernetes.
+- [Protected environments](protected_environments.md): Determine who can deploy code to your environments.
+- [Environments Dashboard](../environments/environments_dashboard.md): View a summary of each
+ environment's operational health. **(PREMIUM)**
+- [Deployment safety](deployment_safety.md#restrict-write-access-to-a-critical-environment): Secure your deployments.
<!-- ## Troubleshooting
diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md
index 2636e59723a..9a639fde5f6 100644
--- a/doc/ci/environments/protected_environments.md
+++ b/doc/ci/environments/protected_environments.md
@@ -70,7 +70,7 @@ Alternatively, you can use the API to protect an environment:
name: ${CI_JOB_NAME}
```
-1. Use the UI to [create a new group](../../user/group/index.md#create-a-new-group).
+1. Use the UI to [create a new group](../../user/group/index.md#create-a-group).
For example, this group is called `protected-access-group` and has the group ID `9899826`. Note
that the rest of the examples in these steps use this group.
@@ -125,10 +125,18 @@ they have the following privileges:
## Deployment-only access to protected environments
Users granted access to a protected environment, but not push or merge access
-to the branch deployed to it, are only granted access to deploy the environment.
+to the branch deployed to it, are only granted access to deploy the environment. An individual in a
+group with the Reporter permission, or in groups added to the project with Reporter permissions,
+appears in the dropdown menu for deployment-only access.
-Note that deployment-only access is the only possible access level for users with
-[Reporter permissions](../../user/permissions.md).
+To add deployment-only access:
+
+1. Add a group with Reporter permissions.
+1. Add user(s) to the group.
+1. Invite the group to be a project member.
+1. Follow the steps outlined in [Protecting Environments](#protecting-environments).
+
+Note that deployment-only access is the only possible access level for groups with [Reporter permissions](../../user/permissions.md).
## Modifying and unprotecting environments
diff --git a/doc/ci/examples/README.md b/doc/ci/examples/README.md
index b48dd561a66..fc6807fd191 100644
--- a/doc/ci/examples/README.md
+++ b/doc/ci/examples/README.md
@@ -25,7 +25,6 @@ The following table lists examples with step-by-step tutorials that are containe
| Use case | Resource |
|-------------------------------|----------|
| Browser performance testing | [Browser Performance Testing with the Sitespeed.io container](../../user/project/merge_requests/browser_performance_testing.md). |
-| Clojure | [Test a Clojure application with GitLab CI/CD](test-clojure-application.md). |
| Deployment with Dpl | [Using `dpl` as deployment tool](deployment/README.md). |
| GitLab Pages | See the [GitLab Pages](../../user/project/pages/index.md) documentation for a complete example of deploying a static site. |
| End-to-end testing | [End-to-end testing with GitLab CI/CD and WebdriverIO](end_to_end_testing_webdriverio/index.md). |
@@ -35,8 +34,6 @@ The following table lists examples with step-by-step tutorials that are containe
| PHP with Laravel, Envoy | [Test and deploy Laravel applications with GitLab CI/CD and Envoy](laravel_with_gitlab_and_envoy/index.md). |
| PHP with npm, SCP | [Running Composer and npm scripts with deployment via SCP in GitLab CI/CD](deployment/composer-npm-deploy.md). |
| PHP with PHPunit, `atoum` | [Testing PHP projects](php.md). |
-| Python on Heroku | [Test and deploy a Python application with GitLab CI/CD](test-and-deploy-python-application-to-heroku.md). |
-| Ruby on Heroku | [Test and deploy a Ruby application with GitLab CI/CD](test-and-deploy-ruby-application-to-heroku.md). |
| Secrets management with Vault | [Authenticating and Reading Secrets With HashiCorp Vault](authenticating-with-hashicorp-vault/index.md). |
### Contributed examples
@@ -47,10 +44,13 @@ separate example projects:
| Use case | Resource |
|-------------------------------|----------|
+| Clojure | [Test a Clojure application with GitLab CI/CD](https://gitlab.com/gitlab-examples/clojure-web-application). |
| Game development | [DevOps and Game Development with GitLab CI/CD](https://gitlab.com/gitlab-examples/gitlab-game-demo/). |
| Java with Maven | [How to deploy Maven projects to Artifactory with GitLab CI/CD](https://gitlab.com/gitlab-examples/maven/simple-maven-example). |
| Java with Spring Boot | [Deploy a Spring Boot application to Cloud Foundry with GitLab CI/CD](https://gitlab.com/gitlab-examples/spring-gitlab-cf-deploy-demo). |
| Parallel testing Ruby & JS | [GitLab CI/CD parallel jobs testing for Ruby & JavaScript projects](https://docs.knapsackpro.com/2019/how-to-run-parallel-jobs-for-rspec-tests-on-gitlab-ci-pipeline-and-speed-up-ruby-javascript-testing). |
+| Python on Heroku | [Test and deploy a Python application with GitLab CI/CD](https://gitlab.com/gitlab-examples/python-getting-started). |
+| Ruby on Heroku | [Test and deploy a Ruby application with GitLab CI/CD](https://gitlab.com/gitlab-examples/ruby-getting-started). |
| Scala on Heroku | [Test and deploy a Scala application to Heroku](https://gitlab.com/gitlab-examples/scala-sbt). |
## CI/CD templates
diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
index 2d8c92a1a74..40ba7cff5f9 100644
--- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
+++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
@@ -53,7 +53,9 @@ The JWT's payload looks like this:
"job_id": "1212", #
"ref": "auto-deploy-2020-04-01", # Git ref for this job
"ref_type": "branch", # Git ref type, branch or tag
- "ref_protected": "true" # true if this git ref is protected, false otherwise
+ "ref_protected": "true", # true if this git ref is protected, false otherwise
+ "environment": "production", # Environment this job deploys to, if present (GitLab 13.9 and later)
+ "environment_protected": "true" # true if deployed environment is protected, false otherwise (GitLab 13.9 and later)
}
```
@@ -178,7 +180,7 @@ $ vault write auth/jwt/config \
For the full list of available configuration options, see Vault's [API documentation](https://www.vaultproject.io/api/auth/jwt#configure).
-The following job, when run for the `master` branch, is able to read secrets under `secret/myproject/staging/`, but not the secrets under `secret/myproject/production/`:
+The following job, when run for the default branch, is able to read secrets under `secret/myproject/staging/`, but not the secrets under `secret/myproject/production/`:
```yaml
read_secrets:
diff --git a/doc/ci/examples/deployment/README.md b/doc/ci/examples/deployment/README.md
index 779ca98084f..4d2c22a17f0 100644
--- a/doc/ci/examples/deployment/README.md
+++ b/doc/ci/examples/deployment/README.md
@@ -116,7 +116,7 @@ We also use two secure variables:
## Storing API keys
To add secure variables, navigate to your project's
-**Settings > CI / CD > Variables**. The variables that are defined
+**Settings > CI/CD > Variables**. The variables that are defined
in the project settings are sent along with the build script to the runner.
The secure variables are stored out of the repository. Never store secrets in
your project's `.gitlab-ci.yml`. It is also important that the secret's value
@@ -128,4 +128,4 @@ or `%` (for Windows Batch runners):
1. `$VARIABLE` - use it for non-Windows runners
1. `%VARIABLE%` - use it for Windows Batch runners
-Read more about the [CI variables](../../variables/README.md).
+Read more about the [CI/CD variables](../../variables/README.md).
diff --git a/doc/ci/examples/deployment/composer-npm-deploy.md b/doc/ci/examples/deployment/composer-npm-deploy.md
index 2d7ba2bc759..62607320410 100644
--- a/doc/ci/examples/deployment/composer-npm-deploy.md
+++ b/doc/ci/examples/deployment/composer-npm-deploy.md
@@ -122,7 +122,7 @@ Therefore, for a production environment we use additional steps to ensure that a
Since this was a WordPress project, I gave real life code snippets. Some further ideas you can pursue:
-- Having a slightly different script for `master` branch allows you to deploy to a production server from that branch and to a stage server from any other branches.
+- Having a slightly different script for the default branch allows you to deploy to a production server from that branch and to a stage server from any other branches.
- Instead of pushing it live, you can push it to WordPress official repository (with creating a SVN commit, etc.).
- You could generate i18n text domains on the fly.
diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
index e20e86e8936..07bad3afc65 100644
--- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md
+++ b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
@@ -50,14 +50,14 @@ infrastructure is up and running, and that your units of code work well together
[Selenium](https://www.selenium.dev/) is a piece of software that can control web browsers, e.g., to make them
visit a specific URL or interact with elements on the page. It can be programmatically controlled
from a variety of programming languages. In this article we're going to be using the
-[WebdriverIO](https://webdriver.io/) JavaScript bindings, but the general concept should carry over
+[WebdriverIO](http://v4.webdriver.io/) JavaScript bindings, but the general concept should carry over
pretty well to
[other programming languages supported by Selenium](https://www.selenium.dev/documentation/en/legacy_docs/selenium_rc/).
## Writing tests
You can write tests using
-[several testing frameworks supported by WebdriverIO](https://webdriver.io/guide/testrunner/frameworks.html).
+[several testing frameworks supported by WebdriverIO](http://v4.webdriver.io/guide/testrunner/frameworks.html).
We will be using [Jasmine](https://jasmine.github.io/) here:
```javascript
@@ -82,14 +82,14 @@ multiple tests, such as making sure you are logged in.
The function `it` defines an individual test.
-[The `browser` object](https://webdriver.io/guide/testrunner/browserobject.html) is WebdriverIO's
-special sauce. It provides most of [the WebdriverIO API methods](https://webdriver.io/api.html) that are the key to
+[The `browser` object](http://v4.webdriver.io/guide/testrunner/browserobject.html) is WebdriverIO's
+special sauce. It provides most of [the WebdriverIO API methods](http://v4.webdriver.io/docs/api/) that are the key to
steering the browser. In this case, we can use
-[`browser.url`](https://webdriver.io/api/protocol/url.html) to visit `/page-that-does-not-exist` to
-hit our 404 page. We can then use [`browser.getUrl`](https://webdriver.io/api/property/getUrl.html)
+[`browser.url`](http://v4.webdriver.io/api/protocol/url.html) to visit `/page-that-does-not-exist` to
+hit our 404 page. We can then use [`browser.getUrl`](http://v4.webdriver.io/api/property/getUrl.html)
to verify that the current page is indeed at the location we specified. To interact with the page,
we can simply pass CSS selectors to
-[`browser.element`](https://webdriver.io/api/protocol/element.html) to get access to elements on the
+[`browser.element`](http://v4.webdriver.io/api/protocol/element.html) to get access to elements on the
page and to interact with them - for example, to click on the link back to the home page.
The simple test shown above
@@ -111,9 +111,9 @@ you can use [the Webpack Dev Server WebdriverIO plugin](https://www.npmjs.com/pa
that automatically starts a development server before executing the tests.
The WebdriverIO documentation has
-[an overview of all configuration options](https://webdriver.io/guide/getstarted/configuration.html), but the
+[an overview of all configuration options](http://v4.webdriver.io/guide/getstarted/configuration.html), but the
easiest way to get started is to start with
-[WebdriverIO's default configuration](https://webdriver.io/guide/testrunner/configurationfile.html), which
+[WebdriverIO's default configuration](http://v4.webdriver.io/guide/testrunner/configurationfile.html), which
provides an overview of all available options. The two options that are going to be most relevant now are the
`specs` option, which is an array of paths to your tests, and the `baseUrl` option, which points to where your app is
running. And finally, we will need to tell WebdriverIO in which browsers we would like to run our
@@ -186,7 +186,7 @@ e2e:chrome:
Now that we have a job to run the end-to-end tests in, we need to tell WebdriverIO how to connect to
the Selenium servers running alongside it. We've already cheated a bit above by
-passing the value of the [`host`](https://webdriver.io/guide/getstarted/configuration.html#host)
+passing the value of the [`host`](http://v4.webdriver.io/guide/getstarted/configuration.html#host)
option as an argument to `npm run confidence-check` on the command line.
However, we still need to tell WebdriverIO which browser is available for it to use.
@@ -253,7 +253,7 @@ production project, see:
- [Flockademic's `.gitlab-ci.yml`](https://gitlab.com/Flockademic/Flockademic/blob/dev/.gitlab-ci.yml)
- [Flockademic's tests](https://gitlab.com/Flockademic/Flockademic/tree/dev/__e2e__)
-There's plenty more that WebdriverIO can do. For example, you can configure a [`screenshotPath`](https://webdriver.io/guide/getstarted/configuration.html#screenshotPath) to tell WebdriverIO to take
+There's plenty more that WebdriverIO can do. For example, you can configure a [`screenshotPath`](http://v4.webdriver.io/guide/getstarted/configuration.html#screenshotPath) to tell WebdriverIO to take
a screenshot when tests are failing. Then tell GitLab CI/CD to store those
[artifacts](../../yaml/README.md#artifacts), and you'll be able to see what went
wrong within GitLab.
diff --git a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
index a02a5347734..2acd7315630 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -128,7 +128,7 @@ We'll use this variable in the `.gitlab-ci.yml` later, to easily connect to our
![variables page](img/variables_page.png)
-We also need to add the public key to **Project** > **Settings** > **Repository** as a [Deploy Key](../../../ssh/README.md#deploy-keys), which gives us the ability to access our repository from the server through [SSH protocol](../../../gitlab-basics/command-line-commands.md#start-working-on-your-project).
+We also need to add the public key to **Project** > **Settings** > **Repository** as a [Deploy Key](../../../user/project/deploy_keys/index.md), which gives us the ability to access our repository from the server through [SSH protocol](../../../gitlab-basics/command-line-commands.md#start-working-on-your-project).
```shell
# As the deployer user on the server
@@ -619,7 +619,7 @@ deploy_production:
- master
```
-You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/), to final test your application before deploying to production.
+You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/), to final test your application before deploying to production.
### Turn on GitLab CI/CD
diff --git a/doc/ci/examples/semantic-release.md b/doc/ci/examples/semantic-release.md
index c0fc93fe1b3..28a0080626a 100644
--- a/doc/ci/examples/semantic-release.md
+++ b/doc/ci/examples/semantic-release.md
@@ -91,7 +91,7 @@ As part of publishing a package, semantic-release increases the version number i
1. Navigate to **Project > Settings > Access Tokens**.
1. Give the token a name, and select the `api` scope.
1. Click **Create project access token** and copy its value.
-1. Navigate to **Project > Settings > CI / CD > Variables**.
+1. Navigate to **Project > Settings > CI/CD > Variables**.
1. Click **Add Variable**.
1. In the **Key** field, enter `GITLAB_TOKEN`. In the **Value** field, paste the token created above. Check the **Mask variable** option and click **Add variable**.
@@ -126,7 +126,7 @@ Test the pipeline by creating a commit with a message like:
fix: testing patch releases
```
-Push the commit to `master`. The pipeline should create a new release (`v1.0.0`) on the project's **Releases** page and publish a new version of the package to the project's **Package Registry** page.
+Push the commit to the default branch. The pipeline should create a new release (`v1.0.0`) on the project's **Releases** page and publish a new version of the package to the project's **Package Registry** page.
To create a minor release, use a commit message like:
diff --git a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
index 28d00362309..4a6555a58a6 100644
--- a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
+++ b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
@@ -1,101 +1,8 @@
---
-stage: Verify
-group: Continuous Integration
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: tutorial
+redirect_to: 'README.md#contributed-examples'
---
-# Test and deploy a Python application with GitLab CI/CD
+This document was moved to [another location](README.md#contributed-examples).
-This example will guide you how to run tests in your Python application and deploy it automatically as Heroku application.
-
-You can also view or fork the complete [example source](https://gitlab.com/ayufan/python-getting-started).
-
-## Configure project
-
-This is what the `.gitlab-ci.yml` file looks like for this project:
-
-```yaml
-stages:
- - test
- - deploy
-
-test:
- stage: test
- script:
- # this configures Django application to use attached postgres database that is run on `postgres` host
- - export DATABASE_URL=postgres://postgres:@postgres:5432/python-test-app
- - apt-get update -qy
- - apt-get install -y python-dev python-pip
- - pip install -r requirements.txt
- - python manage.py test
-
-staging:
- stage: deploy
- script:
- - apt-get update -qy
- - apt-get install -y ruby-dev
- - gem install dpl
- - dpl --provider=heroku --app=gitlab-ci-python-test-staging --api-key=$HEROKU_STAGING_API_KEY
- only:
- - master
-
-production:
- stage: deploy
- script:
- - apt-get update -qy
- - apt-get install -y ruby-dev
- - gem install dpl
- - dpl --provider=heroku --app=gitlab-ci-python-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
- only:
- - tags
-```
-
-This project has three jobs:
-
-- `test` - used to test Django application.
-- `staging` - used to automatically deploy staging environment every push to `master` branch.
-- `production` - used to automatically deploy production environment for every created tag.
-
-## Store API keys
-
-You'll need to create two variables in **Settings > CI/CD > Variables** in your GitLab project:
-
-- `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app.
-- `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app.
-
-Find your Heroku API key in [Manage Account](https://dashboard.heroku.com/account).
-
-## Create Heroku application
-
-For each of your environments, you'll need to create a new Heroku application.
-You can do this through the [Dashboard](https://dashboard.heroku.com/).
-
-## Create a runner
-
-First install [Docker Engine](https://docs.docker.com/installation/).
-
-To build this project you also need to have [GitLab Runner](https://docs.gitlab.com/runner/index.html).
-You can use public runners available on `gitlab.com` or you can register your own:
-
-```shell
-cat > /tmp/test-config.template.toml << EOF
-[[runners]]
-[runners.docker]
-[[runners.docker.services]]
-name = "postgres:latest"
-EOF
-
-gitlab-runner register \
- --non-interactive \
- --url "https://gitlab.com/" \
- --registration-token "PROJECT_REGISTRATION_TOKEN" \
- --description "python-3.5" \
- --executor "docker" \
- --template-config /tmp/test-config.template.toml \
- --docker-image python:3.5
-```
-
-With the command above, you create a runner that uses the [`python:3.5`](https://hub.docker.com/_/python) image and uses a [PostgreSQL](https://hub.docker.com/_/postgres) database.
-
-To access the PostgreSQL database, connect to `host: postgres` as user `postgres` with no password.
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md b/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
index 5bf0b3d01be..4a6555a58a6 100644
--- a/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
+++ b/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
@@ -1,97 +1,8 @@
---
-stage: Verify
-group: Continuous Integration
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: tutorial
+redirect_to: 'README.md#contributed-examples'
---
-# Test and deploy a Ruby application with GitLab CI/CD
+This document was moved to [another location](README.md#contributed-examples).
-This example will guide you through how to run tests in your Ruby on Rails application and deploy it automatically as a Heroku application.
-
-You can also view or fork the complete [example source](https://gitlab.com/ayufan/ruby-getting-started) and view the logs of its past [CI jobs](https://gitlab.com/ayufan/ruby-getting-started/-/jobs?scope=finished).
-
-## Configure the project
-
-This is what the `.gitlab-ci.yml` file looks like for this project:
-
-```yaml
-test:
- stage: test
- script:
- - apt-get update -qy
- - apt-get install -y nodejs
- - bundle install --path /cache
- - bundle exec rake db:create RAILS_ENV=test
- - bundle exec rake test
-
-staging:
- stage: deploy
- script:
- - gem install dpl --pre
- - dpl heroku api --app=gitlab-ci-ruby-test-staging --api-key=$HEROKU_STAGING_API_KEY
- only:
- - master
-
-production:
- stage: deploy
- script:
- - gem install dpl --pre
- - dpl heroku api --app=gitlab-ci-ruby-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
- only:
- - tags
-```
-
-This project has three jobs:
-
-- `test` - used to test Rails application.
-- `staging` - used to automatically deploy staging environment every push to `master` branch.
-- `production` - used to automatically deploy production environment for every created tag.
-
-## Store API keys
-
-You'll need to create two CI/CD variables in your project's **Settings > CI/CD > Variables** and do not check **Protect variable** or **Mask variable**:
-
-- `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app.
-- `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app.
-
-Find your Heroku API key in [Manage Account](https://dashboard.heroku.com/account).
-
-## Create Heroku application
-
-For each of your environments, you'll need to create a new Heroku application.
-You can do this through the [Heroku Dashboard](https://dashboard.heroku.com/).
-
-## Create a runner
-
-First install [Docker Engine](https://docs.docker.com/installation/).
-
-To build this project you also need to have [GitLab Runner](https://docs.gitlab.com/runner/).
-You can use public runners available on `gitlab.com` or register your own. Start by
-creating a template configuration file to pass complex configuration:
-
-```shell
-cat > /tmp/test-config.template.toml << EOF
-[[runners]]
-[runners.docker]
-[[runners.docker.services]]
-name = "postgres:latest"
-EOF
-```
-
-Finally, register the runner, passing the newly-created template configuration file:
-
-```shell
-gitlab-runner register \
- --non-interactive \
- --url "https://gitlab.com/" \
- --registration-token "PROJECT_REGISTRATION_TOKEN" \
- --description "ruby:2.6" \
- --executor "docker" \
- --template-config /tmp/test-config.template.toml \
- --docker-image ruby:2.6
-```
-
-With the command above, you create a runner that uses the [`ruby:2.6`](https://hub.docker.com/_/ruby) image and uses a [PostgreSQL](https://hub.docker.com/_/postgres) database.
-
-To access the PostgreSQL database, connect to `host: postgres` as user `postgres` with no password.
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/test-clojure-application.md b/doc/ci/examples/test-clojure-application.md
index b6691930a2c..8aa1fb21275 100644
--- a/doc/ci/examples/test-clojure-application.md
+++ b/doc/ci/examples/test-clojure-application.md
@@ -1,46 +1,8 @@
---
-stage: Verify
-group: Continuous Integration
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: tutorial
+redirect_to: 'README.md#contributed-examples'
---
-NOTE:
-This document has not been updated recently and could be out of date. For the latest documentation, see the [GitLab CI/CD](../README.md) page and the [GitLab CI/CD Pipeline Configuration Reference](../yaml/README.md).
+This document was moved to [another location](README.md#contributed-examples).
-# Test a Clojure application with GitLab CI/CD
-
-This example will guide you how to run tests on your Clojure application.
-
-You can view or fork the [example source](https://gitlab.com/dzaporozhets/clojure-web-application) and view the logs of its past [CI jobs](https://gitlab.com/dzaporozhets/clojure-web-application/builds?scope=finished).
-
-## Configure the project
-
-This is what the `.gitlab-ci.yml` file looks like for this project:
-
-```yaml
-variables:
- POSTGRES_DB: sample-test
- DATABASE_URL: "postgresql://postgres@postgres:5432/sample-test"
-
-before_script:
- - apt-get update -y
- - apt-get install default-jre postgresql-client -y
- - wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein
- - chmod a+x lein
- - export LEIN_ROOT=1
- - PATH=$PATH:.
- - lein deps
- - lein migratus migrate
-
-test:
- script:
- - lein test
-```
-
-In `before_script`, we install JRE and [Leiningen](https://leiningen.org/).
-
-The sample project uses the [migratus](https://github.com/yogthos/migratus) library to manage database migrations, and
-we have added a database migration as the last step of `before_script`.
-
-You can use public runners available on `gitlab.com` for testing your application with this configuration.
+<!-- This redirect file can be deleted after 2021-05-26. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/git_submodules.md b/doc/ci/git_submodules.md
index d9a40c1feb6..01df4f63c92 100644
--- a/doc/ci/git_submodules.md
+++ b/doc/ci/git_submodules.md
@@ -5,38 +5,23 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Using Git submodules with GitLab CI
+# Using Git submodules with GitLab CI/CD
-> **Notes:**
->
-> - GitLab 8.12 introduced a new [CI job permissions model](../user/project/new_ci_build_permissions_model.md) and you
-> are encouraged to upgrade your GitLab instance if you haven't done already.
-> If you are **not** using GitLab 8.12 or higher, you would need to work your way
-> around submodules in order to access the sources of e.g., `gitlab.com/group/project`
-> with the use of [SSH keys](ssh_keys/index.md).
-> - With GitLab 8.12 onward, your permissions are used to evaluate what a CI job
-> can access. More information about how this system works can be found in the
-> [Jobs permissions model](../user/permissions.md#job-permissions).
-> - The HTTP(S) Git protocol [must be enabled](../user/admin_area/settings/visibility_and_access_controls.md#enabled-git-access-protocols) in your GitLab instance.
+Use [Git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) to keep
+a Git repository as a subdirectory of another Git repository. You can clone another
+repository into your project and keep your commits separate.
-## Configuring the `.gitmodules` file
+## Configure the `.gitmodules` file
-If dealing with [Git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules), your project probably has a file
-named `.gitmodules`.
+When you use Git submodules, your project should have a file named `.gitmodules`.
+You might need to modify it to work in a GitLab CI/CD job.
-Let's consider the following example:
+For example, your `.gitmodules` configuration might look like the following if:
-1. Your project is located at `https://gitlab.com/secret-group/my-project`.
-1. To checkout your sources you usually use an SSH address like
- `git@gitlab.com:secret-group/my-project.git`.
-1. Your project depends on `https://gitlab.com/group/project`, which you want
- to include as a submodule.
-
-If you are using GitLab 8.12+ and your submodule is on the same GitLab server,
-you must update your `.gitmodules` file to use **relative URLs**.
-Since Git allows the usage of relative URLs for your `.gitmodules` configuration,
-this easily allows you to use HTTP(S) for cloning all your CI jobs and SSH
-for all your local checkouts. The `.gitmodules` would look like:
+- Your project is located at `https://gitlab.com/secret-group/my-project`.
+- Your project depends on `https://gitlab.com/group/project`, which you want
+ to include as a submodule.
+- You check out your sources with an SSH address like `git@gitlab.com:secret-group/my-project.git`.
```ini
[submodule "project"]
@@ -44,14 +29,16 @@ for all your local checkouts. The `.gitmodules` would look like:
url = ../../group/project.git
```
-The above configuration instructs Git to automatically deduce the URL that
-should be used when cloning sources. Whether you use HTTP(S) or SSH, Git uses
-that same channel and it makes all your CI jobs use HTTP(S).
-GitLab CI/CD only uses HTTP(S) for cloning your sources, and all your local
-clones continue using SSH.
+When your submodule is on the same GitLab server, you should use relative URLs in
+your `.gitmodules` file. Then you can clone with HTTPS in all your CI/CD jobs. You
+can also use SSH for all your local checkouts.
+
+The above configuration instructs Git to automatically deduce the URL to
+use when cloning sources. Git uses the same configuration for both HTTPS and SSH.
+GitLab CI/CD uses HTTPS for cloning your sources, and you can continue to use SSH
+to clone locally.
-For all other submodules not located on the same GitLab server, use the full
-HTTP(S) protocol URL:
+For submodules not located on the same GitLab server, use the full URL:
```ini
[submodule "project-x"]
@@ -59,45 +46,16 @@ HTTP(S) protocol URL:
url = https://gitserver.com/group/project-x.git
```
-Once `.gitmodules` is correctly configured, you can move on to
-[configuring your `.gitlab-ci.yml`](#using-git-submodules-in-your-ci-jobs).
-
-## Using Git submodules in your CI jobs
+## Use Git submodules in CI/CD jobs
-There are a few steps you need to take in order to make submodules work
-correctly with your CI jobs:
+To make submodules work correctly in CI/CD jobs:
-1. First, make sure you have used [relative URLs](#configuring-the-gitmodules-file)
- for the submodules located in the same GitLab server.
-1. Next, if you are using `gitlab-runner` v1.10+, you can set the
- `GIT_SUBMODULE_STRATEGY` variable to either `normal` or `recursive` to tell
- the runner to fetch your submodules before the job:
+1. Make sure you use [relative URLs](#configure-the-gitmodules-file)
+ for submodules located in the same GitLab server.
+1. You can set the `GIT_SUBMODULE_STRATEGY` variable to either `normal` or `recursive`
+ to tell the runner to [fetch your submodules before the job](runners/README.md#git-submodule-strategy):
```yaml
variables:
GIT_SUBMODULE_STRATEGY: recursive
```
-
- See the [GitLab Runner documentation](runners/README.md#git-submodule-strategy)
- for more details about `GIT_SUBMODULE_STRATEGY`.
-
-1. If you are using an older version of `gitlab-runner`, then use
- `git submodule sync/update` in `before_script`:
-
- ```yaml
- before_script:
- - git submodule sync --recursive
- - git submodule update --init --recursive
- ```
-
- `--recursive` should be used in either both or none (`sync/update`) depending on
- whether you have recursive submodules.
-
-The rationale to set the `sync` and `update` in `before_script` is because of
-the way Git submodules work. On a fresh runner workspace, Git sets the
-submodule URL including the token in `.git/config`
-(or `.git/modules/<submodule>/config`) based on `.gitmodules` and the current
-remote URL. On subsequent jobs on the same runner, `.git/config` is cached
-and already contains a full URL for the submodule, corresponding to the previous
-job, and to **a token from a previous job**. `sync` allows to force updating
-the full URL.
diff --git a/doc/ci/img/deployments_view.png b/doc/ci/img/deployments_view.png
index 9e2b7e89577..4d49f5ea5bd 100644
--- a/doc/ci/img/deployments_view.png
+++ b/doc/ci/img/deployments_view.png
Binary files differ
diff --git a/doc/ci/img/environment_auto_stop_v12_8.png b/doc/ci/img/environment_auto_stop_v12_8.png
deleted file mode 100644
index f098938ef04..00000000000
--- a/doc/ci/img/environment_auto_stop_v12_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_available_13_10.png b/doc/ci/img/environments_available_13_10.png
new file mode 100644
index 00000000000..94ffb0032fa
--- /dev/null
+++ b/doc/ci/img/environments_available_13_10.png
Binary files differ
diff --git a/doc/ci/img/environments_available_13_7.png b/doc/ci/img/environments_available_13_7.png
deleted file mode 100644
index 2e1f56c5894..00000000000
--- a/doc/ci/img/environments_available_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_dynamic_groups.png b/doc/ci/img/environments_dynamic_groups.png
deleted file mode 100644
index 37828ccd0c1..00000000000
--- a/doc/ci/img/environments_dynamic_groups.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_deployments.png b/doc/ci/img/environments_manual_action_deployments.png
deleted file mode 100644
index c5959c0003e..00000000000
--- a/doc/ci/img/environments_manual_action_deployments.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_environments.png b/doc/ci/img/environments_manual_action_environments.png
deleted file mode 100644
index b2ec27cc721..00000000000
--- a/doc/ci/img/environments_manual_action_environments.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_jobs.png b/doc/ci/img/environments_manual_action_jobs.png
deleted file mode 100644
index d948ee5da9e..00000000000
--- a/doc/ci/img/environments_manual_action_jobs.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_pipelines.png b/doc/ci/img/environments_manual_action_pipelines.png
deleted file mode 100644
index 332850afb7f..00000000000
--- a/doc/ci/img/environments_manual_action_pipelines.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_single_pipeline.png b/doc/ci/img/environments_manual_action_single_pipeline.png
deleted file mode 100644
index 8c1c0c1d993..00000000000
--- a/doc/ci/img/environments_manual_action_single_pipeline.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_terminal_button_on_index.png b/doc/ci/img/environments_terminal_button_on_index.png
deleted file mode 100644
index 40110ff325f..00000000000
--- a/doc/ci/img/environments_terminal_button_on_index.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_terminal_button_on_show.png b/doc/ci/img/environments_terminal_button_on_show.png
deleted file mode 100644
index e96ca9c9c7e..00000000000
--- a/doc/ci/img/environments_terminal_button_on_show.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/pipelines_junit_test_report_ui_v12_5.png b/doc/ci/img/pipelines_junit_test_report_ui_v12_5.png
deleted file mode 100644
index 5b1e3254f8b..00000000000
--- a/doc/ci/img/pipelines_junit_test_report_ui_v12_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/pipelines_junit_test_report_v13_10.png b/doc/ci/img/pipelines_junit_test_report_v13_10.png
new file mode 100644
index 00000000000..ef79a2547af
--- /dev/null
+++ b/doc/ci/img/pipelines_junit_test_report_v13_10.png
Binary files differ
diff --git a/doc/ci/img/pipelines_junit_test_report_with_errors_v13_10.png b/doc/ci/img/pipelines_junit_test_report_with_errors_v13_10.png
new file mode 100644
index 00000000000..cfcf3bec76c
--- /dev/null
+++ b/doc/ci/img/pipelines_junit_test_report_with_errors_v13_10.png
Binary files differ
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index d1fe6db3ee4..0c5fa59da8e 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -153,7 +153,7 @@ Job grouping is evaluated with an improved regular expression to group jobs by n
The new implementation removes one or more `: [...]`, `X Y`, `X/Y`, or `X\Y` sequences
from the **end** of job names only.
-Matching substrings occuring at the beginning or in the middle of build names are
+Matching substrings occurring at the beginning or in the middle of build names are
no longer removed.
## Specifying variables when running manual jobs
@@ -187,7 +187,7 @@ For example, if you start rolling out new code and:
- Users do not experience trouble, GitLab can automatically complete the deployment from 0% to 100%.
- Users experience trouble with the new code, you can stop the timed incremental rollout by canceling the pipeline
- and [rolling](../environments/index.md#retrying-and-rolling-back) back to the last stable version.
+ and [rolling](../environments/index.md#retry-or-roll-back-a-deployment) back to the last stable version.
![Pipelines example](img/pipeline_incremental_rollout.png)
diff --git a/doc/ci/merge_request_pipelines/index.md b/doc/ci/merge_request_pipelines/index.md
index 5c3cf6ec02e..7e76efe8b50 100644
--- a/doc/ci/merge_request_pipelines/index.md
+++ b/doc/ci/merge_request_pipelines/index.md
@@ -19,6 +19,12 @@ you can use *pipelines for merge requests*.
In the UI, these pipelines are labeled as `detached`. Otherwise, these pipelines appear the same
as other pipelines.
+Pipelines for merge requests can run when you:
+
+- Create a new merge request.
+- Commit changes to the source branch for the merge request.
+- Select the **Run pipeline** button from the **Pipelines** tab in the merge request.
+
Any user who has developer [permissions](../../user/permissions.md)
can run a pipeline for merge requests.
@@ -213,7 +219,7 @@ The variable names begin with the `CI_MERGE_REQUEST_` prefix.
### Two pipelines created when pushing to a merge request
If you are experiencing duplicated pipelines when using `rules`, take a look at
-the [important differences between `rules` and `only`/`except`](../yaml/README.md#prevent-duplicate-pipelines),
+the [important differences between `rules` and `only`/`except`](../yaml/README.md#avoid-duplicate-pipelines),
which helps you get your starting configuration correct.
If you are seeing two pipelines when using `only/except`, please see the caveats
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
index e83789efdbf..72603ed94c0 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
+++ b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
@@ -32,7 +32,7 @@ can still be successfully merged into the target.
When the merge request can't be merged, the pipeline runs against the source branch only. For example, when:
- The target branch has changes that conflict with the changes in the source branch.
-- The merge request is a [**Draft** merge request](../../../user/project/merge_requests/work_in_progress_merge_requests.md).
+- The merge request is a [**Draft** merge request](../../../user/project/merge_requests/drafts.md).
In these cases, the pipeline runs as a [pipeline for merge requests](../index.md)
and is labeled as `detached`. If these cases no longer exist, new pipelines
diff --git a/doc/ci/metrics_reports.md b/doc/ci/metrics_reports.md
index 3966e5e3e89..ed14e61c54b 100644
--- a/doc/ci/metrics_reports.md
+++ b/doc/ci/metrics_reports.md
@@ -26,12 +26,14 @@ Consider the following examples of data that can use Metrics Reports:
## How it works
-Metrics are read from the metrics report (default: `metrics.txt`). They are parsed and displayed in the MR widget.
+Metrics for a branch are read from the latest metrics report artifact (default filename: `metrics.txt`) as string values.
-All values are considered strings and string compare is used to find differences between the latest available `metrics` artifact from:
+For an MR, the values of these metrics from the feature branch are compared to the values from the target branch. Then they are displayed in the MR widget in this order:
-- `master`
-- The feature branch
+- Existing metrics with changed values.
+- Metrics that have been added by the MR. Marked with a **New** badge.
+- Metrics that have been removed by the MR. Marked with a **Removed** badge.
+- Existing metrics with unchanged values.
## How to set it up
diff --git a/doc/ci/multi_project_pipelines.md b/doc/ci/multi_project_pipelines.md
index 4c186b8a64e..9736f8c1418 100644
--- a/doc/ci/multi_project_pipelines.md
+++ b/doc/ci/multi_project_pipelines.md
@@ -314,7 +314,7 @@ Some features are not implemented yet. For example, support for environments.
You can trigger a pipeline in your project whenever a pipeline finishes for a new
tag in a different project:
-1. Go to the project's **Settings > CI / CD** page, and expand the **Pipeline subscriptions** section.
+1. Go to the project's **Settings > CI/CD** page, and expand the **Pipeline subscriptions** section.
1. Enter the project you want to subscribe to, in the format `<namespace>/<project>`.
For example, if the project is `https://gitlab.com/gitlab-org/gitlab`, use `gitlab-org/gitlab`.
1. Click subscribe.
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md
index 9f4a1afe2f9..aabdc6cd36b 100644
--- a/doc/ci/pipeline_editor/index.md
+++ b/doc/ci/pipeline_editor/index.md
@@ -8,10 +8,7 @@ type: reference
# Pipeline Editor **(FREE)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4540) in GitLab 13.8.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
-> - It's enabled on GitLab.com.
-> - It's recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-pipeline-editor). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/270059) in GitLab 13.10.
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -30,7 +27,7 @@ From the pipeline editor page you can:
NOTE:
You must already have [a `.gitlab-ci.yml` file](../quick_start/index.md#create-a-gitlab-ciyml-file)
-on the default branch (usually `master`) of your project to use the editor.
+on the default branch of your project to use the editor.
## Validate CI configuration
@@ -68,7 +65,6 @@ reflected in the CI lint. It displays the same results as the existing [CI Lint
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-It is not accessible if the [pipeline editor is disabled](#enable-or-disable-pipeline-editor).
To view a visualization of your `gitlab-ci.yml` configuration, in your project,
go to **CI/CD > Editor**, and then select the **Visualize** tab. The
@@ -107,7 +103,7 @@ Feature.enable(:ci_config_visualization_tab)
## View expanded configuration
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/246801) in GitLab 13.9.
-> - It is [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It is [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-expanded-configuration). **(FREE SELF)**
To view the fully expanded CI/CD configuration as one combined file, go to the
@@ -122,20 +118,20 @@ where:
### Enable or disable expanded configuration **(FREE SELF)**
Expanded CI/CD configuration is under development and not ready for production use.
-It is deployed behind a feature flag that is **disabled by default**.
+It is deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
can opt to enable it.
-To enable it:
+To disable it:
```ruby
-Feature.enable(:ci_config_visualization_tab)
+Feature.disable(:ci_config_merged_tab)
```
-To disable it:
+To enable it:
```ruby
-Feature.disable(:ci_config_visualization_tab)
+Feature.enable(:ci_config_merged_tab)
```
## Commit changes to CI configuration
@@ -150,22 +146,3 @@ If you enter a new branch name, the **Start a new merge request with these chang
checkbox appears. Select it to start a new merge request after you commit the changes.
![The commit form with a new branch](img/pipeline_editor_commit_v13_8.png)
-
-## Enable or disable pipeline editor **(FREE SELF)**
-
-The pipeline editor is under development but ready for production use. It is
-deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:ci_pipeline_editor_page)
-```
-
-To enable it:
-
-```ruby
-Feature.enable(:ci_pipeline_editor_page)
-```
diff --git a/doc/ci/pipelines/img/pipelines_settings_test_coverage.png b/doc/ci/pipelines/img/pipelines_settings_test_coverage.png
deleted file mode 100644
index 13ed69be810..00000000000
--- a/doc/ci/pipelines/img/pipelines_settings_test_coverage.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index 6bc0d9bddd9..c2fcbbcf72f 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -6,9 +6,7 @@ disqus_identifier: 'https://docs.gitlab.com/ee/ci/pipelines.html'
type: reference
---
-# CI/CD pipelines
-
-> Introduced in GitLab 8.8.
+# CI/CD pipelines **(FREE)**
NOTE:
Watch the
@@ -96,7 +94,7 @@ This table lists the refspecs injected for each pipeline type:
The refs `refs/heads/<name>` and `refs/tags/<name>` exist in your
project repository. GitLab generates the special ref `refs/pipelines/<id>` during a
running pipeline job. This ref can be created even after the associated branch or tag has been
-deleted. It's therefore useful in some features such as [automatically stopping an environment](../environments/index.md#automatically-stopping-an-environment),
+deleted. It's therefore useful in some features such as [automatically stopping an environment](../environments/index.md#stopping-an-environment),
and [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md)
that might run pipelines after branch deletion.
@@ -137,10 +135,10 @@ To execute a pipeline manually:
1. Navigate to your project's **CI/CD > Pipelines**.
1. Select the **Run Pipeline** button.
1. On the **Run Pipeline** page:
- 1. Select the branch to run the pipeline for in the **Create for** field.
+ 1. Select the branch or tag to run the pipeline for in the **Run for branch name or tag** field.
1. Enter any [environment variables](../variables/README.md) required for the pipeline run.
You can set specific variables to have their [values prefilled in the form](#prefill-variables-in-manual-pipelines).
- 1. Click the **Create pipeline** button.
+ 1. Click the **Run pipeline** button.
The pipeline now executes the jobs as configured.
@@ -199,8 +197,6 @@ For each `var` or `file_var`, a key and value are required.
### Add manual interaction to your pipeline
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7931) in GitLab 8.15.
-
Manual actions, configured using the [`when:manual`](../yaml/README.md#whenmanual) keyword,
allow you to require manual interaction before moving forward in the pipeline.
@@ -208,7 +204,7 @@ You can do this straight from the pipeline graph. Just click the play button
to execute that particular job.
For example, your pipeline might start automatically, but it requires manual action to
-[deploy to production](../environments/index.md#configuring-manual-deployments). In the example below, the `production`
+[deploy to production](../environments/index.md#configure-manual-deployments). In the example below, the `production`
stage has a job with a manual action.
![Pipelines example](img/pipelines.png)
@@ -324,8 +320,6 @@ runners do not use regular runners, they must be tagged accordingly.
## Visualize pipelines
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5742) in GitLab 8.11.
-
Pipelines can be complex structures with many sequential and parallel jobs.
To make it easier to understand the flow of a pipeline, GitLab has pipeline graphs for viewing pipelines
diff --git a/doc/ci/pipelines/schedules.md b/doc/ci/pipelines/schedules.md
index a8e310c1f0d..752e2a97fad 100644
--- a/doc/ci/pipelines/schedules.md
+++ b/doc/ci/pipelines/schedules.md
@@ -36,7 +36,7 @@ Otherwise the pipeline is not created.
To schedule a pipeline for project:
-1. Navigate to the project's **CI / CD > Schedules** page.
+1. Navigate to the project's **CI/CD > Schedules** page.
1. Click the **New schedule** button.
1. Fill in the **Schedule a new pipeline** form.
1. Click the **Save pipeline schedule** button.
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 32221b78039..e607bae53bd 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -6,7 +6,7 @@ disqus_identifier: 'https://docs.gitlab.com/ee/user/project/pipelines/settings.h
type: reference, howto
---
-# Pipeline settings
+# Pipeline settings **(FREE)**
To reach the pipelines settings navigate to your project's
**Settings > CI/CD**.
@@ -17,6 +17,11 @@ The following settings can be configured per project.
For an overview, watch the video [GitLab CI Pipeline, Artifacts, and Environments](https://www.youtube.com/watch?v=PCKDICEe10s).
Watch also [GitLab CI pipeline tutorial for beginners](https://www.youtube.com/watch?v=Jav4vbUrqII).
+You can use the pipeline status to determine if a merge request can be merged:
+
+- [Merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md).
+- [Only allow merge requests to be merged if the pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds).
+
## Git strategy
With Git strategy, you can choose the default way your repository is fetched
@@ -24,7 +29,7 @@ from GitLab in a job.
There are two options. Using:
-- `git clone`, which is slower since it clones the repository from scratch
+- `git clone`, which is slower because it clones the repository from scratch
for every job, ensuring that the local working copy is always pristine.
- `git fetch`, which is default in GitLab and faster as it re-uses the local working copy (falling
back to clone if it doesn't exist).
@@ -70,20 +75,19 @@ For information about setting a maximum artifact size for a project, see
## Custom CI/CD configuration path
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12509) in GitLab 9.4.
-> - [Support for external `.gitlab-ci.yml` locations](https://gitlab.com/gitlab-org/gitlab/-/issues/14376) introduced in GitLab 12.6.
+> [Support for external `.gitlab-ci.yml` locations](https://gitlab.com/gitlab-org/gitlab/-/issues/14376) introduced in GitLab 12.6.
By default we look for the `.gitlab-ci.yml` file in the project's root
directory. If needed, you can specify an alternate path and filename, including locations outside the project.
To customize the path:
-1. Go to the project's **Settings > CI / CD**.
+1. Go to the project's **Settings > CI/CD**.
1. Expand the **General pipelines** section.
1. Provide a value in the **CI/CD configuration file** field.
1. Click **Save changes**.
-If the CI configuration is stored within the repository in a non-default
+If the CI configuration is stored in the repository in a non-default
location, the path must be relative to the root directory. Examples of valid
paths and file names include:
@@ -96,7 +100,7 @@ If hosting the CI configuration on an external site, the URL link must end with
- `http://example.com/generate/ci/config.yml`
-If hosting the CI configuration in a different project within GitLab, the path must be relative
+If hosting the CI configuration in a different project in GitLab, the path must be relative
to the root directory in the other project. Include the group and project name at the end:
- `.gitlab-ci.yml@mygroup/another-project`
@@ -114,10 +118,10 @@ able to edit it.
## Test coverage parsing
If you use test coverage in your code, GitLab can capture its output in the
-job log using a regular expression. In the pipelines settings, search for the
-"Test coverage parsing" section.
+job log using a regular expression.
-![Pipelines settings test coverage](img/pipelines_settings_test_coverage.png)
+In your project, go to **Settings > CI/CD** and expand the **General pipelines**
+section. Enter the regular expression in the **Test coverage parsing** field.
Leave blank if you want to disable it or enter a Ruby regular expression. You
can use <https://rubular.com> to test your regex. The regex returns the **last**
@@ -133,19 +137,21 @@ averaged.
<!-- vale gitlab.Spelling = NO -->
-| Coverage Tool | Sample regular expression |
-|------------------------------------------------|---------------------------|
-| Simplecov (Ruby) | `\(\d+.\d+\%\) covered` |
-| pytest-cov (Python) | `^TOTAL.+?(\d+\%)$` |
+| Coverage Tool | Sample regular expression |
+|------------------------------------------------|-----------------------------------------------|
+| Simplecov (Ruby) | `\(\d+.\d+\%\) covered` |
+| pytest-cov (Python) | `^TOTAL.+?(\d+\%)$` |
| Scoverage (Scala) | `Statement coverage[A-Za-z\.*]\s*:\s*([^%]+)` |
-| `phpunit --coverage-text --colors=never` (PHP) | `^\s*Lines:\s*\d+.\d+\%` |
-| gcovr (C/C++) | `^TOTAL.*\s+(\d+\%)$` |
-| `tap --coverage-report=text-summary` (NodeJS) | `^Statements\s*:\s*([^%]+)` |
-| `nyc npm test` (NodeJS) | `All files[^|]*\|[^|]*\s+([\d\.]+)` |
-| excoveralls (Elixir) | `\[TOTAL\]\s+(\d+\.\d+)%` |
-| `mix test --cover` (Elixir) | `\d+.\d+\%\s+\|\s+Total` |
-| JaCoCo (Java/Kotlin) | `Total.*?([0-9]{1,3})%` |
-| `go test -cover` (Go) | `coverage: \d+.\d+% of statements` |
+| `phpunit --coverage-text --colors=never` (PHP) | `^\s*Lines:\s*\d+.\d+\%` |
+| gcovr (C/C++) | `^TOTAL.*\s+(\d+\%)$` |
+| `tap --coverage-report=text-summary` (NodeJS) | `^Statements\s*:\s*([^%]+)` |
+| `nyc npm test` (NodeJS) | `All files[^|]*\|[^|]*\s+([\d\.]+)` |
+| excoveralls (Elixir) | `\[TOTAL\]\s+(\d+\.\d+)%` |
+| `mix test --cover` (Elixir) | `\d+.\d+\%\s+\|\s+Total` |
+| JaCoCo (Java/Kotlin) | `Total.*?([0-9]{1,3})%` |
+| `go test -cover` (Go) | `coverage: \d+.\d+% of statements` |
+| .Net (OpenCover) | `(Visited Points).*\((.*)\)` |
+| .Net (`dotnet test` line coverage) | `Total\s*\|\s*(\d+\.?\d+)` |
<!-- vale gitlab.Spelling = YES -->
@@ -157,11 +163,13 @@ averaged.
To see the evolution of your project code coverage over time,
you can view a graph or download a CSV file with this data. From your project:
-1. Go to **{chart}** **Project Analytics > Repository** to see the historic data for each job listed in the dropdown above the graph.
+1. Go to **Project Analytics > Repository** to see the historic data for each job listed in the dropdown above the graph.
1. If you want a CSV file of that data, click **Download raw data (`.csv`)**
![Code coverage graph of a project over time](img/code_coverage_graph_v13_1.png)
+Code coverage data is also [available at the group level](../../user/group/repositories_analytics/index.md).
+
### Removing color codes
Some test coverage tools output with ANSI color codes that aren't
@@ -215,11 +223,9 @@ If **Public pipelines** is disabled:
## Auto-cancel redundant pipelines
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9362) in GitLab 9.1.
-
You can set pending or running pipelines to cancel automatically when a new pipeline runs on the same branch. You can enable this in the project settings:
-1. Go to **Settings > CI / CD**.
+1. Go to **Settings > CI/CD**.
1. Expand **General Pipelines**.
1. Check the **Auto-cancel redundant pipelines** checkbox.
1. Click **Save changes**.
@@ -232,14 +238,14 @@ running job can be cancelled before it completes.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25276) in GitLab 12.9.
Your project may have multiple concurrent deployment jobs that are
-scheduled to run within the same time frame.
+scheduled to run in the same time frame.
This can lead to a situation where an older deployment job runs after a
newer one, which may not be what you want.
To avoid this scenario:
-1. Go to **Settings > CI / CD**.
+1. Go to **Settings > CI/CD**.
1. Expand **General pipelines**.
1. Check the **Skip outdated deployment jobs** checkbox.
1. Click **Save changes**.
@@ -272,15 +278,15 @@ pages.
### Pipeline status badge
-Depending on the status of your job, a badge can have the following values:
+Depending on the status of your pipeline, a badge can have the following values:
-- pending
-- running
-- passed
-- failed
-- skipped
-- canceled
-- unknown
+- `pending`
+- `running`
+- `passed`
+- `failed`
+- `skipped`
+- `canceled`
+- `unknown`
You can access a pipeline status badge image using the following link:
@@ -321,29 +327,27 @@ into your `README.md`:
Pipeline badges can be rendered in different styles by adding the `style=style_name` parameter to the URL. Two styles are available:
-#### Flat (default)
+- Flat (default):
-```plaintext
-https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat
-```
+ ```plaintext
+ https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat
+ ```
-![Badge flat style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat)
+ ![Badge flat style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat)
-#### Flat square
+- Flat square ([Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30120) in GitLab 11.8):
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30120) in GitLab 11.8.
+ ```plaintext
+ https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat-square
+ ```
-```plaintext
-https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat-square
-```
-
-![Badge flat square style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat-square)
+ ![Badge flat square style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat-square)
### Custom badge text
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17555) in GitLab 13.1.
-The text for a badge can be customized. This can be useful to differentiate between multiple coverage jobs that run in the same pipeline. Customize the badge text and width by adding the `key_text=custom_text` and `key_width=custom_key_width` parameters to the URL:
+The text for a badge can be customized to differentiate between multiple coverage jobs that run in the same pipeline. Customize the badge text and width by adding the `key_text=custom_text` and `key_width=custom_key_width` parameters to the URL:
```plaintext
https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=karma&key_text=Frontend+Coverage&key_width=130
@@ -351,10 +355,6 @@ https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=karma&key_te
![Badge with custom text and width](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=karma&key_text=Frontend+Coverage&key_width=130)
-## CI/CD Variables
-
-[CI/CD variables](../variables/README.md) can be set to be available to a runner.
-
<!-- ## Troubleshooting
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index 711bf0c0e7a..664523a08e4 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -66,7 +66,7 @@ In this file, you define:
- The decisions the runner should make when specific conditions are encountered.
For example, you might want to run a suite of tests when you commit to
-any branch except `master`. When you commit to `master`, you want
+any branch except the default branch. When you commit to the default branch, you want
to run the same suite, but also publish your application.
All of this is defined in the `.gitlab-ci.yml` file.
@@ -117,15 +117,22 @@ The pipeline starts when the commit is committed.
#### `.gitlab-ci.yml` tips
-- If you want the runner to use a Docker image to run the jobs, edit the `.gitlab-ci.yml` file
- to include your image name:
+- If you want the runner to [use a Docker container to run the jobs](../docker/using_docker_images.md),
+ edit the `.gitlab-ci.yml` file
+ to include an image name:
```yaml
default:
image: ruby:2.7.2
```
- This command tells the runner to use a Ruby image from Docker Hub.
+ This command tells the runner to use a Ruby image from Docker Hub
+ and to run the jobs in a container that's generated from the image.
+
+ This process is different than
+ [building an application as a Docker container](../docker/using_docker_build.md).
+ Your application does not need to be built as a Docker container to
+ run CI/CD jobs in Docker containers.
- To validate your `.gitlab-ci.yml` file, use the
[CI Lint tool](../lint.md), which is available in every project.
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md
index 9de6a1162bd..122f9caebe7 100644
--- a/doc/ci/review_apps/index.md
+++ b/doc/ci/review_apps/index.md
@@ -12,6 +12,10 @@ type: reference
Review Apps is a collaboration tool that takes the hard work out of providing an environment to showcase product changes.
+NOTE:
+If you have a Kubernetes cluster, you can automate this feature in your applications
+by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Introduction
Review Apps:
@@ -27,8 +31,8 @@ In the above example:
- A Review App is built every time a commit is pushed to `topic branch`.
- The reviewer fails two reviews before passing the third review.
-- After the review has passed, `topic branch` is merged into `master` where it is deployed to staging.
-- After having been approved in staging, the changes that were merged into `master` are deployed in to production.
+- After the review passes, `topic branch` is merged into the default branch, where it's deployed to staging.
+- After its approval in staging, the changes that were merged into the default branch are deployed to production.
## How Review Apps work
@@ -52,7 +56,7 @@ After adding Review Apps to your workflow, you follow the branched Git flow. Tha
## Configuring Review Apps
-Review Apps are built on [dynamic environments](../environments/index.md#configuring-dynamic-environments), which allow you to dynamically create a new environment for each branch.
+Review Apps are built on [dynamic environments](../environments/index.md#create-a-dynamic-environment), which allow you to dynamically create a new environment for each branch.
The process of configuring Review Apps is as follows:
@@ -85,7 +89,7 @@ you can copy and paste into `.gitlab-ci.yml` as a starting point. To do so:
## Review Apps auto-stop
-See how to [configure Review Apps environments to expire and auto-stop](../environments/index.md#environments-auto-stop)
+See how to [configure Review Apps environments to expire and auto-stop](../environments/index.md#stop-an-environment-after-a-certain-time-period)
after a given period of time.
## Review Apps examples
@@ -282,8 +286,8 @@ The visual review tools retrieve the merge request ID from the `data-merge-reque
data attribute included in the `script` HTML tag used to add the visual review tools
to your review app.
-​After determining the ID for the merge request to link to a visual review app, you
-can supply the ID by either:​​
+After determining the ID for the merge request to link to a visual review app, you
+can supply the ID by either:
- Hard-coding it in the script tag via the data attribute `data-merge-request-id` of the app.
- Dynamically adding the `data-merge-request-id` value during the build of the app.
@@ -317,7 +321,3 @@ the user must enter a [personal access token](../../user/profile/personal_access
with `api` scope before submitting feedback.
This same method can be used to require authentication for any public projects.
-
-## Limitations
-
-Review App limitations are the same as [environments limitations](../environments/index.md#limitations).
diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md
index bf7552ad609..d09daea9a75 100644
--- a/doc/ci/runners/README.md
+++ b/doc/ci/runners/README.md
@@ -38,7 +38,7 @@ multiple projects.
If you are using a self-managed instance of GitLab:
- Your administrator can install and register shared runners by
- going to your project's **Settings > CI / CD**, expanding the **Runners** section,
+ going to your project's **Settings > CI/CD**, expanding the **Runners** section,
and clicking **Show runner installation instructions**.
These instructions are also available [in the documentation](https://docs.gitlab.com/runner/install/index.html).
- The administrator can also configure a maximum number of shared runner [pipeline minutes for
@@ -220,7 +220,7 @@ Specific runners process jobs by using a first in, first out ([FIFO](https://en.
NOTE:
Specific runners do not get shared with forked projects automatically.
-A fork *does* copy the CI / CD settings of the cloned repository.
+A fork *does* copy the CI/CD settings of the cloned repository.
#### Create a specific runner
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index 2cdef176a22..72a99efc9bc 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -33,7 +33,7 @@ with any type of [executor](https://docs.gitlab.com/runner/executors/)
1. Run the [`ssh-agent`](https://linux.die.net/man/1/ssh-agent) during job to load
the private key.
1. Copy the public key to the servers you want to have access to (usually in
- `~/.ssh/authorized_keys`) or add it as a [deploy key](../../ssh/README.md#deploy-keys)
+ `~/.ssh/authorized_keys`) or add it as a [deploy key](../../user/project/deploy_keys/index.md)
if you are accessing a private GitLab repository.
The private key is displayed in the job log, unless you enable
@@ -101,7 +101,7 @@ to access it. This is where an SSH key pair comes in handy.
1. As a final step, add the _public_ key from the one you created in the first
step to the services that you want to have an access to from within the build
environment. If you are accessing a private GitLab repository you need to add
- it as a [deploy key](../../ssh/README.md#deploy-keys).
+ it as a [deploy key](../../user/project/deploy_keys/index.md).
That's it! You can now have access to private servers or repositories in your
build environment.
@@ -130,7 +130,7 @@ on, and use that key for all projects that are run on this machine.
1. As a final step, add the _public_ key from the one you created earlier to the
services that you want to have an access to from within the build environment.
If you are accessing a private GitLab repository you need to add it as a
- [deploy key](../../ssh/README.md#deploy-keys).
+ [deploy key](../../user/project/deploy_keys/index.md).
After generating the key, try to sign in to the remote server to accept the
fingerprint:
diff --git a/doc/ci/test_cases/img/test_case_list_v13_6.png b/doc/ci/test_cases/img/test_case_list_v13_6.png
deleted file mode 100644
index b5d89582558..00000000000
--- a/doc/ci/test_cases/img/test_case_list_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/test_cases/img/test_case_show_v13_10.png b/doc/ci/test_cases/img/test_case_show_v13_10.png
new file mode 100644
index 00000000000..81e87dfcff8
--- /dev/null
+++ b/doc/ci/test_cases/img/test_case_show_v13_10.png
Binary files differ
diff --git a/doc/ci/test_cases/img/test_case_show_v13_6.png b/doc/ci/test_cases/img/test_case_show_v13_6.png
deleted file mode 100644
index bbd7601cf30..00000000000
--- a/doc/ci/test_cases/img/test_case_show_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/test_cases/index.md b/doc/ci/test_cases/index.md
index 6385b1638ff..4bd38f4043a 100644
--- a/doc/ci/test_cases/index.md
+++ b/doc/ci/test_cases/index.md
@@ -13,7 +13,7 @@ type: reference
Test cases in GitLab can help your teams create testing scenarios in their existing development platform.
-This can help the Implementation and Testing teams collaborate, because they no longer have to
+Now your Implementation and Testing teams can collaborate better, as they no longer have to
use external test planning tools, which require additional overhead, context switching, and expense.
## Create a test case
@@ -22,7 +22,7 @@ Users with Reporter or higher [permissions](../../user/permissions.md) can creat
To create a test case in a GitLab project:
-1. Navigate to **CI/CD > Test Cases**.
+1. Go to **CI/CD > Test Cases**.
1. Select the **New test case** button. You are taken to the new test case form. Here you can enter
the new case's title, [description](../../user/markdown.md), attach a file, and assign [labels](../../user/project/labels.md).
1. Select the **Submit test case** button. You are taken to view the new test case.
@@ -34,14 +34,12 @@ issue list with a search query, including labels or the test case's title.
Users with Guest or higher [permissions](../../user/permissions.md) can view test cases.
-![Test case list page](img/test_case_list_v13_6.png)
-
To view a test case:
-1. In a project, navigate to **CI/CD > Test Cases**.
+1. In a project, go to **CI/CD > Test Cases**.
1. Select the title of the test case you want to view. You are taken to the test case page.
-![An example test case page](img/test_case_show_v13_6.png)
+![An example test case page](img/test_case_show_v13_10.png)
## Edit a test case
@@ -68,7 +66,7 @@ To archive a test case, on the test case's page, select the **Archive test case*
To view archived test cases:
-1. Navigate to **CI/CD > Test Cases**.
+1. Go to **CI/CD > Test Cases**.
1. Select **Archived**.
## Reopen an archived test case
diff --git a/doc/ci/triggers/README.md b/doc/ci/triggers/README.md
index b4cea48a362..fa97cbdfcec 100644
--- a/doc/ci/triggers/README.md
+++ b/doc/ci/triggers/README.md
@@ -188,10 +188,10 @@ source repository. Be sure to URL-encode `ref` if it contains slashes.
### Using webhook payload in the triggered pipeline
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31197) in GitLab 13.9.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-the-trigger_payload-variable). **(FREE SELF)**
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
+> - It's enabled on GitLab.com.
+> - It's recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-the-trigger_payload-variable). **(FREE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -203,21 +203,21 @@ so you can access the data with `cat $TRIGGER_PAYLOAD` or a similar command.
#### Enable or disable the `TRIGGER_PAYLOAD` variable
-The `TRIGGER_PAYLOAD` CI/CD variable is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
+The `TRIGGER_PAYLOAD` CI/CD variable is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can enable it.
+can opt to disable it.
-To enable it:
+To disable it:
```ruby
-Feature.enable(:ci_trigger_payload_into_pipeline)
+Feature.disable(:ci_trigger_payload_into_pipeline)
```
-To disable it:
+To enable it:
```ruby
-Feature.disable(:ci_trigger_payload_into_pipeline)
+Feature.enable(:ci_trigger_payload_into_pipeline)
```
## Making use of trigger variables
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index cddcf76236a..d4b9282ac38 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -119,7 +119,7 @@ associated with it. Usually one pipeline is a merge request pipeline, and the ot
is a branch pipeline.
This is usually caused by the `rules` configuration, and there are several ways to
-[prevent duplicate pipelines](yaml/README.md#prevent-duplicate-pipelines).
+[prevent duplicate pipelines](yaml/README.md#avoid-duplicate-pipelines).
#### A job is not in the pipeline
@@ -141,7 +141,7 @@ be checked to make sure the jobs are added to the correct pipeline type. For
example, if a merge request pipeline did not run, the jobs may have been added to
a branch pipeline instead.
-It's also possible that your [`workflow: rules`](yaml/README.md#workflowrules) configuration
+It's also possible that your [`workflow: rules`](yaml/README.md#workflow) configuration
blocked the pipeline, or allowed the wrong pipeline type.
### A job runs unexpectedly
@@ -164,7 +164,7 @@ a branch to its remote repository. To illustrate the problem, suppose you've had
1. A user creates a feature branch named `example` and pushes it to a remote repository.
1. A new pipeline starts running on the `example` branch.
-1. A user rebases the `example` branch on the latest `master` branch and force-pushes it to its remote repository.
+1. A user rebases the `example` branch on the latest default branch and force-pushes it to its remote repository.
1. A new pipeline starts running on the `example` branch again, however,
the previous pipeline (2) fails because of `fatal: reference is not a tree:` error.
@@ -258,8 +258,8 @@ When you use [`rules`](yaml/README.md#rules) with a `when:` clause without an `i
clause, multiple pipelines may run. Usually this occurs when you push a commit to
a branch that has an open merge request associated with it.
-To [prevent duplicate pipelines](yaml/README.md#prevent-duplicate-pipelines), use
-[`workflow: rules`](yaml/README.md#workflowrules) or rewrite your rules to control
+To [prevent duplicate pipelines](yaml/README.md#avoid-duplicate-pipelines), use
+[`workflow: rules`](yaml/README.md#workflow) or rewrite your rules to control
which pipelines can run.
### Console workaround if job using resource_group gets stuck
diff --git a/doc/ci/unit_test_reports.md b/doc/ci/unit_test_reports.md
index ee060f33d01..2aee5e364ad 100644
--- a/doc/ci/unit_test_reports.md
+++ b/doc/ci/unit_test_reports.md
@@ -28,7 +28,7 @@ in the pipeline detail view.
Consider the following workflow:
-1. Your `master` branch is rock solid, your project is using GitLab CI/CD and
+1. Your default branch is rock solid, your project is using GitLab CI/CD and
your pipelines indicate that there isn't anything broken.
1. Someone from your team submits a merge request, a test fails and the pipeline
gets the known red icon. To investigate more, you have to go through the job
@@ -44,7 +44,7 @@ First, GitLab Runner uploads all [JUnit report format XML files](https://www.ibm
as [artifacts](pipelines/job_artifacts.md#artifactsreportsjunit) to GitLab. Then, when you visit a merge request, GitLab starts
comparing the head and base branch's JUnit report format XML files, where:
-- The base branch is the target branch (usually `master`).
+- The base branch is the target branch (usually the default branch).
- The head branch is the source branch (the latest pipeline in each merge request).
The reports panel has a summary showing how many tests failed, how many had errors
@@ -197,7 +197,7 @@ There are a few tools that can produce JUnit report format XML files in C/C++.
#### GoogleTest
In the following example, `gtest` is used to generate the test reports.
-If there are multiple gtest executables created for different architectures (`x86`, `x64` or `arm`),
+If there are multiple `gtest` executables created for different architectures (`x86`, `x64` or `arm`),
you will be required to run each test providing a unique filename. The results
will then be aggregated together.
@@ -316,13 +316,21 @@ If JUnit report format XML files are generated and uploaded as part of a pipelin
can be viewed inside the pipelines details page. The **Tests** tab on this page will
display a list of test suites and cases reported from the XML file.
-![Test Reports Widget](img/pipelines_junit_test_report_ui_v12_5.png)
+![Test Reports Widget](img/pipelines_junit_test_report_v13_10.png)
You can view all the known test suites and click on each of these to see further
details, including the cases that make up the suite.
You can also retrieve the reports via the [GitLab API](../api/pipelines.md#get-a-pipelines-test-report).
+### Unit test reports parsing errors
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/263457) in GitLab 13.10.
+
+If parsing JUnit report XML results in an error, an indicator is shown next to the job name. Hovering over the icon shows the parser error in a tooltip. If multiple parsing errors come from [grouped jobs](jobs/index.md#group-jobs-in-a-pipeline), GitLab shows only the first error from the group.
+
+![Test Reports With Errors](img/pipelines_junit_test_report_with_errors_v13_10.png)
+
## Viewing JUnit screenshots on GitLab
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202114) in GitLab 13.0.
diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md
index b6228e26175..5da501d4d8b 100644
--- a/doc/ci/variables/README.md
+++ b/doc/ci/variables/README.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# GitLab CI/CD variables
+# GitLab CI/CD variables **(FREE)**
CI/CD variables are part of the environment in which [pipelines](../pipelines/index.md)
and jobs run. For example, you could:
@@ -161,7 +161,7 @@ You can use tools like [the AWS CLI](https://docs.aws.amazon.com/cli/latest/user
and [`kubectl`](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#the-kubeconfig-environment-variable)
to customize your configuration by using **File** type variables.
-Previously, a common pattern was to read the value of a CI variable, save it in a file, and then
+Previously, a common pattern was to read the value of a CI/CD variable, save it in a file, and then
use that file in your script:
```shell
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index 8d2df82a212..9d598c43ef0 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -7,142 +7,160 @@ type: reference
# Predefined variables reference
-For an introduction on this subject, read through the
-[CI/CD variables](README.md) document.
+Predefined [CI/CD variables](README.md) are available in every GitLab CI/CD pipeline.
-Some of the predefined variables are available only if a minimum
-version of [GitLab Runner](https://docs.gitlab.com/runner/) is used. Consult the table below to find the
-version of GitLab Runner that's required.
+Some variables are only available with more recent versions of [GitLab Runner](https://docs.gitlab.com/runner/).
-You can add a command to your `.gitlab-ci.yml` file to
-[output the values of all variables available for a job](README.md#list-all-environment-variables).
+You can [output the values of all variables available for a job](README.md#list-all-environment-variables)
+with a `script` command.
-Kubernetes-specific variables are detailed in the
-[Kubernetes deployment variables](../../user/project/clusters/index.md#deployment-variables) section.
+There are also [Kubernetes-specific deployment variables](../../user/project/clusters/index.md#deployment-variables).
+
+| Variable | GitLab | Runner | Description |
+|------------------------------------------|--------|--------|-------------|
+| `CHAT_CHANNEL` | 10.6 | all | The Source chat channel that triggered the [ChatOps](../chatops/index.md) command. |
+| `CHAT_INPUT` | 10.6 | all | The additional arguments passed with the [ChatOps](../chatops/index.md) command. |
+| `CI` | all | 0.4 | Available for all jobs executed in CI/CD. `true` when available. |
+| `CI_API_V4_URL` | 11.7 | all | The GitLab API v4 root URL. |
+| `CI_BUILDS_DIR` | all | 11.10 | The top-level directory where builds are executed. |
+| `CI_COMMIT_BEFORE_SHA` | 11.2 | all | The previous latest commit present on a branch. Is always `0000000000000000000000000000000000000000` in pipelines for merge requests. |
+| `CI_COMMIT_BRANCH` | 12.6 | 0.5 | The commit branch name. Available in branch pipelines, including pipelines for the default branch. Not available in merge request pipelines or tag pipelines. |
+| `CI_COMMIT_DESCRIPTION` | 10.8 | all | The description of the commit. If the title is shorter than 100 characters, the message without the first line. |
+| `CI_COMMIT_MESSAGE` | 10.8 | all | The full commit message. |
+| `CI_COMMIT_REF_NAME` | 9.0 | all | The branch or tag name for which project is built. |
+| `CI_COMMIT_REF_PROTECTED` | 11.11 | all | `true` if the job is running for a protected reference. |
+| `CI_COMMIT_REF_SLUG` | 9.0 | all | `CI_COMMIT_REF_NAME` in lowercase, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. No leading / trailing `-`. Use in URLs, host names and domain names. |
+| `CI_COMMIT_SHA` | 9.0 | all | The commit revision the project is built for. |
+| `CI_COMMIT_SHORT_SHA` | 11.7 | all | The first eight characters of `CI_COMMIT_SHA`. |
+| `CI_COMMIT_TAG` | 9.0 | 0.5 | The commit tag name. Available only in pipelines for tags. |
+| `CI_COMMIT_TIMESTAMP` | 13.4 | all | The timestamp of the commit in the ISO 8601 format. |
+| `CI_COMMIT_TITLE` | 10.8 | all | The title of the commit. The full first line of the message. |
+| `CI_CONCURRENT_ID` | all | 11.10 | The unique ID of build execution in a single executor. |
+| `CI_CONCURRENT_PROJECT_ID` | all | 11.10 | The unique ID of build execution in a single executor and project. |
+| `CI_CONFIG_PATH` | 9.4 | 0.5 | The path to the CI/CD configuration file. Defaults to `.gitlab-ci.yml`. |
+| `CI_DEBUG_TRACE` | all | 1.7 | `true` if [debug logging (tracing)](README.md#debug-logging) is enabled. |
+| `CI_DEFAULT_BRANCH` | 12.4 | all | The name of the project's default branch. |
+| `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` | 13.7 | all | The image prefix for pulling images through the Dependency Proxy. |
+| `CI_DEPENDENCY_PROXY_PASSWORD` | 13.7 | all | The password to pull images through the Dependency Proxy. |
+| `CI_DEPENDENCY_PROXY_SERVER` | 13.7 | all | The server for logging in to the Dependency Proxy. This is equivalent to `$CI_SERVER_HOST:$CI_SERVER_PORT`. |
+| `CI_DEPENDENCY_PROXY_USER` | 13.7 | all | The username to pull images through the Dependency Proxy. |
+| `CI_DEPLOY_FREEZE` | 13.2 | all | Only available if the pipeline runs during a [deploy freeze window](../../user/project/releases/index.md#prevent-unintentional-releases-by-setting-a-deploy-freeze). `true` when available. |
+| `CI_DEPLOY_PASSWORD` | 10.8 | all | The authentication password of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), if the project has one. |
+| `CI_DEPLOY_USER` | 10.8 | all | The authentication username of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), if the project has one. |
+| `CI_DISPOSABLE_ENVIRONMENT` | all | 10.1 | Only available if the job is executed in a disposable environment (something that is created only for this job and disposed of/destroyed after the execution - all executors except `shell` and `ssh`). `true` when available. |
+| `CI_ENVIRONMENT_NAME` | 8.15 | all | The name of the environment for this job. Available if [`environment:name`](../yaml/README.md#environmentname) is set. |
+| `CI_ENVIRONMENT_SLUG` | 8.15 | all | The simplified version of the environment name, suitable for inclusion in DNS, URLs, Kubernetes labels, and so on. Available if [`environment:name`](../yaml/README.md#environmentname) is set. |
+| `CI_ENVIRONMENT_URL` | 9.3 | all | The URL of the environment for this job. Available if [`environment:url`](../yaml/README.md#environmenturl) is set. |
+| `CI_HAS_OPEN_REQUIREMENTS` | 13.1 | all | Only available if the pipeline's project has an open [requirement](../../user/project/requirements/index.md). `true` when available. |
+| `CI_JOB_ID` | 9.0 | all | The internal ID of the job, unique across all jobs in the GitLab instance. |
+| `CI_JOB_IMAGE` | 12.9 | 12.9 | The name of the Docker image running the job. |
+| `CI_JOB_JWT` | 12.10 | all | A RS256 JSON web token to authenticate with third party systems that support JWT authentication, for example [HashiCorp's Vault](../secrets/index.md). |
+| `CI_JOB_MANUAL` | 8.12 | all | `true` if a job was started manually. |
+| `CI_JOB_NAME` | 9.0 | 0.5 | The name of the job. |
+| `CI_JOB_STAGE` | 9.0 | 0.5 | The name of the job's stage. |
+| `CI_JOB_STATUS` | all | 13.5 | The status of the job as each runner stage is executed. Use with [`after_script`](../yaml/README.md#after_script). Can be `success`, `failed`, or `canceled`. |
+| `CI_JOB_TOKEN` | 9.0 | 1.2 | A token to authenticate with [certain API endpoints](../../api/README.md#gitlab-ci-job-token) or download [dependent repositories](../../user/project/new_ci_build_permissions_model.md#dependent-repositories). The token is valid as long as the job is running. |
+| `CI_JOB_URL` | 11.1 | 0.5 | The job details URL. |
+| `CI_JOB_STARTED_AT` | 13.10 | all | The UTC datetime when a job started, in [ISO 8601](https://tools.ietf.org/html/rfc3339#appendix-A) format. |
+| `CI_KUBERNETES_ACTIVE` | 13.0 | all | Only available if the pipeline has a Kubernetes cluster available for deployments. `true` when available. |
+| `CI_NODE_INDEX` | 11.5 | all | The index of the job in the job set. Only available if the job uses [`parallel`](../yaml/README.md#parallel). |
+| `CI_NODE_TOTAL` | 11.5 | all | The total number of instances of this job running in parallel. Set to `1` if the job does not use [`parallel`](../yaml/README.md#parallel). |
+| `CI_OPEN_MERGE_REQUESTS` | 13.8 | all | A comma-separated list of up to four merge requests that use the current branch and project as the merge request source. Only available in branch and merge request pipelines if the branch has an associated merge request. For example, `gitlab-org/gitlab!333,gitlab-org/gitlab-foss!11`. |
+| `CI_PAGES_DOMAIN` | 11.8 | all | The configured domain that hosts GitLab Pages. |
+| `CI_PAGES_URL` | 11.8 | all | The URL for a GitLab Pages site. Always a subdomain of `CI_PAGES_DOMAIN`. |
+| `CI_PIPELINE_ID` | 8.10 | all | The instance-level ID of the current pipeline. This ID is unique across all projects on the GitLab instance. |
+| `CI_PIPELINE_IID` | 11.0 | all | The project-level IID (internal ID) of the current pipeline. This ID is unique only within the current project. |
+| `CI_PIPELINE_SOURCE` | 10.0 | all | How the pipeline was triggered. Can be `push`, `web`, `schedule`, `api`, `external`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, [`trigger`, or `pipeline`](../triggers/README.md#authentication-tokens). |
+| `CI_PIPELINE_TRIGGERED` | all | all | `true` if the job was [triggered](../triggers/README.md). |
+| `CI_PIPELINE_URL` | 11.1 | 0.5 | The URL for the pipeline details. |
+| `CI_PIPELINE_CREATED_AT` | 13.10 | all | The UTC datetime when the pipeline was created, in [ISO 8601](https://tools.ietf.org/html/rfc3339#appendix-A) format. |
+| `CI_PROJECT_CONFIG_PATH` | 13.8 | all | (Deprecated) The CI configuration path for the project. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/321334) in GitLab 13.10. [Removal planned](https://gitlab.com/gitlab-org/gitlab/-/issues/322807) for GitLab 14.0. |
+| `CI_PROJECT_DIR` | all | all | The full path the repository is cloned to, and where the job runs from. If the GitLab Runner `builds_dir` parameter is set, this variable is set relative to the value of `builds_dir`. For more information, see the [Advanced GitLab Runner configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section). |
+| `CI_PROJECT_ID` | all | all | The ID of the current project. This ID is unique across all projects on the GitLab instance. |
+| `CI_PROJECT_NAME` | 8.10 | 0.5 | The name of the directory for the project. For example if the project URL is `gitlab.example.com/group-name/project-1`, `CI_PROJECT_NAME` is `project-1`. |
+| `CI_PROJECT_NAMESPACE` | 8.10 | 0.5 | The project namespace (username or group name) of the job. |
+| `CI_PROJECT_PATH_SLUG` | 9.3 | all | `$CI_PROJECT_PATH` in lowercase with characters that are not `a-z` or `0-9` replaced with `-`. Use in URLs and domain names. |
+| `CI_PROJECT_PATH` | 8.10 | 0.5 | The project namespace with the project name included. |
+| `CI_PROJECT_REPOSITORY_LANGUAGES` | 12.3 | all | A comma-separated, lowercase list of the languages used in the repository. For example `ruby,javascript,html,css`. |
+| `CI_PROJECT_ROOT_NAMESPACE` | 13.2 | 0.5 | The root project namespace (username or group name) of the job. For example, if `CI_PROJECT_NAMESPACE` is `root-group/child-group/grandchild-group`, `CI_PROJECT_ROOT_NAMESPACE` is `root-group`. |
+| `CI_PROJECT_TITLE` | 12.4 | all | The human-readable project name as displayed in the GitLab web interface. |
+| `CI_PROJECT_URL` | 8.10 | 0.5 | The HTTP(S) address of the project. |
+| `CI_PROJECT_VISIBILITY` | 10.3 | all | The project visibility. Can be `internal`, `private`, or `public`. |
+| `CI_REGISTRY_IMAGE` | 8.10 | 0.5 | The address of the project's Container Registry. Only available if the Container Registry is enabled for the project. |
+| `CI_REGISTRY_PASSWORD` | 9.0 | all | The password to push containers to the project's GitLab Container Registry. Only available if the Container Registry is enabled for the project. |
+| `CI_REGISTRY_USER` | 9.0 | all | The username to push containers to the project's GitLab Container Registry. Only available if the Container Registry is enabled for the project. |
+| `CI_REGISTRY` | 8.10 | 0.5 | The address of the GitLab Container Registry. Only available if the Container Registry is enabled for the project. This variable includes a `:port` value if one is specified in the registry configuration. |
+| `CI_REPOSITORY_URL` | 9.0 | all | The URL to clone the Git repository. |
+| `CI_RUNNER_DESCRIPTION` | 8.10 | 0.5 | The description of the runner. |
+| `CI_RUNNER_EXECUTABLE_ARCH` | all | 10.6 | The OS/architecture of the GitLab Runner executable. Might not be the same as the environment of the executor. |
+| `CI_RUNNER_ID` | 8.10 | 0.5 | The unique ID of the runner being used. |
+| `CI_RUNNER_REVISION` | all | 10.6 | The revision of the runner running the job. |
+| `CI_RUNNER_SHORT_TOKEN` | all | 12.3 | First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID. |
+| `CI_RUNNER_TAGS` | 8.10 | 0.5 | A comma-separated list of the runner tags. |
+| `CI_RUNNER_VERSION` | all | 10.6 | The version of the GitLab Runner running the job. |
+| `CI_SERVER_HOST` | 12.1 | all | The host of the GitLab instance URL, without protocol or port. For example `gitlab.example.com`. |
+| `CI_SERVER_NAME` | all | all | The name of CI/CD server that coordinates jobs. |
+| `CI_SERVER_PORT` | 12.8 | all | The port of the GitLab instance URL, without host or protocol. For example `8080`. |
+| `CI_SERVER_PROTOCOL` | 12.8 | all | The protocol of the GitLab instance URL, without host or port. For example `https`. |
+| `CI_SERVER_REVISION` | all | all | GitLab revision that schedules jobs. |
+| `CI_SERVER_URL` | 12.7 | all | The base URL of the GitLab instance, including protocol and port. For example `https://gitlab.example.com:8080`. |
+| `CI_SERVER_VERSION_MAJOR` | 11.4 | all | The major version of the GitLab instance. For example, if the GitLab version is `13.6.1`, the `CI_SERVER_VERSION_MAJOR` is `13`. |
+| `CI_SERVER_VERSION_MINOR` | 11.4 | all | The minor version of the GitLab instance. For example, if the GitLab version is `13.6.1`, the `CI_SERVER_VERSION_MINOR` is `6`. |
+| `CI_SERVER_VERSION_PATCH` | 11.4 | all | The patch version of the GitLab instance. For example, if the GitLab version is `13.6.1`, the `CI_SERVER_VERSION_PATCH` is `1`. |
+| `CI_SERVER_VERSION` | all | all | The full version of the GitLab instance. |
+| `CI_SERVER` | all | all | Available for all jobs executed in CI/CD. `yes` when available. |
+| `CI_SHARED_ENVIRONMENT` | all | 10.1 | Only available if the job is executed in a shared environment (something that is persisted across CI/CD invocations, like the `shell` or `ssh` executor). `true` when available. |
+| `GITLAB_CI` | all | all | Available for all jobs executed in CI/CD. `true` when available. |
+| `GITLAB_FEATURES` | 10.6 | all | The comma-separated list of licensed features available for the GitLab instance and license. |
+| `GITLAB_USER_EMAIL` | 8.12 | all | The email of the user who started the job. |
+| `GITLAB_USER_ID` | 8.12 | all | The ID of the user who started the job. |
+| `GITLAB_USER_LOGIN` | 10.0 | all | The username of the user who started the job. |
+| `GITLAB_USER_NAME` | 10.0 | all | The name of the user who started the job. |
+| `TRIGGER_PAYLOAD` | 13.9 | all | The webhook payload. Only available when a pipeline is [triggered with a webhook](../triggers/README.md#using-webhook-payload-in-the-triggered-pipeline). |
+
+## Predefined variables for merge request pipelines
+
+These variables are available when:
+
+- The pipelines [are merge request pipelines](../merge_request_pipelines/index.md).
+- The merge request is open.
+
+| Variable | GitLab | Runner | Description |
+|----------------------------------------|--------|--------|-------------|
+| `CI_MERGE_REQUEST_ASSIGNEES` | 11.9 | all | Comma-separated list of usernames of assignees for the merge request. |
+| `CI_MERGE_REQUEST_ID` | 11.6 | all | The instance-level ID of the merge request. This is a unique ID across all projects on GitLab. |
+| `CI_MERGE_REQUEST_IID` | 11.6 | all | The project-level IID (internal ID) of the merge request. This ID is unique for the current project. |
+| `CI_MERGE_REQUEST_LABELS` | 11.9 | all | Comma-separated label names of the merge request. |
+| `CI_MERGE_REQUEST_MILESTONE` | 11.9 | all | The milestone title of the merge request. |
+| `CI_MERGE_REQUEST_PROJECT_ID` | 11.6 | all | The ID of the project of the merge request. |
+| `CI_MERGE_REQUEST_PROJECT_PATH` | 11.6 | all | The path of the project of the merge request. For example `namespace/awesome-project`. |
+| `CI_MERGE_REQUEST_PROJECT_URL` | 11.6 | all | The URL of the project of the merge request. For example, `http://192.168.10.15:3000/namespace/awesome-project`. |
+| `CI_MERGE_REQUEST_REF_PATH` | 11.6 | all | The ref path of the merge request. For example, `refs/merge-requests/1/head`. |
+| `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` | 11.6 | all | The source branch name of the merge request. |
+| `CI_MERGE_REQUEST_SOURCE_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the source branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
+| `CI_MERGE_REQUEST_SOURCE_PROJECT_ID` | 11.6 | all | The ID of the source project of the merge request. |
+| `CI_MERGE_REQUEST_SOURCE_PROJECT_PATH` | 11.6 | all | The path of the source project of the merge request. |
+| `CI_MERGE_REQUEST_SOURCE_PROJECT_URL` | 11.6 | all | The URL of the source project of the merge request. |
+| `CI_MERGE_REQUEST_TARGET_BRANCH_NAME` | 11.6 | all | The target branch name of the merge request. |
+| `CI_MERGE_REQUEST_TARGET_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the target branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
+| `CI_MERGE_REQUEST_TITLE` | 11.9 | all | The title of the merge request. |
+| `CI_MERGE_REQUEST_EVENT_TYPE` | 12.3 | all | The event type of the merge request. Can be `detached`, `merged_result` or `merge_train`. |
+| `CI_MERGE_REQUEST_DIFF_ID` | 13.7 | all | The version of the merge request diff. |
+| `CI_MERGE_REQUEST_DIFF_BASE_SHA` | 13.7 | all | The base SHA of the merge request diff. |
+
+## Predefined variables for external pull request pipelines
+
+These variables are only available when:
+
+- The pipelines are [external pull requests pipelines](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)
+- The pull request is open.
| Variable | GitLab | Runner | Description |
|-----------------------------------------------|--------|--------|-------------|
-| `CHAT_CHANNEL` | 10.6 | all | Source chat channel which triggered the [ChatOps](../chatops/index.md) command. |
-| `CHAT_INPUT` | 10.6 | all | Additional arguments passed in the [ChatOps](../chatops/index.md) command. |
-| `CI` | all | 0.4 | Mark that job is executed in CI environment. |
-| `CI_API_V4_URL` | 11.7 | all | The GitLab API v4 root URL. |
-| `CI_BUILDS_DIR` | all | 11.10 | Top-level directory where builds are executed. |
-| `CI_COMMIT_BEFORE_SHA` | 11.2 | all | The previous latest commit present on a branch. Is always `0000000000000000000000000000000000000000` in pipelines for merge requests. |
-| `CI_COMMIT_DESCRIPTION` | 10.8 | all | The description of the commit: the message without first line, if the title is shorter than 100 characters; full message in other case. |
-| `CI_COMMIT_MESSAGE` | 10.8 | all | The full commit message. |
-| `CI_COMMIT_REF_NAME` | 9.0 | all | The branch or tag name for which project is built. |
-| `CI_COMMIT_REF_PROTECTED` | 11.11 | all | `true` if the job is running on a protected reference, `false` if not. |
-| `CI_COMMIT_REF_SLUG` | 9.0 | all | `$CI_COMMIT_REF_NAME` in lowercase, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. No leading / trailing `-`. Use in URLs, host names and domain names. |
-| `CI_COMMIT_SHA` | 9.0 | all | The commit revision for which project is built. |
-| `CI_COMMIT_SHORT_SHA` | 11.7 | all | The first eight characters of `CI_COMMIT_SHA`. |
-| `CI_COMMIT_BRANCH` | 12.6 | 0.5 | The commit branch name. Present in branch pipelines, including pipelines for the default branch. Not present in merge request pipelines or tag pipelines. |
-| `CI_COMMIT_TAG` | 9.0 | 0.5 | The commit tag name. Present only when building tags. |
-| `CI_COMMIT_TITLE` | 10.8 | all | The title of the commit - the full first line of the message. |
-| `CI_COMMIT_TIMESTAMP` | 13.4 | all | The timestamp of the commit in the ISO 8601 format. |
-| `CI_CONCURRENT_ID` | all | 11.10 | Unique ID of build execution in a single executor. |
-| `CI_CONCURRENT_PROJECT_ID` | all | 11.10 | Unique ID of build execution in a single executor and project. |
-| `CI_CONFIG_PATH` | 9.4 | 0.5 | The path to CI configuration file. Defaults to `.gitlab-ci.yml`. |
-| `CI_DEBUG_TRACE` | all | 1.7 | Whether [debug logging (tracing)](README.md#debug-logging) is enabled. |
-| `CI_DEFAULT_BRANCH` | 12.4 | all | The name of the default branch for the project. |
-| `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` | 13.7 | all | The image prefix for pulling images through the Dependency Proxy. |
-| `CI_DEPENDENCY_PROXY_SERVER` | 13.7 | all | The server for logging in to the Dependency Proxy. This is equivalent to `$CI_SERVER_HOST:$CI_SERVER_PORT`. |
-| `CI_DEPENDENCY_PROXY_PASSWORD` | 13.7 | all | The password to use to pull images through the Dependency Proxy. |
-| `CI_DEPENDENCY_PROXY_USER` | 13.7 | all | The username to use to pull images through the Dependency Proxy. |
-| `CI_DEPLOY_FREEZE` | 13.2 | all | Included with the value `true` if the pipeline runs during a [deploy freeze window](../../user/project/releases/index.md#prevent-unintentional-releases-by-setting-a-deploy-freeze). |
-| `CI_DEPLOY_PASSWORD` | 10.8 | all | Authentication password of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), only present if the Project has one related. |
-| `CI_DEPLOY_USER` | 10.8 | all | Authentication username of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), only present if the Project has one related. |
-| `CI_DISPOSABLE_ENVIRONMENT` | all | 10.1 | Marks that the job is executed in a disposable environment (something that is created only for this job and disposed of/destroyed after the execution - all executors except `shell` and `ssh`). If the environment is disposable, it is set to true, otherwise it is not defined at all. |
-| `CI_ENVIRONMENT_NAME` | 8.15 | all | The name of the environment for this job. Only present if [`environment:name`](../yaml/README.md#environmentname) is set. |
-| `CI_ENVIRONMENT_SLUG` | 8.15 | all | A simplified version of the environment name, suitable for inclusion in DNS, URLs, Kubernetes labels, and so on. Only present if [`environment:name`](../yaml/README.md#environmentname) is set. |
-| `CI_ENVIRONMENT_URL` | 9.3 | all | The URL of the environment for this job. Only present if [`environment:url`](../yaml/README.md#environmenturl) is set. |
-| `CI_EXTERNAL_PULL_REQUEST_IID` | 12.3 | all | Pull Request ID from GitHub if the [pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_SOURCE_REPOSITORY` | 13.3 | all | The source repository name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_TARGET_REPOSITORY` | 13.3 | all | The target repository name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME` | 12.3 | all | The source branch name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the source branch of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME` | 12.3 | all | The target branch name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the target branch of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_HAS_OPEN_REQUIREMENTS` | 13.1 | all | Included with the value `true` only if the pipeline's project has any open [requirements](../../user/project/requirements/index.md). Not included if there are no open requirements for the pipeline's project. |
-| `CI_OPEN_MERGE_REQUESTS` | 13.8 | all | Available in branch and merge request pipelines. Contains a comma-separated list of up to four merge requests that use the current branch and project as the merge request source. For example `gitlab-org/gitlab!333,gitlab-org/gitlab-foss!11`. |
-| `CI_JOB_ID` | 9.0 | all | The unique ID of the current job that GitLab CI/CD uses internally. |
-| `CI_JOB_IMAGE` | 12.9 | 12.9 | The name of the image running the CI job. |
-| `CI_JOB_MANUAL` | 8.12 | all | The flag to indicate that job was manually started. |
-| `CI_JOB_NAME` | 9.0 | 0.5 | The name of the job as defined in `.gitlab-ci.yml`. |
-| `CI_JOB_STAGE` | 9.0 | 0.5 | The name of the stage as defined in `.gitlab-ci.yml`. |
-| `CI_JOB_STATUS` | all | 13.5 | The state of the job as each runner stage is executed. Use with [`after_script`](../yaml/README.md#after_script) where `CI_JOB_STATUS` can be either: `success`, `failed` or `canceled`. |
-| `CI_JOB_TOKEN` | 9.0 | 1.2 | Token used for authenticating with [a few API endpoints](../../api/README.md#gitlab-ci-job-token) and downloading [dependent repositories](../../user/project/new_ci_build_permissions_model.md#dependent-repositories). The token is valid as long as the job is running. |
-| `CI_JOB_JWT` | 12.10 | all | RS256 JSON web token that can be used for authenticating with third party systems that support JWT authentication, for example [HashiCorp's Vault](../secrets/index.md). |
-| `CI_JOB_URL` | 11.1 | 0.5 | Job details URL. |
-| `CI_KUBERNETES_ACTIVE` | 13.0 | all | Included with the value `true` only if the pipeline has a Kubernetes cluster available for deployments. Not included if no cluster is available. Can be used as an alternative to [`only:kubernetes`/`except:kubernetes`](../yaml/README.md#onlykubernetesexceptkubernetes) with [`rules:if`](../yaml/README.md#rulesif). |
-| `CI_MERGE_REQUEST_ASSIGNEES` | 11.9 | all | Comma-separated list of username(s) of assignee(s) for the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_ID` | 11.6 | all | The instance-level ID of the merge request. Only available if [the pipelines are for merge requests](../merge_request_pipelines/index.md) and the merge request is created. This is a unique ID across all projects on GitLab. |
-| `CI_MERGE_REQUEST_IID` | 11.6 | all | The project-level IID (internal ID) of the merge request. Only available If [the pipelines are for merge requests](../merge_request_pipelines/index.md) and the merge request is created. This ID is unique for the current project. |
-| `CI_MERGE_REQUEST_LABELS` | 11.9 | all | Comma-separated label names of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_MILESTONE` | 11.9 | all | The milestone title of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_PROJECT_ID` | 11.6 | all | The ID of the project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_PROJECT_PATH` | 11.6 | all | The path of the project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md) (for example `namespace/awesome-project`). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_PROJECT_URL` | 11.6 | all | The URL of the project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md) (for example `http://192.168.10.15:3000/namespace/awesome-project`). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_REF_PATH` | 11.6 | all | The ref path of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). (for example `refs/merge-requests/1/head`). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` | 11.6 | all | The source branch name of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the source branch of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used, the merge request is created, and the pipeline is a [merged result pipeline](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
-| `CI_MERGE_REQUEST_SOURCE_PROJECT_ID` | 11.6 | all | The ID of the source project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_PROJECT_PATH` | 11.6 | all | The path of the source project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_PROJECT_URL` | 11.6 | all | The URL of the source project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_TARGET_BRANCH_NAME` | 11.6 | all | The target branch name of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_TARGET_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the target branch of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used, the merge request is created, and the pipeline is a [merged result pipeline](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
-| `CI_MERGE_REQUEST_TITLE` | 11.9 | all | The title of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_EVENT_TYPE` | 12.3 | all | The event type of the merge request, if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Can be `detached`, `merged_result` or `merge_train`. |
-| `CI_MERGE_REQUEST_DIFF_ID` | 13.7 | all | The version of the merge request diff, if [the pipelines are for merge requests](../merge_request_pipelines/index.md). |
-| `CI_MERGE_REQUEST_DIFF_BASE_SHA` | 13.7 | all | The base SHA of the merge request diff, if [the pipelines are for merge requests](../merge_request_pipelines/index.md). |
-| `CI_NODE_INDEX` | 11.5 | all | Index of the job in the job set. If the job is not parallelized, this variable is not set. |
-| `CI_NODE_TOTAL` | 11.5 | all | Total number of instances of this job running in parallel. If the job is not parallelized, this variable is set to `1`. |
-| `CI_PAGES_DOMAIN` | 11.8 | all | The configured domain that hosts GitLab Pages. |
-| `CI_PAGES_URL` | 11.8 | all | URL to GitLab Pages-built pages. Always belongs to a subdomain of `CI_PAGES_DOMAIN`. |
-| `CI_PIPELINE_ID` | 8.10 | all | The instance-level ID of the current pipeline. This is a unique ID across all projects on GitLab. |
-| `CI_PIPELINE_IID` | 11.0 | all | The project-level IID (internal ID) of the current pipeline. This ID is unique for the current project. |
-| `CI_PIPELINE_SOURCE` | 10.0 | all | Indicates how the pipeline was triggered. Possible options are: `push`, `web`, `schedule`, `api`, `external`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, [`trigger`, or `pipeline`](../triggers/README.md#authentication-tokens). For pipelines created before GitLab 9.5, this is displayed as `unknown`. |
-| `CI_PIPELINE_TRIGGERED` | all | all | The flag to indicate that job was [triggered](../triggers/README.md). |
-| `CI_PIPELINE_URL` | 11.1 | 0.5 | Pipeline details URL. |
-| `CI_PROJECT_CONFIG_PATH` | 13.8 | all | The CI configuration path for the project. |
-| `CI_PROJECT_DIR` | all | all | The full path where the repository is cloned and where the job is run. If the GitLab Runner `builds_dir` parameter is set, this variable is set relative to the value of `builds_dir`. For more information, see [Advanced configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section) for GitLab Runner. |
-| `CI_PROJECT_ID` | all | all | The unique ID of the current project that GitLab CI/CD uses internally. |
-| `CI_PROJECT_NAME` | 8.10 | 0.5 | The name of the directory for the project that is being built. For example, if the project URL is `gitlab.example.com/group-name/project-1`, the `CI_PROJECT_NAME` would be `project-1`. |
-| `CI_PROJECT_NAMESPACE` | 8.10 | 0.5 | The project namespace (username or group name) that is being built. |
-| `CI_PROJECT_ROOT_NAMESPACE` | 13.2 | 0.5 | The **root** project namespace (username or group name) that is being built. For example, if `CI_PROJECT_NAMESPACE` is `root-group/child-group/grandchild-group`, `CI_PROJECT_ROOT_NAMESPACE` would be `root-group`. |
-| `CI_PROJECT_PATH` | 8.10 | 0.5 | The namespace with project name. |
-| `CI_PROJECT_PATH_SLUG` | 9.3 | all | `$CI_PROJECT_PATH` in lowercase and with everything except `0-9` and `a-z` replaced with `-`. Use in URLs and domain names. |
-| `CI_PROJECT_REPOSITORY_LANGUAGES` | 12.3 | all | Comma-separated, lowercase list of the languages used in the repository (for example `ruby,javascript,html,css`). |
-| `CI_PROJECT_TITLE` | 12.4 | all | The human-readable project name as displayed in the GitLab web interface. |
-| `CI_PROJECT_URL` | 8.10 | 0.5 | The HTTP(S) address to access project. |
-| `CI_PROJECT_VISIBILITY` | 10.3 | all | The project visibility (internal, private, public). |
-| `CI_REGISTRY` | 8.10 | 0.5 | If the Container Registry is enabled it returns the address of the GitLab Container Registry. This variable includes a `:port` value if one has been specified in the registry configuration. |
-| `CI_REGISTRY_IMAGE` | 8.10 | 0.5 | If the Container Registry is enabled for the project it returns the address of the registry tied to the specific project. |
-| `CI_REGISTRY_PASSWORD` | 9.0 | all | The password to use to push containers to the GitLab Container Registry, for the current project. |
-| `CI_REGISTRY_USER` | 9.0 | all | The username to use to push containers to the GitLab Container Registry, for the current project. |
-| `CI_REPOSITORY_URL` | 9.0 | all | The URL to clone the Git repository. |
-| `CI_RUNNER_DESCRIPTION` | 8.10 | 0.5 | The description of the runner as saved in GitLab. |
-| `CI_RUNNER_EXECUTABLE_ARCH` | all | 10.6 | The OS/architecture of the GitLab Runner executable (note that this is not necessarily the same as the environment of the executor). |
-| `CI_RUNNER_ID` | 8.10 | 0.5 | The unique ID of runner being used. |
-| `CI_RUNNER_REVISION` | all | 10.6 | GitLab Runner revision that is executing the current job. |
-| `CI_RUNNER_SHORT_TOKEN` | all | 12.3 | First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID. |
-| `CI_RUNNER_TAGS` | 8.10 | 0.5 | The defined runner tags. |
-| `CI_RUNNER_VERSION` | all | 10.6 | GitLab Runner version that is executing the current job. |
-| `CI_SERVER` | all | all | Mark that job is executed in CI environment. |
-| `CI_SERVER_URL` | 12.7 | all | The base URL of the GitLab instance, including protocol and port (like `https://gitlab.example.com:8080`). |
-| `CI_SERVER_HOST` | 12.1 | all | Host component of the GitLab instance URL, without protocol and port (like `gitlab.example.com`). |
-| `CI_SERVER_PORT` | 12.8 | all | Port component of the GitLab instance URL, without host and protocol (like `3000`). |
-| `CI_SERVER_PROTOCOL` | 12.8 | all | Protocol component of the GitLab instance URL, without host and port (like `https`). |
-| `CI_SERVER_NAME` | all | all | The name of CI server that is used to coordinate jobs. |
-| `CI_SERVER_REVISION` | all | all | GitLab revision that is used to schedule jobs. |
-| `CI_SERVER_VERSION` | all | all | GitLab version that is used to schedule jobs. |
-| `CI_SERVER_VERSION_MAJOR` | 11.4 | all | GitLab version major component. |
-| `CI_SERVER_VERSION_MINOR` | 11.4 | all | GitLab version minor component. |
-| `CI_SERVER_VERSION_PATCH` | 11.4 | all | GitLab version patch component. |
-| `CI_SHARED_ENVIRONMENT` | all | 10.1 | Marks that the job is executed in a shared environment (something that is persisted across CI invocations like `shell` or `ssh` executor). If the environment is shared, it is set to true, otherwise it is not defined at all. |
-| `GITLAB_CI` | all | all | Mark that job is executed in GitLab CI/CD environment. |
-| `GITLAB_FEATURES` | 10.6 | all | The comma separated list of licensed features available for your instance and plan. |
-| `GITLAB_USER_EMAIL` | 8.12 | all | The email of the user who started the job. |
-| `GITLAB_USER_ID` | 8.12 | all | The ID of the user who started the job. |
-| `GITLAB_USER_LOGIN` | 10.0 | all | The login username of the user who started the job. |
-| `GITLAB_USER_NAME` | 10.0 | all | The real name of the user who started the job. |
-| `TRIGGER_PAYLOAD` | 13.9 | all | This variable is available when a pipeline is [triggered with a webhook](../triggers/README.md#using-webhook-payload-in-the-triggered-pipeline) |
+| `CI_EXTERNAL_PULL_REQUEST_IID` | 12.3 | all | Pull request ID from GitHub. |
+| `CI_EXTERNAL_PULL_REQUEST_SOURCE_REPOSITORY` | 13.3 | all | The source repository name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_TARGET_REPOSITORY` | 13.3 | all | The target repository name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME` | 12.3 | all | The source branch name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the source branch of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME` | 12.3 | all | The target branch name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the target branch of the pull request. |
diff --git a/doc/ci/variables/where_variables_can_be_used.md b/doc/ci/variables/where_variables_can_be_used.md
index d057fe9c4cc..16c02b3482b 100644
--- a/doc/ci/variables/where_variables_can_be_used.md
+++ b/doc/ci/variables/where_variables_can_be_used.md
@@ -109,6 +109,7 @@ The following variables are known as "persisted":
- `CI_PIPELINE_ID`
- `CI_JOB_ID`
- `CI_JOB_TOKEN`
+- `CI_JOB_STARTED_AT`
- `CI_BUILD_ID`
- `CI_BUILD_TOKEN`
- `CI_REGISTRY_USER`
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index 2abfbd3a5b4..9329748e396 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -7,7 +7,7 @@ type: reference
<!-- markdownlint-disable MD044 -->
<!-- vale gitlab.Spelling = NO -->
-# Keyword reference for the .gitlab-ci.yml file
+# Keyword reference for the .gitlab-ci.yml file **(FREE)**
<!-- vale gitlab.Spelling = YES -->
<!-- markdownlint-enable MD044 -->
@@ -26,41 +26,43 @@ A job is defined as a list of keywords that define the job's behavior.
The keywords available for jobs are:
-| Keyword | Description |
-|:---------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| [`script`](#script) | Shell script that is executed by a runner. |
-| [`after_script`](#after_script) | Override a set of commands that are executed after job. |
-| [`allow_failure`](#allow_failure) | Allow job to fail. A failed job does not cause the pipeline to fail. |
-| [`artifacts`](#artifacts) | List of files and directories to attach to a job on success. Also available: `artifacts:paths`, `artifacts:exclude`, `artifacts:expose_as`, `artifacts:name`, `artifacts:untracked`, `artifacts:when`, `artifacts:expire_in`, and `artifacts:reports`. |
-| [`before_script`](#before_script) | Override a set of commands that are executed before job. |
-| [`cache`](#cache) | List of files that should be cached between subsequent runs. Also available: `cache:paths`, `cache:key`, `cache:untracked`, `cache:when`, and `cache:policy`. |
-| [`coverage`](#coverage) | Code coverage settings for a given job. |
-| [`dependencies`](#dependencies) | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from. |
-| [`environment`](#environment) | Name of an environment to which the job deploys. Also available: `environment:name`, `environment:url`, `environment:on_stop`, `environment:auto_stop_in`, and `environment:action`. |
-| [`except`](#onlyexcept-basic) | Limit when jobs are not created. Also available: [`except:refs`, `except:kubernetes`, `except:variables`, and `except:changes`](#onlyexcept-advanced). |
-| [`extends`](#extends) | Configuration entries that this job inherits from. |
-| [`image`](#image) | Use Docker images. Also available: `image:name` and `image:entrypoint`. |
-| [`include`](#include) | Include external YAML files. Also available: `include:local`, `include:file`, `include:template`, and `include:remote`. |
-| [`interruptible`](#interruptible) | Defines if a job can be canceled when made redundant by a newer run. |
-| [`only`](#onlyexcept-basic) | Limit when jobs are created. Also available: [`only:refs`, `only:kubernetes`, `only:variables`, and `only:changes`](#onlyexcept-advanced). |
-| [`pages`](#pages) | Upload the result of a job to use with GitLab Pages. |
-| [`parallel`](#parallel) | How many instances of a job should be run in parallel. |
-| [`release`](#release) | Instructs the runner to generate a [Release](../../user/project/releases/index.md) object. |
-| [`resource_group`](#resource_group) | Limit job concurrency. |
-| [`retry`](#retry) | When and how many times a job can be auto-retried in case of a failure. |
-| [`rules`](#rules) | List of conditions to evaluate and determine selected attributes of a job, and whether or not it's created. |
-| [`services`](#services) | Use Docker services images. Also available: `services:name`, `services:alias`, `services:entrypoint`, and `services:command`. |
-| [`stage`](#stage) | Defines a job stage (default: `test`). |
-| [`tags`](#tags) | List of tags that are used to select a runner. |
-| [`timeout`](#timeout) | Define a custom job-level timeout that takes precedence over the project-wide setting. |
-| [`trigger`](#trigger) | Defines a downstream pipeline trigger. |
-| [`variables`](#variables) | Define job variables on a job level. |
-| [`when`](#when) | When to run job. Also available: `when:manual` and `when:delayed`. |
+| Keyword | Description |
+| :-----------------------------------|:------------|
+| [`after_script`](#after_script) | Override a set of commands that are executed after job. |
+| [`allow_failure`](#allow_failure) | Allow job to fail. A failed job does not cause the pipeline to fail. |
+| [`artifacts`](#artifacts) | List of files and directories to attach to a job on success. |
+| [`before_script`](#before_script) | Override a set of commands that are executed before job. |
+| [`cache`](#cache) | List of files that should be cached between subsequent runs. |
+| [`coverage`](#coverage) | Code coverage settings for a given job. |
+| [`dependencies`](#dependencies) | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from. |
+| [`environment`](#environment) | Name of an environment to which the job deploys. |
+| [`except`](#onlyexcept-basic) | Limit when jobs are not created. |
+| [`extends`](#extends) | Configuration entries that this job inherits from. |
+| [`image`](#image) | Use Docker images. |
+| [`include`](#include) | Include external YAML files. |
+| [`inherit`](#inherit) | Select which global defaults all jobs inherit. |
+| [`interruptible`](#interruptible) | Defines if a job can be canceled when made redundant by a newer run. |
+| [`needs`](#needs) | Execute jobs earlier than the stage ordering. |
+| [`only`](#onlyexcept-basic) | Limit when jobs are created. |
+| [`pages`](#pages) | Upload the result of a job to use with GitLab Pages. |
+| [`parallel`](#parallel) | How many instances of a job should be run in parallel. |
+| [`release`](#release) | Instructs the runner to generate a [release](../../user/project/releases/index.md) object. |
+| [`resource_group`](#resource_group) | Limit job concurrency. |
+| [`retry`](#retry) | When and how many times a job can be auto-retried in case of a failure. |
+| [`rules`](#rules) | List of conditions to evaluate and determine selected attributes of a job, and whether or not it's created. |
+| [`script`](#script) | Shell script that is executed by a runner. |
+| [`secrets`](#secrets) | The CI/CD secrets the job needs. |
+| [`services`](#services) | Use Docker services images. |
+| [`stage`](#stage) | Defines a job stage. |
+| [`tags`](#tags) | List of tags that are used to select a runner. |
+| [`timeout`](#timeout) | Define a custom job-level timeout that takes precedence over the project-wide setting. |
+| [`trigger`](#trigger) | Defines a downstream pipeline trigger. |
+| [`variables`](#variables) | Define job variables on a job level. |
+| [`when`](#when) | When to run job. |
### Unavailable names for jobs
-Each job must have a unique name, but there are a few reserved `keywords` that
-can't be used as job names:
+You can't use these keywords as job names:
- `image`
- `services`
@@ -72,38 +74,27 @@ can't be used as job names:
- `cache`
- `include`
-### Reserved keywords
+### Custom default keyword values
-If you get a validation error when you use specific values (for example, `true` or `false`), try to:
+You can set global defaults for some keywords. Jobs that do not define one or more
+of the listed keywords use the value defined in the `default:` section.
-- Quote them.
-- Change them to a different form. For example, `/bin/true`.
+These job keywords can be defined inside a `default:` section:
-## Global keywords
-
-Some keywords are defined at a global level and affect all jobs in the pipeline.
-
-### Global defaults
-
-Some keywords can be set globally as the default for all jobs with the
-`default:` keyword. Default keywords can then be overridden by job-specific
-configuration.
-
-The following job keywords can be defined inside a `default:` block:
-
-- [`image`](#image)
-- [`services`](#services)
-- [`before_script`](#before_script)
- [`after_script`](#after_script)
-- [`tags`](#tags)
-- [`cache`](#cache)
- [`artifacts`](#artifacts)
+- [`before_script`](#before_script)
+- [`cache`](#cache)
+- [`image`](#image)
+- [`interruptible`](#interruptible)
- [`retry`](#retry)
+- [`services`](#services)
+- [`tags`](#tags)
- [`timeout`](#timeout)
-- [`interruptible`](#interruptible)
-In the following example, the `ruby:2.5` image is set as the default for all
-jobs except the `rspec 2.6` job, which uses the `ruby:2.6` image:
+The following example sets the `ruby:2.5` image as the default for all jobs in the pipeline.
+The `rspec 2.6` job does not use the default, because it overrides the default with
+a job-specific `image:` section:
```yaml
default:
@@ -117,87 +108,16 @@ rspec 2.6:
script: bundle exec rspec
```
-#### `inherit`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207484) in GitLab 12.9.
-
-You can disable inheritance of globally defined defaults
-and variables with the `inherit:` keyword.
-
-To enable or disable the inheritance of all `default:` or `variables:` keywords, use:
-
-- `default: true` or `default: false`
-- `variables: true` or `variables: false`
-
-To inherit only a subset of `default:` keywords or `variables:`, specify what
-you wish to inherit. Anything not listed is **not** inherited. Use
-one of the following formats:
-
-```yaml
-inherit:
- default: [keyword1, keyword2]
- variables: [VARIABLE1, VARIABLE2]
-```
-
-Or:
-
-```yaml
-inherit:
- default:
- - keyword1
- - keyword2
- variables:
- - VARIABLE1
- - VARIABLE2
-```
-
-In the example below:
-
-- `rubocop`:
- - inherits: Nothing.
-- `rspec`:
- - inherits: the default `image` and the `WEBHOOK_URL` variable.
- - does **not** inherit: the default `before_script` and the `DOMAIN` variable.
-- `capybara`:
- - inherits: the default `before_script` and `image`.
- - does **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
-- `karma`:
- - inherits: the default `image` and `before_script`, and the `DOMAIN` variable.
- - does **not** inherit: `WEBHOOK_URL` variable.
-
-```yaml
-default:
- image: 'ruby:2.4'
- before_script:
- - echo Hello World
-
-variables:
- DOMAIN: example.com
- WEBHOOK_URL: https://my-webhook.example.com
-
-rubocop:
- inherit:
- default: false
- variables: false
- script: bundle exec rubocop
-
-rspec:
- inherit:
- default: [image]
- variables: [WEBHOOK_URL]
- script: bundle exec rspec
+## Global keywords
-capybara:
- inherit:
- variables: false
- script: bundle exec capybara
+Some keywords are not defined in a job. These keywords control pipeline behavior
+or import additional pipeline configuration:
-karma:
- inherit:
- default: true
- variables: [DOMAIN]
- script: karma
-```
+| Keyword | Description |
+|-------------------------|:------------|
+| [`stages`](#stages) | The names and order of the pipeline stages. |
+| [`workflow`](#workflow) | Control what types of pipeline run. |
+| [`include`](#include) | Import configuration from other YAML files. |
### `stages`
@@ -235,13 +155,13 @@ If a job does not specify a [`stage`](#stage), the job is assigned the `test` st
To make a job start earlier and ignore the stage order, use
the [`needs`](#needs) keyword.
-### `workflow:rules`
+### `workflow`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29654) in GitLab 12.5
-The top-level `workflow:` keyword determines whether or not a pipeline is created.
-It accepts a single `rules:` keyword that is similar to [`rules:` defined in jobs](#rules).
-Use it to define what can trigger a new pipeline.
+Use `workflow:` to determine whether or not a pipeline is created.
+Define this keyword at the top level, with a single `rules:` keyword that
+is similar to [`rules:` defined in jobs](#rules).
You can use the [`workflow:rules` templates](#workflowrules-templates) to import
a preconfigured `workflow: rules` entry.
@@ -266,15 +186,15 @@ Some example `if` clauses for `workflow: rules`:
See the [common `if` clauses for `rules`](#common-if-clauses-for-rules) for more examples.
-For example, in the following configuration, pipelines run for all `push` events (changes to
-branches and new tags). Pipelines for push events with `-wip` in the commit message
+In the following example, pipelines run for all `push` events (changes to
+branches and new tags). Pipelines for push events with `-draft` in the commit message
don't run, because they are set to `when: never`. Pipelines for schedules or merge requests
don't run either, because no rules evaluate to true for them:
```yaml
workflow:
rules:
- - if: $CI_COMMIT_MESSAGE =~ /-wip$/
+ - if: $CI_COMMIT_MESSAGE =~ /-draft$/
when: never
- if: '$CI_PIPELINE_SOURCE == "push"'
```
@@ -300,13 +220,13 @@ The final `when: always` rule runs all other pipeline types, **including** merge
request pipelines.
If your rules match both branch pipelines and merge request pipelines,
-[duplicate pipelines](#prevent-duplicate-pipelines) can occur.
+[duplicate pipelines](#avoid-duplicate-pipelines) can occur.
#### `workflow:rules` templates
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217732) in GitLab 13.0.
-We provide templates that set up `workflow: rules`
+GitLab provides templates that set up `workflow: rules`
for common scenarios. These templates help prevent duplicate pipelines.
The [`Branch-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml)
@@ -314,12 +234,12 @@ makes your pipelines run for branches and tags.
Branch pipeline status is displayed in merge requests that use the branch
as a source. However, this pipeline type does not support any features offered by
-[Merge Request Pipelines](../merge_request_pipelines/), like
-[Pipelines for Merge Results](../merge_request_pipelines/#pipelines-for-merged-results)
-or [Merge Trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/).
-Use this template if you are intentionally avoiding those features.
+[merge request pipelines](../merge_request_pipelines/), like
+[pipelines for merge results](../merge_request_pipelines/#pipelines-for-merged-results)
+or [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/).
+This template intentionally avoids those features.
-It is [included](#include) as follows:
+To [include](#include) it:
```yaml
include:
@@ -327,25 +247,74 @@ include:
```
The [`MergeRequest-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml)
-makes your pipelines run for the default branch (usually `master`), tags, and
+makes your pipelines run for the default branch, tags, and
all types of merge request pipelines. Use this template if you use any of the
-the [Pipelines for Merge Requests features](../merge_request_pipelines/), as mentioned
-above.
+the [pipelines for merge requests features](../merge_request_pipelines/).
-It is [included](#include) as follows:
+To [include](#include) it:
```yaml
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
```
+#### Switch between branch pipelines and merge request pipelines
+
+> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) GitLab 13.8.
+
+To make the pipeline switch from branch pipelines to merge request pipelines after
+a merge request is created, add a `workflow: rules` section to your `.gitlab-ci.yml` file.
+
+If you use both pipeline types at the same time, [duplicate pipelines](#avoid-duplicate-pipelines)
+might run at the same time. To prevent duplicate pipelines, use the
+[`CI_OPEN_MERGE_REQUESTS` variable](../variables/predefined_variables.md).
+
+The following example is for a project that runs branch and merge request pipelines only,
+but does not run pipelines for any other case. It runs:
+
+- Branch pipelines when a merge request is not open for the branch.
+- Merge request pipelines when a merge request is open for the branch.
+
+```yaml
+workflow:
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
+ when: never
+ - if: '$CI_COMMIT_BRANCH'
+```
+
+If the pipeline is triggered by:
+
+- A merge request, run a merge request pipeline. For example, a merge request pipeline
+ can be triggered by a push to a branch with an associated open merge request.
+- A change to a branch, but a merge request is open for that branch, do not run a branch pipeline.
+- A change to a branch, but without any open merge requests, run a branch pipeline.
+
+You can also add a rule to an existing `workflow` section to switch from branch pipelines
+to merge request pipelines when a merge request is created.
+
+Add this rule to the top of the `workflow` section, followed by the other rules that
+were already present:
+
+```yaml
+workflow:
+ rules:
+ - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
+ when: never
+ - ... # Previously defined workflow rules here
+```
+
+[Triggered pipelines](../triggers/README.md) that run on a branch have a `$CI_COMMIT_BRANCH`
+set and could be blocked by a similar rule. Triggered pipelines have a pipeline source
+of `trigger` or `pipeline`, so `&& $CI_PIPELINE_SOURCE == "push"` ensures the rule
+does not block triggered pipelines.
+
### `include`
-> - Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 10.5.
-> - Available for Starter, Premium, and Ultimate in GitLab 10.6 and later.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/42861) to GitLab Free in 11.4.
+> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/42861) to GitLab Free in 11.4.
-Use the `include` keyword to include external YAML files in your CI/CD configuration.
+Use `include` to include external YAML files in your CI/CD configuration.
You can break down one long `gitlab-ci.yml` file into multiple files to increase readability,
or reduce duplication of the same configuration in multiple places.
@@ -355,8 +324,8 @@ You can also store template files in a central repository and `include` them in
otherwise the external file is not included.
You can't use [YAML anchors](#anchors) across different YAML files sourced by `include`.
-You can only refer to anchors in the same file. Instead of YAML anchors, you can
-use the [`extends` keyword](#extends).
+You can only refer to anchors in the same file. To reuse configuration from different
+YAML files, use [`!reference` tags](#reference-tags) or the [`extends` keyword](#extends).
`include` supports the following inclusion methods:
@@ -367,11 +336,11 @@ use the [`extends` keyword](#extends).
| [`remote`](#includeremote) | Include a file from a remote URL. Must be publicly accessible. |
| [`template`](#includetemplate) | Include templates that are provided by GitLab. |
-The `.gitlab-ci.yml` file configuration included by all methods is evaluated when the pipeline is created.
-The configuration is a snapshot in time and persisted in the database. Any changes to
-the referenced `.gitlab-ci.yml` file configuration is not reflected in GitLab until the next pipeline is created.
+When the pipeline starts, the `.gitlab-ci.yml` file configuration included by all methods is evaluated.
+The configuration is a snapshot in time and persists in the database. GitLab does not reflect any changes to
+the referenced `.gitlab-ci.yml` file configuration until the next pipeline starts.
-The files defined by `include` are:
+The `include` files are:
- Deep merged with those in the `.gitlab-ci.yml` file.
- Always evaluated first and merged with the content of the `.gitlab-ci.yml` file,
@@ -395,13 +364,13 @@ include:
file: '.compliance-gitlab-ci.yml'
```
-For an example of how you can include these predefined variables, and their impact on CI jobs,
-see the following [CI/CD variable demo](https://youtu.be/4XR8gw3Pkos).
+For an example of how you can include these predefined variables, and the variables' impact on CI/CD jobs,
+see this [CI/CD variable demo](https://youtu.be/4XR8gw3Pkos).
#### `include:local`
-`include:local` includes a file that is in the same repository as the `.gitlab-ci.yml` file.
-It's referenced with full paths relative to the root directory (`/`).
+Use `include:local` to include a file that is in the same repository as the `.gitlab-ci.yml` file.
+Use a full path relative to the root directory (`/`).
If you use `include:local`, make sure that both the `.gitlab-ci.yml` file and the local file
are on the same branch.
@@ -418,7 +387,7 @@ include:
- local: '/templates/.gitlab-ci-template.yml'
```
-This can be defined as a short local include:
+You can also use shorter syntax to define the path:
```yaml
include: '.gitlab-ci-production.yml'
@@ -432,8 +401,9 @@ Use local includes instead of symbolic links.
To include files from another private project on the same GitLab instance,
use `include:file`. You can use `include:file` in combination with `include:project` only.
+Use a full path, relative to the root directory (`/`).
-The included file is referenced with a full path, relative to the root directory (`/`). For example:
+For example:
```yaml
include:
@@ -441,7 +411,7 @@ include:
file: '/templates/.gitlab-ci-template.yml'
```
-You can also specify a `ref`. If not specified, it defaults to the `HEAD` of the project:
+You can also specify a `ref`. If you do not specify a value, the ref defaults to the `HEAD` of the project:
```yaml
include:
@@ -530,15 +500,15 @@ to resolve all files is 30 seconds.
#### Additional `includes` examples
-There is a list of [additional `includes` examples](includes.md) available.
+View [additional `includes` examples](includes.md).
## Keyword details
-The following are detailed explanations for keywords used to configure CI/CD pipelines.
+The following topics explain how to use keywords to configure CI/CD pipelines.
### `image`
-Used to specify [a Docker image](../docker/using_docker_images.md#what-is-an-image) to use for the job.
+Use `image` to specify [a Docker image](../docker/using_docker_images.md#what-is-an-image) to use for the job.
For:
@@ -559,13 +529,13 @@ For more information, see [Available settings for `image`](../docker/using_docke
#### `services`
-Used to specify a [service Docker image](../docker/using_docker_images.md#what-is-a-service), linked to a base image specified in [`image`](#image).
+Use `services` to specify a [service Docker image](../docker/using_docker_images.md#what-is-a-service), linked to a base image specified in [`image`](#image).
For:
- Usage examples, see [Define `image` and `services` from `.gitlab-ci.yml`](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml).
- Detailed usage information, refer to [Docker integration](../docker/index.md) documentation.
-- For example services, see [GitLab CI/CD Services](../services/index.md).
+- Example services, see [GitLab CI/CD Services](../services/index.md).
##### `services:name`
@@ -593,8 +563,11 @@ For more information, see [Available settings for `services`](../docker/using_do
### `script`
-`script` is the only required keyword that a job needs. It's a shell script
-that is executed by the runner. For example:
+Use `script` to specify a shell script for the runner to execute.
+
+All jobs except [trigger jobs](#trigger) require a `script` keyword.
+
+For example:
```yaml
job:
@@ -603,7 +576,7 @@ job:
You can use [YAML anchors with `script`](#yaml-anchors-for-scripts).
-This keyword can also contain several commands in an array:
+The `script` keyword can also contain several commands in an array:
```yaml
job:
@@ -637,7 +610,7 @@ job:
You can verify the syntax is valid with the [CI Lint](../lint.md) tool.
-Be careful when using these special characters as well:
+Be careful when using these characters as well:
- `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``.
@@ -657,10 +630,10 @@ job:
Use `before_script` to define an array of commands that should run before each job,
but after [artifacts](#artifacts) are restored.
-Scripts specified in `before_script` are concatenated with any scripts specified
-in the main [`script`](#script), and executed together in a single shell.
+Scripts you specify in `before_script` are concatenated with any scripts you specify
+in the main [`script`](#script). The combine scripts execute together in a single shell.
-It's possible to overwrite a globally defined `before_script` if you define it in a job:
+You can overwrite a globally-defined `before_script` if you define it in a job:
```yaml
default:
@@ -685,11 +658,11 @@ You can use [YAML anchors with `before_script`](#yaml-anchors-for-scripts).
Use `after_script` to define an array of commands that run after each job,
including failed jobs.
-If a job times out or is cancelled, the `after_script` commands are not executed.
-Support for executing `after_script` commands for timed-out or cancelled jobs
-[is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/15603).
+If a job times out or is cancelled, the `after_script` commands do not execute.
+An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/15603) exists to support
+executing `after_script` commands for timed-out or cancelled jobs.
-Scripts specified in `after_script` are executed in a new shell, separate from any
+Scripts you specify in `after_script` execute in a new shell, separate from any
`before_script` or `script` scripts. As a result, they:
- Have a current working directory set back to the default.
@@ -722,7 +695,7 @@ You can use [YAML anchors with `after_script`](#yaml-anchors-for-scripts).
#### Script syntax
-You can use special syntax in [`script`](README.md#script) sections to:
+You can use syntax in [`script`](README.md#script) sections to:
- [Split long commands](script.md#split-long-commands) into multiline commands.
- [Use color codes](script.md#add-color-codes-to-script-output) to make job logs easier to review.
@@ -731,9 +704,19 @@ You can use special syntax in [`script`](README.md#script) sections to:
### `stage`
-`stage` is defined per-job and relies on [`stages`](#stages), which is defined
-globally. Use `stage` to define which stage a job runs in, and jobs of the same
-`stage` are executed in parallel (subject to [certain conditions](#use-your-own-runners)). For example:
+Use `stage` to define which stage a job runs in. Jobs in the same
+`stage` can execute in parallel (subject to [certain conditions](#use-your-own-runners)).
+
+Jobs without a `stage` entry use the `test` stage by default. If you do not define
+[`stages`](#stages) in the pipeline, you can use the 5 default stages, which execute in
+this order:
+
+- [`.pre`](#pre-and-post)
+- `build`
+- `test`
+- `deploy`
+- [`.post`](#pre-and-post)
+For example:
```yaml
stages:
@@ -779,45 +762,39 @@ is greater than `1`.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31441) in GitLab 12.4.
-The following stages are available to every pipeline:
+Use `pre` and `post` for jobs that need to run first or last in a pipeline.
-- `.pre`, which is guaranteed to always be the first stage in a pipeline.
-- `.post`, which is guaranteed to always be the last stage in a pipeline.
+- `.pre` is guaranteed to always be the first stage in a pipeline.
+- `.post` is guaranteed to always be the last stage in a pipeline.
User-defined stages are executed after `.pre` and before `.post`.
-A pipeline is not created if all jobs are in `.pre` or `.post` stages.
+You must have a job in at least one stage other than `.pre` or `.post`.
-The order of `.pre` and `.post` can't be changed, even if defined out of order in the `.gitlab-ci.yml` file.
-For example, the following are equivalent configuration:
+You can't change the order of `.pre` and `.post`, even if you define them out of order in the `.gitlab-ci.yml` file.
+For example, the following configurations are equivalent:
-- Configured in order:
-
- ```yaml
- stages:
- - .pre
- - a
- - b
- - .post
- ```
-
-- Configured out of order:
-
- ```yaml
- stages:
- - a
- - .pre
- - b
- - .post
- ```
+```yaml
+stages:
+ - .pre
+ - a
+ - b
+ - .post
+```
-- Not explicitly configured:
+```yaml
+stages:
+ - a
+ - .pre
+ - b
+ - .post
+```
- ```yaml
- stages:
- - a
- - b
- ```
+```yaml
+stages:
+ - a
+ - b
+```
### `extends`
@@ -827,7 +804,7 @@ Use `extends` to reuse configuration sections. It's an alternative to [YAML anch
and is a little more flexible and readable. You can use `extends` to reuse configuration
from [included configuration files](#use-extends-and-include-together).
-In this example, the `rspec` job uses the configuration from the `.tests` template job.
+In the following example, the `rspec` job uses the configuration from the `.tests` template job.
GitLab:
- Performs a reverse deep merge based on the keys.
@@ -898,8 +875,8 @@ In GitLab 12.0 and later, it's also possible to use multiple parents for
#### Merge details
-`extends` is able to merge hashes but not arrays.
-The algorithm used for merge is "closest scope wins", so
+You can use `extends` to merge hashes but not arrays.
+The algorithm used for merge is "closest scope wins," so
keys from the last member always override anything defined on other
levels. For example:
@@ -951,7 +928,7 @@ rspec:
- rake rspec
```
-Note that in the example above:
+In this example:
- The `variables` sections merge, but `URL: "http://docker-url.internal"` overwrites `URL: "http://my-url.internal"`.
- `tags: ['docker']` overwrites `tags: ['production']`.
@@ -963,8 +940,8 @@ Note that in the example above:
To reuse configuration from different configuration files,
combine `extends` and [`include`](#include).
-In this example, a `script` is defined in the `included.yml` file.
-Then, in the `.gitlab-ci.yml` file, you use `extends` to refer
+In the following example, a `script` is defined in the `included.yml` file.
+Then, in the `.gitlab-ci.yml` file, `extends` refers
to the contents of the `script`:
- `included.yml`:
@@ -989,11 +966,11 @@ to the contents of the `script`:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3.
-Use the `rules` keyword to include or exclude jobs in pipelines.
+Use `rules` to include or exclude jobs in pipelines.
-Rules are evaluated *in order* until the first match. When matched, the job
+Rules are evaluated *in order* until the first match. When a match is found, the job
is either included or excluded from the pipeline, depending on the configuration.
-If included, the job also has [certain attributes](#rules-attributes)
+The job can also have [certain attributes](#rules-attributes)
added to it.
`rules` replaces [`only/except`](#onlyexcept-basic) and they can't be used together
@@ -1052,7 +1029,7 @@ The job is not added to the pipeline:
`when: always`.
- If a rule matches, and has `when: never` as the attribute.
-This example uses `if` to strictly limit when jobs run:
+The following example uses `if` to strictly limit when jobs run:
```yaml
job:
@@ -1100,15 +1077,14 @@ WARNING:
If you use a `when:` clause as the final rule (not including `when: never`), two
simultaneous pipelines may start. Both push pipelines and merge request pipelines can
be triggered by the same event (a push to the source branch for an open merge request).
-See how to [prevent duplicate pipelines](#prevent-duplicate-pipelines)
+See how to [prevent duplicate pipelines](#avoid-duplicate-pipelines)
for more details.
-#### Prevent duplicate pipelines
+#### Avoid duplicate pipelines
-Jobs defined with `rules` can trigger multiple pipelines with the same action. You
-don't have to explicitly configure rules for each type of pipeline to trigger them
-accidentally. Rules that are too broad could cause simultaneous pipelines of a different
-type to run unexpectedly.
+If a job uses `rules`, a single action, like pushing a commit to a branch, can trigger
+multiple pipelines. You don't have to explicitly configure rules for multiple types
+of pipeline to trigger them accidentally.
Some configurations that have the potential to cause duplicate pipelines cause a
[pipeline warning](../troubleshooting.md#pipeline-warnings) to be displayed.
@@ -1130,12 +1106,10 @@ other pipelines, including **both** push (branch) and merge request pipelines. W
this configuration, every push to an open merge request's source branch
causes duplicated pipelines.
-There are multiple ways to avoid duplicate pipelines:
-
-- Use [`workflow: rules`](#workflowrules) to specify which types of pipelines
- can run. To eliminate duplicate pipelines, use merge request pipelines only
- or push (branch) pipelines only.
+To avoid duplicate pipelines, you can:
+- Use [`workflow`](#workflow) to specify which types of pipelines
+ can run.
- Rewrite the rules to run the job only in very specific cases,
and avoid a final `when:` rule:
@@ -1146,7 +1120,7 @@ There are multiple ways to avoid duplicate pipelines:
- if: '$CUSTOM_VARIABLE == "true" && $CI_PIPELINE_SOURCE == "merge_request_event"'
```
-You can prevent duplicate pipelines by changing the job rules to avoid either push (branch)
+You can also avoid duplicate pipelines by changing the job rules to avoid either push (branch)
pipelines or merge request pipelines. However, if you use a `- when: always` rule without
`workflow: rules`, GitLab still displays a [pipeline warning](../troubleshooting.md#pipeline-warnings).
@@ -1162,7 +1136,8 @@ job:
- when: always
```
-Do not include both push and merge request pipelines in the same job:
+You should not include both push and merge request pipelines in the same job without
+[`workflow:rules` that prevent duplicate pipelines](#switch-between-branch-pipelines-and-merge-request-pipelines):
```yaml
job:
@@ -1192,22 +1167,13 @@ runs the other job (`job-with-rules`). Jobs with no rules default
to [`except: merge_requests`](#onlyexcept-basic), so `job-with-no-rules`
runs in all cases except merge requests.
-It is not possible to define rules based on whether or not a branch has an open
-merge request associated with it. You can't configure a job to be included in:
-
-- Only branch pipelines when the branch doesn't have a merge request associated with it.
-- Only merge request pipelines when the branch has a merge request associated with it.
-
-See the [related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) for more details.
-
#### `rules:if`
-`rules:if` clauses determine whether or not jobs are added to a pipeline by evaluating
-an `if` statement. If the `if` statement is true, the job is either included
-or excluded from a pipeline. In plain English, `if` rules can be interpreted as one of:
+Use `rules:if` clauses to specify when to add a job to a pipeline:
-- "If this rule evaluates to true, add the job" (default).
-- "If this rule evaluates to true, do not add the job" (by adding `when: never`).
+- If an `if` statement is true, add the job to the pipeline.
+- If an `if` statement is true, but it's combined with `when: never`, do not add the job to the pipeline.
+- If no `if` statements are true, do not add the job to the pipeline.
`rules:if` differs slightly from `only:variables` by accepting only a single
expression string per rule, rather than an array of them. Any set of expressions to be
@@ -1265,7 +1231,9 @@ check the value of the `$CI_PIPELINE_SOURCE` variable:
| `web` | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section. |
| `webide` | For pipelines created by using the [WebIDE](../../user/project/web_ide/index.md). |
-For example:
+The following example runs the job as a manual job in scheduled pipelines or in push
+pipelines (to branches or tags), with `when: on_success` (default). It does not
+add the job to any other pipeline type.
```yaml
job:
@@ -1277,11 +1245,8 @@ job:
- if: '$CI_PIPELINE_SOURCE == "push"'
```
-This example runs the job as a manual job in scheduled pipelines or in push
-pipelines (to branches or tags), with `when: on_success` (default). It does not
-add the job to any other pipeline type.
-
-Another example:
+The following example runs the job as a `when: on_success` job in [merge request pipelines](../merge_request_pipelines/index.md)
+and scheduled pipelines. It does not run in any other pipeline type.
```yaml
job:
@@ -1291,16 +1256,13 @@ job:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
```
-This example runs the job as a `when: on_success` job in [merge request pipelines](../merge_request_pipelines/index.md)
-and scheduled pipelines. It does not run in any other pipeline type.
-
Other commonly used variables for `if` clauses:
- `if: $CI_COMMIT_TAG`: If changes are pushed for a tag.
- `if: $CI_COMMIT_BRANCH`: If changes are pushed to any branch.
-- `if: '$CI_COMMIT_BRANCH == "master"'`: If changes are pushed to `master`.
+- `if: '$CI_COMMIT_BRANCH == "main"'`: If changes are pushed to `main`.
- `if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'`: If changes are pushed to the default
- branch (usually `master`). Use when you want to have the same configuration in multiple
+ branch. Use when you want to have the same configuration in multiple
projects with different default branches.
- `if: '$CI_COMMIT_BRANCH =~ /regex-expression/'`: If the commit branch matches a regular expression.
- `if: '$CUSTOM_VARIABLE !~ /regex-expression/'`: If the [custom variable](../variables/README.md#custom-cicd-variables)
@@ -1310,11 +1272,11 @@ Other commonly used variables for `if` clauses:
#### `rules:changes`
-`rules:changes` determines whether or not to add jobs to a pipeline by checking for
+Use `rules:changes` to specify when to add a job to a pipeline by checking for
changes to specific files.
-`rules: changes` works exactly the same way as [`only: changes` and `except: changes`](#onlychangesexceptchanges),
-accepting an array of paths. It's recommended to only use `rules: changes` with branch
+`rules: changes` works the same way as [`only: changes` and `except: changes`](#onlychangesexceptchanges).
+It accepts an array of paths. You should use `rules: changes` only with branch
pipelines or merge request pipelines. For example, it's common to use `rules: changes`
with merge request pipelines:
@@ -1337,7 +1299,7 @@ In this example:
- If `Dockerfile` has not changed, do not add job to any pipeline (same as `when: never`).
To use `rules: changes` with branch pipelines instead of merge request pipelines,
-change the `if:` clause in the example above to:
+change the `if:` clause in the previous example to:
```yaml
rules:
@@ -1359,7 +1321,7 @@ if there is no `if:` statement that limits the job to branch or merge request pi
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34272) in GitLab 13.6.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/267192) in GitLab 13.7.
-CI/CD variables can be used in `rules:changes` expressions to determine when
+You can use CI/CD variables in `rules:changes` expressions to determine when
to add jobs to a pipeline:
```yaml
@@ -1372,7 +1334,7 @@ docker build:
- $DOCKERFILES_DIR/*
```
-You can use The `$` character for both variables and paths. For example, if the
+You can use the `$` character for both variables and paths. For example, if the
`$DOCKERFILES_DIR` variable exists, its value is used. If it does not exist, the
`$` is interpreted as being part of a path.
@@ -1380,10 +1342,10 @@ You can use The `$` character for both variables and paths. For example, if the
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24021) in GitLab 12.4.
-`exists` accepts an array of paths and matches if any of these paths exist
-as files in the repository.
+Use `exists` to run a job when certain files exist in the repository.
+You can use an array of paths.
-In this example, `job` runs if a `Dockerfile` exists anywhere in the repository:
+In the following example, `job` runs if a `Dockerfile` exists anywhere in the repository:
```yaml
job:
@@ -1416,11 +1378,11 @@ For performance reasons, GitLab matches a maximum of 10,000 `exists` patterns. A
You can use [`allow_failure: true`](#allow_failure) in `rules:` to allow a job to fail, or a manual job to
wait for action, without stopping the pipeline itself. All jobs that use `rules:` default to `allow_failure: false`
-if `allow_failure:` is not defined.
+if you do not define `allow_failure:`.
The rule-level `rules:allow_failure` option overrides the job-level
-[`allow_failure`](#allow_failure) option, and is only applied when the job is
-triggered by the particular rule.
+[`allow_failure`](#allow_failure) option, and is only applied when
+the particular rule triggers the job.
```yaml
job:
@@ -1436,16 +1398,9 @@ In this example, if the first rule matches, then the job has `when: manual` and
#### `rules:variables`
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/209864) in GitLab 13.7.
-> - It was [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) on GitLab 13.8.
-> - It's enabled on GitLab.com.
-> - It's recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-rulesvariables). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) in GitLab 13.10.
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
-
-You can use [`variables`](#variables) in `rules:` to define variables for specific conditions.
+Use [`variables`](#variables) in `rules:` to define variables for specific conditions.
For example:
@@ -1465,25 +1420,6 @@ job:
- echo "Run another script if $IS_A_FEATURE exists"
```
-##### Enable or disable rules:variables **(FREE SELF)**
-
-rules:variables is under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:ci_rules_variables)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:ci_rules_variables)
-```
-
#### Complex rule clauses
To conjoin `if`, `changes`, and `exists` clauses with an `AND`, use them in the
@@ -1540,14 +1476,14 @@ to add jobs to pipelines, use [`rules`](#rules).
1. `except` defines the names of branches and tags the job does
**not** run for.
-There are a few rules that apply to the usage of job policy:
+A few rules apply to the usage of job policy:
- `only` and `except` are inclusive. If both `only` and `except` are defined
in a job specification, the ref is filtered by `only` and `except`.
- `only` and `except` can use regular expressions ([supported regexp syntax](#supported-onlyexcept-regexp-syntax)).
- `only` and `except` can specify a repository path to filter jobs for forks.
-In addition, `only` and `except` can use special keywords:
+In addition, `only` and `except` can use these keywords:
| **Value** | **Description** |
|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -1568,8 +1504,8 @@ Scheduled pipelines run on specific branches, so jobs configured with `only: bra
run on scheduled pipelines too. Add `except: schedules` to prevent jobs with `only: branches`
from running on scheduled pipelines.
-In the example below, `job` runs only for refs that start with `issue-`,
-whereas all branches are skipped:
+In the following example, `job` runs only for refs that start with `issue-`.
+All branches are skipped:
```yaml
job:
@@ -1581,8 +1517,8 @@ job:
- branches
```
-Pattern matching is case-sensitive by default. Use `i` flag modifier, like
-`/pattern/i` to make a pattern case-insensitive:
+Pattern matching is case-sensitive by default. Use the `i` flag modifier, like
+`/pattern/i`, to make a pattern case-insensitive:
```yaml
job:
@@ -1594,8 +1530,11 @@ job:
- branches
```
-In this example, `job` runs only for refs that are tagged, or if a build is
-explicitly requested by an API trigger or a [Pipeline Schedule](../pipelines/schedules.md):
+In the following example, `job` runs only for:
+
+- Git tags
+- [Triggers](../triggers/README.md#trigger-token)
+- [Scheduled pipelines](../pipelines/schedules.md)
```yaml
job:
@@ -1606,8 +1545,7 @@ job:
- schedules
```
-Use the repository path to have jobs executed only for the parent
-repository and not forks:
+To execute jobs only for the parent repository and not forks:
```yaml
job:
@@ -1618,11 +1556,11 @@ job:
- /^release/.*$/@gitlab-org/gitlab
```
-The above example runs `job` for all branches on `gitlab-org/gitlab`,
-except `master` and those with names prefixed with `release/`.
+This example runs `job` for all branches on `gitlab-org/gitlab`,
+except `master` and branches that start with `release/`.
If a job does not have an `only` rule, `only: ['branches', 'tags']` is set by
-default. If it does not have an `except` rule, it's empty.
+default. If the job does not have an `except` rule, it's empty.
For example, `job1` and `job2` are essentially the same:
@@ -1698,7 +1636,7 @@ the pipeline if the following is true:
- `(any listed refs are true) AND (any listed variables are true) AND (any listed changes are true) AND (any chosen Kubernetes status matches)`
-In the example below, the `test` job is `only` created when **all** of the following are true:
+In the following example, the `test` job is `only` created when **all** of the following are true:
- The pipeline is [scheduled](../pipelines/schedules.md) **or** runs for `master`.
- The `variables` keyword matches.
@@ -1721,7 +1659,7 @@ added if the following is true:
- `(any listed refs are true) OR (any listed variables are true) OR (any listed changes are true) OR (a chosen Kubernetes status matches)`
-In the example below, the `test` job is **not** created when **any** of the following are true:
+In the following example, the `test` job is **not** created when **any** of the following are true:
- The pipeline runs for the `master` branch.
- There are changes to the `README.md` file in the root directory of the repository.
@@ -1743,7 +1681,7 @@ test:
The `refs` strategy can take the same values as the
[simplified only/except configuration](#onlyexcept-basic).
-In the example below, the `deploy` job is created only when the
+In the following example, the `deploy` job is created only when the
pipeline is [scheduled](../pipelines/schedules.md) or runs for the `master` branch:
```yaml
@@ -1760,7 +1698,7 @@ deploy:
The `kubernetes` strategy accepts only the `active` keyword.
-In the example below, the `deploy` job is created only when the
+In the following example, the `deploy` job is created only when the
Kubernetes service is active in the project:
```yaml
@@ -1831,7 +1769,7 @@ In pipelines with [sources other than the three above](../variables/predefined_v
You can configure jobs to use `only: changes` with other `only: refs` keywords. However,
those jobs ignore the changes and always run.
-In this example, when you push commits to an existing branch, the `docker build` job
+In the following example, when you push commits to an existing branch, the `docker build` job
runs only if any of these files change:
- The `Dockerfile` file.
@@ -1928,7 +1866,7 @@ docker build service one:
- service-one/**/*
```
-In the example above, the pipeline might fail because of changes to a file in `service-one/**/*`.
+In this example, the pipeline might fail because of changes to a file in `service-one/**/*`.
A later commit that doesn't have changes in `service-one/**/*`
but does have changes to the `Dockerfile` can pass. The job
@@ -1962,13 +1900,22 @@ All files are considered to have changed when a scheduled pipeline runs.
> - In GitLab 12.3, maximum number of jobs in `needs` array raised from five to 50.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30631) in GitLab 12.8, `needs: []` lets jobs start immediately.
-Use the `needs:` keyword to execute jobs out-of-order. Relationships between jobs
+Use `needs:` to execute jobs out-of-order. Relationships between jobs
that use `needs` can be visualized as a [directed acyclic graph](../directed_acyclic_graph/index.md).
You can ignore stage ordering and run some jobs without waiting for others to complete.
Jobs in multiple stages can run concurrently.
-Let's consider the following example:
+The following example creates four paths of execution:
+
+- Linter: the `lint` job runs immediately without waiting for the `build` stage
+ to complete because it has no needs (`needs: []`).
+- Linux path: the `linux:rspec` and `linux:rubocop` jobs runs as soon as the `linux:build`
+ job finishes without waiting for `mac:build` to finish.
+- macOS path: the `mac:rspec` and `mac:rubocop` jobs runs as soon as the `mac:build`
+ job finishes, without waiting for `linux:build` to finish.
+- The `production` job runs as soon as all previous jobs finish; in this case:
+ `linux:build`, `linux:rspec`, `linux:rubocop`, `mac:build`, `mac:rspec`, `mac:rubocop`.
```yaml
linux:build:
@@ -2001,25 +1948,10 @@ production:
stage: deploy
```
-This example creates four paths of execution:
-
-- Linter: the `lint` job runs immediately without waiting for the `build` stage to complete because it has no needs (`needs: []`).
-
-- Linux path: the `linux:rspec` and `linux:rubocop` jobs runs as soon
- as the `linux:build` job finishes without waiting for `mac:build` to finish.
-
-- macOS path: the `mac:rspec` and `mac:rubocop` jobs runs as soon
- as the `mac:build` job finishes, without waiting for `linux:build` to finish.
-
-- The `production` job runs as soon as all previous jobs
- finish; in this case: `linux:build`, `linux:rspec`, `linux:rubocop`,
- `mac:build`, `mac:rspec`, `mac:rubocop`.
-
#### Requirements and limitations
-- If `needs:` is set to point to a job that is not instantiated
- because of `only/except` rules or otherwise does not exist, the
- pipeline is not created and a YAML error is shown.
+- In GitLab 13.9 and older, if `needs:` refers to a job that might not be added to
+ a pipeline because of `only`, `except`, or `rules`, the pipeline might fail to create.
- The maximum number of jobs that a single job can need in the `needs:` array is limited:
- For GitLab.com, the limit is 50. For more information, see our
[infrastructure issue](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/7541).
@@ -2031,7 +1963,7 @@ This example creates four paths of execution:
- `needs:` is similar to `dependencies:` in that it must use jobs from prior stages,
meaning it's impossible to create circular dependencies. Depending on jobs in the
current stage is not possible either, but support [is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/30632).
-- Related to the above, stages must be explicitly defined for all jobs
+- Stages must be explicitly defined for all jobs
that have the keyword `needs:` or are referred to by one.
##### Changing the `needs:` job limit **(FREE SELF)**
@@ -2054,7 +1986,7 @@ To disable directed acyclic graphs (DAG), set the limit to `0`.
Use `artifacts: true` (default) or `artifacts: false` to control when artifacts are
downloaded in jobs that use `needs`.
-In this example, the `rspec` job downloads the `build_job` artifacts, but the
+In the following example, the `rspec` job downloads the `build_job` artifacts, but the
`rubocop` job does not:
```yaml
@@ -2077,7 +2009,7 @@ rubocop:
artifacts: false
```
-In this example, the `rspec` job downloads the artifacts from all three `build_jobs`.
+In the following example, the `rspec` job downloads the artifacts from all three `build_jobs`.
`artifacts` is:
- Set to true for `build_job_1`.
@@ -2128,7 +2060,7 @@ The user running the pipeline must have at least `reporter` access to the group
Use `needs` to download artifacts from different pipelines in the current project.
Set the `project` keyword as the current project's name, and specify a ref.
-In this example, `build_job` downloads the artifacts for the latest successful
+In the following example, `build_job` downloads the artifacts for the latest successful
`build-1` job with the `other-ref` ref:
```yaml
@@ -2160,12 +2092,13 @@ build_job:
artifacts: true
```
-Downloading artifacts from jobs that are run in [`parallel:`](#parallel) is not supported.
+You can't download artifacts from jobs that run in [`parallel:`](#parallel).
+
+To download artifacts between [parent-child pipelines](../parent_child_pipelines.md),
+use [`needs:pipeline`](#artifact-downloads-to-child-pipelines).
-To download artifacts between [parent-child pipelines](../parent_child_pipelines.md) use [`needs:pipeline`](#artifact-downloads-to-child-pipelines).
-Downloading artifacts from the same ref as the currently running pipeline is not
-recommended because artifacts could be overridden by concurrent pipelines running
-on the same ref.
+You should not download artifacts from the same ref as a running pipeline. Concurrent
+pipelines running on the same ref could override the artifacts.
##### Artifact downloads to child pipelines
@@ -2209,6 +2142,68 @@ in the same parent-child pipeline hierarchy of the given pipeline.
The `pipeline` attribute does not accept the current pipeline ID (`$CI_PIPELINE_ID`).
To download artifacts from a job in the current pipeline, use the basic form of [`needs`](#artifact-downloads-with-needs).
+#### Optional `needs`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30680) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-optional-needs). **(FREE SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+To need a job that sometimes does not exist in the pipeline, add `optional: true`
+to the `needs` configuration. If not defined, `optional: false` is the default.
+
+Jobs that use [`rules`](#rules), [`only`, or `except`](#onlyexcept-basic), might
+not always exist in a pipeline. When the pipeline starts, it checks the `needs`
+relationships before running. Without `optional: true`, needs relationships that
+point to a job that does not exist stops the pipeline from starting and causes a pipeline
+error similar to:
+
+- `'job1' job needs 'job2' job, but it was not added to the pipeline`
+
+In this example:
+
+- When the branch is `master`, the `build` job exists in the pipeline, and the `rspec`
+ job waits for it to complete before starting.
+- When the branch is not `master`, the `build` job does not exist in the pipeline.
+ The `rspec` job runs immediately (similar to `needs: []`) because its `needs`
+ relationship to the `build` job is optional.
+
+```yaml
+build:
+ stage: build
+ rules:
+ - if: $CI_COMMIT_REF_NAME == "master"
+
+rspec:
+ stage: test
+ needs:
+ - job: build
+ optional: true
+```
+
+#### Enable or disable optional needs **(FREE SELF)**
+
+Optional needs is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:ci_needs_optional)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:ci_needs_optional)
+```
+
### `tags`
Use `tags` to select a specific runner from the list of all runners that are
@@ -2217,7 +2212,7 @@ available for the project.
When you register a runner, you can specify the runner's tags, for
example `ruby`, `postgres`, `development`.
-In this example, the job is run by a runner that
+In the following example, the job is run by a runner that
has both `ruby` and `postgres` tags defined.
```yaml
@@ -2266,7 +2261,7 @@ Assuming all other jobs are successful, the job's stage and its pipeline
show the same orange warning. However, the associated commit is marked as
"passed", without warnings.
-In the example below, `job1` and `job2` run in parallel, but if `job1`
+In the following example, `job1` and `job2` run in parallel. If `job1`
fails, it doesn't stop the next stage from running, because it's marked with
`allow_failure: true`:
@@ -2331,9 +2326,14 @@ The valid values of `when` are:
Added in GitLab 11.14.
1. `never`:
- With [`rules`](#rules), don't execute job.
- - With [`workflow:rules`](#workflowrules), don't run pipeline.
+ - With [`workflow`](#workflow), don't run pipeline.
-For example:
+In the following example, the script:
+
+1. Executes `cleanup_build_job` only when `build_job` fails.
+1. Always executes `cleanup_job` as the last step in pipeline regardless of
+ success or failure.
+1. Executes `deploy_job` when you run it manually in the GitLab UI.
```yaml
stages:
@@ -2372,13 +2372,6 @@ cleanup_job:
when: always
```
-The above script:
-
-1. Executes `cleanup_build_job` only when `build_job` fails.
-1. Always executes `cleanup_job` as the last step in pipeline regardless of
- success or failure.
-1. Executes `deploy_job` when you run it manually in the GitLab UI.
-
#### `when:manual`
A manual job is a type of job that is not executed automatically and must be explicitly
@@ -2386,7 +2379,8 @@ started by a user. You might want to use manual jobs for things like deploying t
To make a job manual, add `when: manual` to its configuration.
-Manual jobs can be started from the pipeline, job, [environment](../environments/index.md#configuring-manual-deployments),
+When the pipeline starts, manual jobs display as skipped and do not run automatically.
+They can be started from the pipeline, job, [environment](../environments/index.md#configure-manual-deployments),
and deployment views.
Manual jobs can be either optional or blocking:
@@ -2441,7 +2435,7 @@ To protect a manual job:
```
1. In the [protected environments settings](../environments/protected_environments.md#protecting-environments),
- select the environment (`production` in the example above) and add the users, roles or groups
+ select the environment (`production` in this example) and add the users, roles or groups
that are authorized to trigger the manual job to the **Allowed to Deploy** list. Only those in
this list can trigger this manual job, as well as GitLab administrators
who are always able to use protected environments.
@@ -2492,10 +2486,7 @@ Soon GitLab Runner picks up and starts the job.
### `environment`
Use `environment` to define the [environment](../environments/index.md) that a job deploys to.
-If `environment` is specified and no environment under that name exists, a new
-one is created automatically.
-
-In its simplest form, the `environment` keyword can be defined like:
+For example:
```yaml
deploy to production:
@@ -2504,34 +2495,20 @@ deploy to production:
environment: production
```
-In the above example, the `deploy to production` job is marked as doing a
-deployment to the `production` environment.
-
-#### `environment:name`
+You can assign a value to the `environment` keyword by using:
-The `environment: name` keyword can use any of the defined CI/CD [variables](#variables),
-including predefined, secure, or variables defined in the `.gitlab-ci.yml` file.
+- Plain text, like `production`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
You can't use variables defined in a `script` section.
-The `environment` name can contain:
+If you specify an `environment` and no environment with that name exists,
+an environment is created.
-- letters
-- digits
-- spaces
-- `-`
-- `_`
-- `/`
-- `$`
-- `{`
-- `}`
-
-Common names are `qa`, `staging`, and `production`, but you can use whatever
-name works with your workflow.
+#### `environment:name`
-Instead of defining the name of the environment right after the `environment`
-keyword, it's also possible to define it as a separate value. For that, use
-the `name` keyword under `environment`:
+Set a name for an [environment](../environments/index.md). For example:
```yaml
deploy to production:
@@ -2541,18 +2518,32 @@ deploy to production:
name: production
```
-#### `environment:url`
+Common environment names are `qa`, `staging`, and `production`, but you can use any
+name you want.
-The `environment:url` keyword can use any of the defined CI/CD [variables](#variables),
-including predefined, secure, or variables defined in the `.gitlab-ci.yml` file.
+You can assign a value to the `name` keyword by using:
+
+- Plain text, like `staging`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
You can't use variables defined in a `script` section.
-This optional value exposes buttons that take you to the defined URL
+The environment `name` can contain:
+
+- Letters
+- Digits
+- Spaces
+- `-`
+- `_`
+- `/`
+- `$`
+- `{`
+- `}`
+
+#### `environment:url`
-In this example, if the job finishes successfully, it creates buttons
-in the merge requests and in the environments/deployments pages that point
-to `https://prod.example.com`.
+Set a URL for an [environment](../environments/index.md). For example:
```yaml
deploy to production:
@@ -2563,12 +2554,18 @@ deploy to production:
url: https://prod.example.com
```
-#### `environment:on_stop`
+After the job completes, you can access the URL by using a button in the merge request,
+environment, or deployment pages.
+
+You can assign a value to the `url` keyword by using:
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22191) in GitLab 8.13.
-> - Starting with GitLab 8.14, when you have an environment that has a stop action
-> defined, GitLab automatically triggers a stop action when the associated
-> branch is deleted.
+- Plain text, like `https://prod.example.com`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
+
+You can't use variables defined in a `script` section.
+
+#### `environment:on_stop`
Closing (stopping) environments can be achieved with the `on_stop` keyword
defined under `environment`. It declares a different job that runs to close the
@@ -2578,8 +2575,6 @@ Read the `environment:action` section for an example.
#### `environment:action`
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22191) in GitLab 8.13.
-
Use the `action` keyword to specify jobs that prepare, start, or stop environments.
| **Value** | **Description** |
@@ -2618,7 +2613,7 @@ it is set to `manual`, so it needs a [manual action](#whenmanual) from
the GitLab UI to run.
Also in the example, `GIT_STRATEGY` is set to `none`. If the
-`stop_review_app` job is [automatically triggered](../environments/index.md#automatically-stopping-an-environment),
+`stop_review_app` job is [automatically triggered](../environments/index.md#stopping-an-environment),
the runner won’t try to check out the code after the branch is deleted.
The example also overwrites global variables. If your `stop` `environment` job depends
@@ -2627,14 +2622,18 @@ to change the job without overriding the global variables.
The `stop_review_app` job is **required** to have the following keywords defined:
-- `when` - [reference](#when)
+- `when`, defined at either:
+ - [The job level](#when).
+ - [In a rules clause](#rules). If you use `rules:` and `when: manual`, you should
+ also set [`allow_failure: true`](#allow_failure) so the pipeline can complete
+ even if the job doesn't run.
- `environment:name`
- `environment:action`
Additionally, both jobs should have matching [`rules`](../yaml/README.md#onlyexcept-basic)
or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration.
-In the example above, if the configuration is not identical:
+In the examples above, if the configuration is not identical:
- The `stop_review_app` job might not be included in all pipelines that include the `review_app` job.
- It is not possible to trigger the `action: stop` to stop the environment automatically.
@@ -2660,7 +2659,7 @@ When the environment for `review_app` is created, the environment's lifetime is
Every time the review app is deployed, that lifetime is also reset to `1 day`.
For more information, see
-[the environments auto-stop documentation](../environments/index.md#environments-auto-stop)
+[the environments auto-stop documentation](../environments/index.md#stop-an-environment-after-a-certain-time-period)
#### `environment:kubernetes`
@@ -2686,7 +2685,7 @@ environment, using the `production`
[Kubernetes namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/).
For more information, see
-[Available settings for `kubernetes`](../environments/index.md#configuring-kubernetes-deployments).
+[Available settings for `kubernetes`](../environments/index.md#configure-kubernetes-deployments).
NOTE:
Kubernetes configuration is not supported for Kubernetes clusters
@@ -2694,6 +2693,23 @@ that are [managed by GitLab](../../user/project/clusters/index.md#gitlab-managed
To follow progress on support for GitLab-managed clusters, see the
[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/38054).
+#### `environment:deployment_tier`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 13.10.
+
+Use the `deployment_tier` keyword to specify the tier of the deployment environment:
+
+```yaml
+deploy:
+ script: echo
+ environment:
+ name: customer-portal
+ deployment_tier: production
+```
+
+For more information,
+see [Deployment tier of environments](../environments/index.md#deployment-tier-of-environments).
+
#### Dynamic environments
Use CI/CD [variables](../variables/README.md) to dynamically name environments.
@@ -2722,7 +2738,7 @@ as Review Apps. You can see an example that uses Review Apps at
### `cache`
-Use the `cache` keyword to specify a list of files and directories to
+Use `cache` to specify a list of files and directories to
cache between jobs. You can only use paths that are in the local working copy.
If `cache` is defined outside the scope of jobs, it's set
@@ -2812,7 +2828,62 @@ URI-encoded `%2F`. A value made only of dots (`.`, `%2E`) is also forbidden.
You can specify a [fallback cache key](#fallback-cache-key) to use if the specified `cache:key` is not found.
-##### Fallback cache key
+##### Multiple caches
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32814) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-multiple-caches). **(FREE SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+You can have a maximum of four caches:
+
+```yaml
+test-job:
+ stage: build
+ cache:
+ - key:
+ files:
+ - Gemfile.lock
+ paths:
+ - vendor/ruby
+ - key:
+ files:
+ - yarn.lock
+ paths:
+ - .yarn-cache/
+ script:
+ - bundle install --path=vendor
+ - yarn install --cache-folder .yarn-cache
+ - echo Run tests...
+```
+
+If multiple caches are combined with a [Fallback cache key](#fallback-cache-key),
+the fallback is fetched multiple times if multiple caches are not found.
+
+##### Enable or disable multiple caches **(FREE SELF)**
+
+The multiple caches feature is under development and not ready for production use.
+It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:multiple_cache_per_job)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:multiple_cache_per_job)
+```
+
+#### Fallback cache key
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1534) in GitLab Runner 13.4.
@@ -2823,7 +2894,7 @@ to download cache that's tagged with `test`.
If a cache with this tag is not found, you can use `CACHE_FALLBACK_KEY` to
specify a cache to use when none exists.
-In this example, if the `$CI_COMMIT_REF_SLUG` is not found, the job uses the key defined
+In the following example, if the `$CI_COMMIT_REF_SLUG` is not found, the job uses the key defined
by the `CACHE_FALLBACK_KEY` variable:
```yaml
@@ -2860,7 +2931,7 @@ cache:
- node_modules
```
-In this example we're creating a cache for Ruby and Node.js dependencies that
+This example creates a cache for Ruby and Node.js dependencies that
is tied to current versions of the `Gemfile.lock` and `package.json` files. Whenever one of
these files changes, a new cache key is computed and a new cache is created. Any future
job runs that use the same `Gemfile.lock` and `package.json` with `cache:key:files`
@@ -2994,7 +3065,7 @@ To do so, add `policy: push` to the job.
### `artifacts`
-Use the `artifacts` keyword to specify a list of files and directories that are
+Use `artifacts` to specify a list of files and directories that are
attached to the job when it [succeeds, fails, or always](#artifactswhen).
The artifacts are sent to GitLab after the job finishes. They are
@@ -3461,8 +3532,7 @@ for more details.
### `retry`
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/3442) in GitLab 9.5.
-> - [Behavior expanded](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5 to control which failures to retry on.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5, you can control which failures to retry on.
Use `retry` to configure how many times a job is retried in
case of a failure.
@@ -3474,7 +3544,7 @@ If `retry` is set to `2`, and a job succeeds in a second run (first retry), it i
The `retry` value must be a positive integer, from `0` to `2`
(two retries maximum, three runs in total).
-This example retries all failure cases:
+The following example retries all failure cases:
```yaml
test:
@@ -3636,7 +3706,7 @@ deploystacks:
STACK: [data, processing]
```
-This example generates 10 parallel `deploystacks` jobs, each with different values
+The following example generates 10 parallel `deploystacks` jobs, each with different values
for `PROVIDER` and `STACK`:
```plaintext
@@ -3670,6 +3740,40 @@ deploystacks:
- PROVIDER: [aws, ovh, gcp, vultr]
```
+##### Parallel `matrix` trigger jobs
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/270957) in GitLab 13.10.
+
+Use `matrix:` to run a [trigger](#trigger) job multiple times in parallel in a single pipeline,
+but with different variable values for each instance of the job.
+
+```yaml
+deploystacks:
+ stage: deploy
+ trigger:
+ include: path/to/child-pipeline.yml
+ parallel:
+ matrix:
+ - PROVIDER: aws
+ STACK: [monitoring, app1]
+ - PROVIDER: ovh
+ STACK: [monitoring, backup]
+ - PROVIDER: [gcp, vultr]
+ STACK: [data]
+```
+
+This example generates 6 parallel `deploystacks` trigger jobs, each with different values
+for `PROVIDER` and `STACK`, and they create 6 different child pipelines with those variables.
+
+```plaintext
+deploystacks: [aws, monitoring]
+deploystacks: [aws, app1]
+deploystacks: [ovh, monitoring]
+deploystacks: [ovh, backup]
+deploystacks: [gcp, data]
+deploystacks: [vultr, data]
+```
+
### `trigger`
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8997) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.8.
@@ -3821,6 +3925,10 @@ To force the `trigger` job to wait for the downstream (multi-project or child) p
pipeline completes. At that point, the `trigger` job completes and displays the same status as
the downstream job.
+This setting can help keep your pipeline execution linear. In the following example, jobs from
+subsequent stages wait for the triggered pipeline to successfully complete before
+starting, which reduces parallelization.
+
```yaml
trigger_job:
trigger:
@@ -3828,10 +3936,6 @@ trigger_job:
strategy: depend
```
-This setting can help keep your pipeline execution linear. In the example above, jobs from
-subsequent stages wait for the triggered pipeline to successfully complete before
-starting, which reduces parallelization.
-
#### Trigger a pipeline by API call
To force a rebuild of a specific branch, tag, or commit, you can use an API call
@@ -3858,7 +3962,12 @@ When enabled, a pipeline is immediately canceled when a new pipeline starts on t
Set jobs as interruptible that can be safely canceled once started (for instance, a build job).
-For example:
+In the following example, a new pipeline run causes an existing running pipeline to be:
+
+- Canceled, if only `step-1` is running or pending.
+- Not canceled, once `step-2` starts running.
+
+After an uninterruptible job starts running, the pipeline cannot be canceled.
```yaml
stages:
@@ -3884,13 +3993,6 @@ step-3:
interruptible: true
```
-In the example above, a new pipeline run causes an existing running pipeline to be:
-
-- Canceled, if only `step-1` is running or pending.
-- Not canceled, once `step-2` starts running.
-
-When an uninterruptible job is running, the pipeline cannot be canceled, regardless of the final job's state.
-
### `resource_group`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15536) in GitLab 12.7.
@@ -3937,7 +4039,7 @@ executions. The [`trigger` keyword](#trigger) can trigger downstream pipelines.
[`resource_group` keyword](#resource_group) can co-exist with it. This is useful to control the
concurrency for deployment pipelines, while running non-sensitive jobs concurrently.
-This example has two pipeline configurations in a project. When a pipeline starts running,
+The following example has two pipeline configurations in a project. When a pipeline starts running,
non-sensitive jobs are executed first and aren't affected by concurrent executions in other
pipelines. However, GitLab ensures that there are no other deployment pipelines running before
triggering a deployment (child) pipeline. If other deployment pipelines are running, GitLab waits
@@ -3978,7 +4080,7 @@ deployment:
script: echo "Deploying..."
```
-Note that you must define [`strategy: depend`](#linking-pipelines-with-triggerstrategy)
+You must define [`strategy: depend`](#linking-pipelines-with-triggerstrategy)
with the `trigger` keyword. This ensures that the lock isn't released until the downstream pipeline
finishes.
@@ -3986,7 +4088,7 @@ finishes.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/merge_requests/19298) in GitLab 13.2.
-`release` indicates that the job creates a [Release](../../user/project/releases/index.md).
+Use `release` to create a [release](../../user/project/releases/index.md).
These keywords are supported:
@@ -3997,18 +4099,18 @@ These keywords are supported:
- [`milestones`](#releasemilestones) (optional)
- [`released_at`](#releasereleased_at) (optional)
-The Release is created only if the job processes without error. If the Rails API
-returns an error during Release creation, the `release` job fails.
+The release is created only if the job processes without error. If the Rails API
+returns an error during release creation, the `release` job fails.
#### `release-cli` Docker image
-The Docker image to use for the `release-cli` must be specified, using the following directive:
+You must specify the Docker image to use for the `release-cli`:
```yaml
image: registry.gitlab.com/gitlab-org/release-cli:latest
```
-#### Script
+#### `script`
All jobs except [trigger](#trigger) jobs must have the `script` keyword. A `release`
job can use the output from script commands, but you can use a placeholder script if
@@ -4041,11 +4143,12 @@ android-release:
#### `release:tag_name`
-The `tag_name` must be specified. It can refer to an existing Git tag or can be specified by the user.
+You must specify a `tag_name` for the release. The tag can refer to an existing Git tag or
+you can specify a new tag.
When the specified tag doesn't exist in the repository, a new tag is created from the associated SHA of the pipeline.
-For example, when creating a Release from a Git tag:
+For example, when creating a release from a Git tag:
```yaml
job:
@@ -4064,17 +4167,17 @@ job:
description: 'Release description'
```
-- The Release is created only if the job's main script succeeds.
-- If the Release already exists, it is not updated and the job with the `release` keyword fails.
+- The release is created only if the job's main script succeeds.
+- If the release already exists, it is not updated and the job with the `release` keyword fails.
- The `release` section executes after the `script` tag and before the `after_script`.
#### `release:name`
-The Release name. If omitted, it is populated with the value of `release: tag_name`.
+The release name. If omitted, it is populated with the value of `release: tag_name`.
#### `release:description`
-Specifies the long description of the Release. You can also specify a file that contains the
+Specifies the long description of the release. You can also specify a file that contains the
description.
##### Read description from a file
@@ -4112,8 +4215,7 @@ released_at: '2021-03-15T08:00:00Z'
#### Complete example for `release`
-Combining the individual examples given above for `release` results in the following
-code snippets. There are two options, depending on how you generate the
+If you combine the previous examples for `release`, you get two options, depending on how you generate the
tags. You can't use these options together, so choose one:
- To create a release when you push a Git tag, or when you add a Git tag
@@ -4197,7 +4299,7 @@ The entries under the `release` node are transformed into a `bash` command line
to the Docker container, which contains the [release-cli](https://gitlab.com/gitlab-org/release-cli).
You can also call the `release-cli` directly from a `script` entry.
-For example, using the YAML described above:
+For example, if you use the YAML described previously:
```shell
release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using the release-cli $EXTRA_DESCRIPTION" --tag-name "v${MAJOR}.${MINOR}.${REVISION}" --ref "$CI_COMMIT_SHA" --released-at "2020-07-15T08:00:00Z" --milestone "m1" --milestone "m2" --milestone "m3"
@@ -4207,7 +4309,7 @@ release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33014) in GitLab 13.4.
-`secrets` indicates the [CI/CD Secrets](../secrets/index.md) this job needs. It should be a hash,
+Use `secrets` to specify the [CI/CD Secrets](../secrets/index.md) the job needs. It should be a hash,
and the keys should be the names of the variables that are made available to the job.
The value of each secret is saved in a temporary file. This file's path is stored in these
variables.
@@ -4216,7 +4318,8 @@ variables.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28321) in GitLab 13.4.
-`vault` keyword specifies secrets provided by [Hashicorp's Vault](https://www.vaultproject.io/).
+Use `vault` to specify secrets provided by [Hashicorp's Vault](https://www.vaultproject.io/).
+
This syntax has multiple forms. The shortest form assumes the use of the
[KV-V2](https://www.vaultproject.io/docs/secrets/kv/kv-v2) secrets engine,
mounted at the default path `kv-v2`. The last part of the secret's path is the
@@ -4254,14 +4357,13 @@ job:
### `pages`
-`pages` is a special job that uploads static content to GitLab that
-is then published as a website. It has a special syntax, so the two
-requirements below must be met:
+Use `pages` to upload static content to GitLab. The content
+is then published as a website. You must:
-- Any static content must be placed under a `public/` directory.
-- `artifacts` with a path to the `public/` directory must be defined.
+- Place any static content in a `public/` directory.
+- Define [`artifacts`](#artifacts) with a path to the `public/` directory.
-The example below moves all files from the root of the project to the
+The following example moves all files from the root of the project to the
`public/` directory. The `.public` workaround is so `cp` does not also copy
`public/` to itself in an infinite loop:
@@ -4279,7 +4381,89 @@ pages:
- master
```
-Read more on [GitLab Pages user documentation](../../user/project/pages/index.md).
+View the [GitLab Pages user documentation](../../user/project/pages/index.md).
+
+### `inherit`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207484) in GitLab 12.9.
+
+Use `inherit:` to control inheritance of globally-defined defaults
+and variables.
+
+To enable or disable the inheritance of all `default:` or `variables:` keywords, use:
+
+- `default: true` or `default: false`
+- `variables: true` or `variables: false`
+
+To inherit only a subset of `default:` keywords or `variables:`, specify what
+you wish to inherit. Anything not listed is **not** inherited. Use
+one of the following formats:
+
+```yaml
+inherit:
+ default: [keyword1, keyword2]
+ variables: [VARIABLE1, VARIABLE2]
+```
+
+Or:
+
+```yaml
+inherit:
+ default:
+ - keyword1
+ - keyword2
+ variables:
+ - VARIABLE1
+ - VARIABLE2
+```
+
+In the following example:
+
+- `rubocop`:
+ - inherits: Nothing.
+- `rspec`:
+ - inherits: the default `image` and the `WEBHOOK_URL` variable.
+ - does **not** inherit: the default `before_script` and the `DOMAIN` variable.
+- `capybara`:
+ - inherits: the default `before_script` and `image`.
+ - does **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
+- `karma`:
+ - inherits: the default `image` and `before_script`, and the `DOMAIN` variable.
+ - does **not** inherit: `WEBHOOK_URL` variable.
+
+```yaml
+default:
+ image: 'ruby:2.4'
+ before_script:
+ - echo Hello World
+
+variables:
+ DOMAIN: example.com
+ WEBHOOK_URL: https://my-webhook.example.com
+
+rubocop:
+ inherit:
+ default: false
+ variables: false
+ script: bundle exec rubocop
+
+rspec:
+ inherit:
+ default: [image]
+ variables: [WEBHOOK_URL]
+ script: bundle exec rspec
+
+capybara:
+ inherit:
+ variables: false
+ script: bundle exec capybara
+
+karma:
+ inherit:
+ default: true
+ variables: [DOMAIN]
+ script: karma
+```
## `variables`
@@ -4337,7 +4521,7 @@ You can use [YAML anchors for variables](#yaml-anchors-for-variables).
> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) GitLab 13.7.
-You can use the `value` and `description` keywords to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
+Use the `value` and `description` keywords to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
when [running a pipeline manually](../pipelines/index.md#run-a-pipeline-manually):
```yaml
@@ -4349,7 +4533,7 @@ variables:
### Configure runner behavior with variables
-You can use [CI/CD variables](../variables/README.md) to configure runner Git behavior:
+You can use [CI/CD variables](../variables/README.md) to configure how the runner processes Git requests:
- [`GIT_STRATEGY`](../runners/README.md#git-strategy)
- [`GIT_SUBMODULE_STRATEGY`](../runners/README.md#git-submodule-strategy)
@@ -4365,16 +4549,16 @@ You can use [CI/CD variables](../variables/README.md) to configure runner Git be
You can also use variables to configure how many times a runner
[attempts certain stages of job execution](../runners/README.md#job-stages-attempts).
-## Special YAML features
+## YAML-specific features
-It's possible to use special YAML features like anchors (`&`), aliases (`*`)
+In your `.gitlab-ci.yml` file, you can use YAML-specific features like anchors (`&`), aliases (`*`),
and map merging (`<<`). Use these features to reduce the complexity
of the code in the `.gitlab-ci.yml` file.
Read more about the various [YAML features](https://learnxinyminutes.com/docs/yaml/).
-In most cases, the [`extends` keyword](#extends) is more user friendly and should
-be used over these special YAML features.
+In most cases, the [`extends` keyword](#extends) is more user friendly and you should
+use it when possible.
You can use YAML anchors to merge YAML arrays.
@@ -4387,9 +4571,10 @@ Use anchors to duplicate or inherit properties. Use anchors with [hidden jobs](#
to provide templates for your jobs. When there are duplicate keys, GitLab
performs a reverse deep merge based on the keys.
-You can't use YAML anchors across multiple files when leveraging the [`include`](#include)
-feature. Anchors are only valid in the file they were defined in. Instead
-of using YAML anchors, you can use the [`extends` keyword](#extends).
+You can't use YAML anchors across multiple files when using the [`include`](#include)
+keyword. Anchors are only valid in the file they were defined in. To reuse configuration
+from different YAML files, use [`!reference` tags](#reference-tags) or the
+[`extends` keyword](#extends).
The following example uses anchors and map merging. It creates two jobs,
`test1` and `test2`, that inherit the `.job_template` configuration, each
@@ -4414,8 +4599,8 @@ test2:
```
`&` sets up the name of the anchor (`job_configuration`), `<<` means "merge the
-given hash into the current one", and `*` includes the named anchor
-(`job_configuration` again). The expanded version of the example above is:
+given hash into the current one," and `*` includes the named anchor
+(`job_configuration` again). The expanded version of this example is:
```yaml
.job_template:
@@ -4555,7 +4740,7 @@ Use [YAML anchors](#anchors) with `variables` to repeat assignment
of variables across multiple jobs. You can also use YAML anchors when a job
requires a specific `variables` block that would otherwise override the global variables.
-In the example below, we override the `GIT_STRATEGY` variable without affecting
+The following example shows how override the `GIT_STRATEGY` variable without affecting
the use of the `SAMPLE_VARIABLE` variable:
```yaml
@@ -4575,7 +4760,7 @@ job_no_git_strategy:
### Hide jobs
-If you want to temporarily 'disable' a job, rather than commenting out all the
+If you want to temporarily disable a job, rather than commenting out all the
lines where the job is defined:
```yaml
@@ -4594,7 +4779,7 @@ GitLab CI/CD. In the following example, `.hidden_job` is ignored:
```
Use this feature to ignore jobs, or use the
-[special YAML features](#special-yaml-features) and transform the hidden jobs
+[YAML-specific features](#yaml-specific-features) and transform the hidden jobs
into templates.
### `!reference` tags
@@ -4606,7 +4791,7 @@ sections and reuse it in the current section. Unlike [YAML anchors](#anchors), y
use `!reference` tags to reuse configuration from [included](#include) configuration
files as well.
-In this example, a `script` and an `after_script` from two different locations are
+In the following example, a `script` and an `after_script` from two different locations are
reused in the `test` job:
- `setup.yml`:
@@ -4635,7 +4820,7 @@ reused in the `test` job:
- !reference [.teardown, after_script]
```
-In this example, `test-vars-1` reuses the all the variables in `.vars`, while `test-vars-2`
+In the following example, `test-vars-1` reuses the all the variables in `.vars`, while `test-vars-2`
selects a specific variable and reuses it as a new `MY_VAR` variable.
```yaml
@@ -4699,7 +4884,7 @@ Defining `image`, `services`, `cache`, `before_script`, and
`after_script` globally is deprecated. Support could be removed
from a future release.
-Use [`default:`](#global-defaults) instead. For example:
+Use [`default:`](#custom-default-keyword-values) instead. For example:
```yaml
default:
diff --git a/doc/ci/yaml/gitlab_ci_yaml.md b/doc/ci/yaml/gitlab_ci_yaml.md
index 765b982dbeb..851c9776c45 100644
--- a/doc/ci/yaml/gitlab_ci_yaml.md
+++ b/doc/ci/yaml/gitlab_ci_yaml.md
@@ -27,6 +27,7 @@ In the `.gitlab-ci.yml` file, you can define:
The scripts are grouped into **jobs**, and jobs run as part of a larger
**pipeline**. You can group multiple independent jobs into **stages** that run in a defined order.
+The CI/CD configuration needs at least one job that is [not hidden](README.md#hide-jobs).
You should organize your jobs in a sequence that suits your application and is in accordance with
the tests you wish to perform. To [visualize](../pipeline_editor/index.md#visualize-ci-configuration) the process, imagine
@@ -84,7 +85,7 @@ displayed by GitLab:
![pipeline status](img/pipeline_status.png)
If anything goes wrong, you can
-[roll back](../environments/index.md#retrying-and-rolling-back) the changes:
+[roll back](../environments/index.md#retry-or-roll-back-a-deployment) the changes:
![rollback button](img/rollback.png)
diff --git a/doc/ci/yaml/script.md b/doc/ci/yaml/script.md
index 5750fe1ba61..4fc52995fc1 100644
--- a/doc/ci/yaml/script.md
+++ b/doc/ci/yaml/script.md
@@ -121,10 +121,10 @@ job:
- echo -e "\e[31mThis text is red,\e[0m but this text isn't\e[31m however this text is red again."
```
-You can define the color codes in Shell variables, or even [custom environment variables](../variables/README.md#custom-cicd-variables),
+You can define the color codes in Shell environment variables, or even [custom CI/CD variables](../variables/README.md#custom-cicd-variables),
which makes the commands easier to read and reusable.
-For example, using the same example as above and variables defined in a `before_script`:
+For example, using the same example as above and environment variables defined in a `before_script`:
```yaml
job:
@@ -145,3 +145,34 @@ job:
- Write-Host $TXT_RED"This text is red,"$TXT_CLEAR" but this text isn't"$TXT_RED" however this text is red again."
- Write-Host "This text is not colored"
```
+
+## Troubleshooting
+
+### `Syntax is incorrect` in scripts that use `:`
+
+If you use a colon (`:`) in a script, GitLab might output:
+
+- `Syntax is incorrect`
+- `script config should be a string or a nested array of strings up to 10 levels deep`
+
+For example, if you use `"PRIVATE-TOKEN: ${PRIVATE_TOKEN}"` as part of a cURL command:
+
+```yaml
+pages-job:
+ stage: deploy
+ script:
+ - curl --header 'PRIVATE-TOKEN: ${PRIVATE_TOKEN}' "https://gitlab.example.com/api/v4/projects"
+```
+
+The YAML parser thinks the `:` defines a YAML keyword, and outputs the
+`Syntax is incorrect` error.
+
+To use commands that contain a colon, you should wrap the whole command
+in single quotes. You might need to change existing single quotes (`'`) into double quotes (`"`):
+
+```yaml
+pages-job:
+ stage: deploy
+ script:
+ - 'curl --header "PRIVATE-TOKEN: ${PRIVATE_TOKEN}" "https://gitlab.example.com/api/v4/projects"'
+```
diff --git a/doc/development/README.md b/doc/development/README.md
index 3d5335feb11..43ceb737dde 100644
--- a/doc/development/README.md
+++ b/doc/development/README.md
@@ -261,7 +261,7 @@ See [database guidelines](database/index.md).
## Product Intelligence guides
- [Product Intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Usage Ping guide](usage_ping.md)
+- [Usage Ping guide](usage_ping/index.md)
- [Snowplow guide](snowplow.md)
## Experiment guide
@@ -287,6 +287,7 @@ See [database guidelines](database/index.md).
## Domain-specific guides
- [CI/CD development documentation](cicd/index.md)
+- [AppSec development documentation](appsec/index.md)
## Other Development guides
diff --git a/doc/development/agent/user_stories.md b/doc/development/agent/user_stories.md
index 609be47a3cb..ab135cad9d3 100644
--- a/doc/development/agent/user_stories.md
+++ b/doc/development/agent/user_stories.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Kubernetes Agent user stories **(PREMIUM SELF)**
-The [personas in action](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#user-personas)
+The [personas in action](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#user-personas)
for the Kubernetes Agent are:
- [Sasha, the Software Developer](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#sasha-software-developer).
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index 85098689392..8bac02c99af 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -13,7 +13,7 @@ This document outlines the style guide for the GitLab [GraphQL API](../api/graph
<!-- vale gitlab.Spelling = NO -->
We use the [GraphQL Ruby gem](https://graphql-ruby.org/) written by [Robert Mosolgo](https://github.com/rmosolgo/).
<!-- vale gitlab.Spelling = YES -->
-In addition, we have a subscription to [GraphQL Pro](https://www.graphql.pro). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md).
+In addition, we have a subscription to [GraphQL Pro](https://graphql.pro/). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md).
All GraphQL queries are directed to a single endpoint
([`app/controllers/graphql_controller.rb#execute`](https://gitlab.com/gitlab-org/gitlab/blob/master/app%2Fcontrollers%2Fgraphql_controller.rb)),
@@ -76,6 +76,28 @@ Rake task.
Requests time out at 30 seconds.
+## Breaking changes
+
+The GitLab GraphQL API is [versionless](https://graphql.org/learn/best-practices/#versioning) which means
+developers must familiarize themselves with our [deprecation cycle of breaking changes](#breaking-changes).
+
+Breaking changes are:
+
+- Removing or renaming a field, argument, enum value or mutation.
+- Changing the type of a field, argument or enum value.
+- Raising the [complexity](#max-complexity) of a field or complexity multipliers in a resolver.
+- Changing a field from being _not_ nullable (`null: false`) to nullable (`null: true`), as
+discussed in [Nullable fields](#nullable-fields).
+- Changing an argument from being optional (`required: false`) to being required (`required: true`).
+- Changing the [max page size](#page-size-limit) of a connection.
+- Lowering the global limits for query complexity and depth.
+- Anything else that can result in queries hitting a limit that previously was allowed.
+
+Fields that use the [`feature_flag` property](#feature_flag-property) and the flag is disabled by default are exempt
+from the deprecation process, and can be removed at any time without notice.
+
+See the [deprecating fields and enum values](#deprecating-fields-arguments-and-enum-values) section for how to deprecate items.
+
## Global IDs
The GitLab GraphQL API uses Global IDs (i.e: `"gid://gitlab/MyObject/123"`)
@@ -448,7 +470,7 @@ fails. Consider this when toggling the visibility of the feature on or off on
production.
The `feature_flag` property does not allow the use of
-[feature gates based on actors](../development/feature_flags/development.md).
+[feature gates based on actors](../development/feature_flags/index.md).
This means that the feature flag cannot be toggled only for particular
projects, groups, or users, but instead can only be toggled globally for
everyone.
@@ -490,15 +512,18 @@ def foo
end
```
-## Deprecating fields and enum values
+## Deprecating fields, arguments, and enum values
The GitLab GraphQL API is versionless, which means we maintain backwards
-compatibility with older versions of the API with every change. Rather
-than removing a field or [enum value](#enums), we need to _deprecate_ it instead.
+compatibility with older versions of the API with every change.
+
+Rather than removing fields, arguments, or [enum values](#enums), they
+must be _deprecated_ instead.
+
The deprecated parts of the schema can then be removed in a future release
-in accordance with the [GitLab deprecation process](../api/graphql/index.md#deprecation-process).
+in accordance with the [GitLab deprecation process](../api/graphql/index.md#deprecation-and-removal-process).
-Fields and enum values are deprecated using the `deprecated` property.
+Fields, arguments, and enum values are deprecated using the `deprecated` property.
The value of the property is a `Hash` of:
- `reason` - Reason for the deprecation.
@@ -518,14 +543,15 @@ is appended to the `description`.
### Deprecation reason style guide
-Where the reason for deprecation is due to the field or enum value being
-replaced, the `reason` must be:
+Where the reason for deprecation is due to the field, argument, or enum value being
+replaced, the `reason` must indicate the replacement. For example, the
+following is a `reason` for a replaced field:
```plaintext
Use `otherFieldName`
```
-Example:
+Examples:
```ruby
field :designs, ::Types::DesignManagement::DesignCollectionType, null: true,
@@ -544,8 +570,8 @@ module Types
end
```
-If the field is not being replaced by another field, a descriptive
-deprecation `reason` should be given.
+If the field, argument, or enum value being deprecated is not being replaced,
+a descriptive deprecation `reason` should be given.
See also [Aliasing and deprecating mutations](#aliasing-and-deprecating-mutations).
@@ -594,7 +620,7 @@ end
```
Enum values can be deprecated using the
-[`deprecated` keyword](#deprecating-fields-and-enum-values).
+[`deprecated` keyword](#deprecating-fields-arguments-and-enum-values).
### Defining GraphQL enums dynamically from Rails enums
@@ -1567,7 +1593,7 @@ mount_aliased_mutation 'BarMutation', Mutations::FooMutation
```
This allows us to rename a mutation and continue to support the old name,
-when coupled with the [`deprecated`](#deprecating-fields-and-enum-values)
+when coupled with the [`deprecated`](#deprecating-fields-arguments-and-enum-values)
argument.
Example:
diff --git a/doc/development/application_limits.md b/doc/development/application_limits.md
index 3608636dd55..c42e9224105 100644
--- a/doc/development/application_limits.md
+++ b/doc/development/application_limits.md
@@ -139,14 +139,14 @@ end
Self-managed:
-- `default` - Everyone
+- `default`: Everyone.
GitLab.com:
-- `default` - Any system-wide feature
-- `free` - Namespaces and projects with a Free subscription
-- `bronze`- Namespaces and projects with a Bronze subscription
-- `silver` - Namespaces and projects with a Silver subscription
-- `gold` - Namespaces and projects with a Gold subscription
+- `default`: Any system-wide feature.
+- `free`: Namespaces and projects with a Free subscription.
+- `bronze`: Namespaces and projects with a Bronze subscription. This tier is no longer available for purchase.
+- `silver`: Namespaces and projects with a Premium subscription.
+- `gold`: Namespaces and projects with an Ultimate subscription.
The `test` environment doesn't have any plans.
diff --git a/doc/development/appsec/index.md b/doc/development/appsec/index.md
new file mode 100644
index 00000000000..e8ce885e75d
--- /dev/null
+++ b/doc/development/appsec/index.md
@@ -0,0 +1,32 @@
+---
+stage: Secure, Protect
+group: all
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: index, dev, reference
+---
+
+# Application Security development documentation
+
+Development guides that are specific to the stages that work on Application Security features are listed here.
+
+Please go to [Application Security](../../user/application_security/index.md) if you are looking for documentation on how to use those features.
+
+## Namespaces
+
+Application Security code in the Rails monolith is organized into the following namespaces, which generally follows
+the feature categories in the [Secure](https://about.gitlab.com/stages-devops-lifecycle/secure/) and [Protect](https://about.gitlab.com/stages-devops-lifecycle/protect/) stages.
+
+- `AppSec`: shared code.
+ - `AppSec::ContainerScanning`: Container Scanning code.
+ - `AppSec::Dast`: DAST code.
+ - `AppSec::DependencyScanning`: Dependency Scanning code.
+ - `AppSec::Fuzzing::Api`: API Fuzzing code.
+ - `AppSec::Fuzzing::Coverage`: Coverage Fuzzing code.
+ - `AppSec::Fuzzing`: Shared fuzzing code.
+ - `AppSec::LicenseCompliance`: License Compliance code.
+ - `AppSec::Sast`: SAST code.
+ - `AppSec::SecretDetection`: Secret Detection code.
+ - `AppSec::VulnMgmt`: Vulnerability Management code.
+
+Most AppSec code does not conform to these namespace guidelines. When developing, make an effort
+to move existing code into the appropriate namespace whenever possible.
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index 69055131ae8..5564d0722b0 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -224,17 +224,7 @@ Component statuses are linked to configuration documentation for each component.
### Component list
-Table description links:
-
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/)
-- [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit)
-- [GitLab chart](https://docs.gitlab.com/charts/)
-- [Minikube Minimal](https://docs.gitlab.com/charts/development/minikube/#deploying-gitlab-with-minimal-settings)
-- [GitLab.com](https://gitlab.com)
-- [Source](../install/installation.md)
-- [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit)
-
-| Component | Description | Omnibus GitLab | GitLab Environment Toolkit (GET) | GitLab chart | Minikube Minimal | GitLab.com | Source | GDK | CE/EE |
+| Component | Description | [Omnibus GitLab](https://docs.gitlab.com/omnibus/) | [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) | [GitLab chart](https://docs.gitlab.com/charts/) | [Minikube Minimal](https://docs.gitlab.com/charts/development/minikube/#deploying-gitlab-with-minimal-settings) | [GitLab.com](https://gitlab.com) | [Source](../install/installation.md) | [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) | [CE/EE](https://about.gitlab.com/install/ce-or-ee/) |
|-------------------------------------------------------|----------------------------------------------------------------------|:--------------:|:--------------:|:------------:|:----------------:|:----------:|:------:|:---:|:-------:|
| [Certificate Management](#certificate-management) | TLS Settings, Let's Encrypt | ✅ | ✅ | ✅ | ⚙ | ✅ | ⚙ | ⚙ | CE & EE |
| [Consul](#consul) | Database node discovery, failover | ⚙ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | EE Only |
@@ -332,7 +322,7 @@ Consul is a tool for service discovery and configuration. Consul is distributed,
- Configuration:
- [Omnibus](https://docs.gitlab.com/omnibus/settings/database.html#disabling-automatic-database-migration)
- [Charts](https://docs.gitlab.com/charts/charts/gitlab/migrations/)
- - [Source](../update/upgrading_from_source.md#14-install-libraries-migrations-etc)
+ - [Source](../update/upgrading_from_source.md#10-install-libraries-migrations-etc)
- Layer: Core Service (Data)
#### Elasticsearch
@@ -651,7 +641,7 @@ Redis is packaged to provide a place to store:
- [Project page](https://github.com/docker/distribution/blob/master/README.md)
- Configuration:
- - [Omnibus](../update/upgrading_from_source.md#14-install-libraries-migrations-etc)
+ - [Omnibus](../update/upgrading_from_source.md#10-install-libraries-migrations-etc)
- [Charts](https://docs.gitlab.com/charts/charts/registry/)
- [Source](../administration/packages/container_registry.md#enable-the-container-registry)
- [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/registry.md)
@@ -909,7 +899,7 @@ in Rails, scheduled to run whenever an SSH key is modified by a user.
instead of keys. In this case, `AuthorizedKeysCommand` is replaced with an
`AuthorizedPrincipalsCommand`. This extracts a username from the certificate
without using the Rails internal API, which is used instead of `key_id` in the
-`/api/internal/allowed` call later.
+[`/api/internal/allowed`](internal_api.md) call later.
GitLab Shell also has a few operations that do not involve Gitaly, such as
resetting two-factor authentication codes. These are handled in the same way,
diff --git a/doc/development/auto_devops.md b/doc/development/auto_devops.md
index eaf1d712f17..c127858d3e7 100644
--- a/doc/development/auto_devops.md
+++ b/doc/development/auto_devops.md
@@ -47,12 +47,12 @@ found in
## Development environment
-Configuring [GDK for Auto
-DevOps](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/auto_devops.md).
+See the [Simple way to develop/test Kubernetes workflows with a local cluster](https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/1064)
+issue for discussion around setting up Auto DevOps development environments.
## Monitoring on GitLab.com
The metric
-[`auto_devops_completed_pipelines_total`](https://thanos-query.ops.gitlab.net/graph?g0.range_input=72h&g0.max_source_resolution=0s&g0.expr=sum(increase(auto_devops_pipelines_completed_total%7Benvironment%3D%22gprd%22%7D%5B60m%5D))%20by%20(status)&g0.tab=0)
+[`auto_devops_completed_pipelines_total`](https://thanos.gitlab.net/graph?g0.range_input=72h&g0.max_source_resolution=0s&g0.expr=sum(increase(auto_devops_pipelines_completed_total%7Benvironment%3D%22gprd%22%7D%5B60m%5D))%20by%20(status)&g0.tab=0)
(only available to GitLab team members) counts completed Auto DevOps
pipelines, labeled by status.
diff --git a/doc/development/build_test_package.md b/doc/development/build_test_package.md
index 421ee5d0c84..1506017c6d5 100644
--- a/doc/development/build_test_package.md
+++ b/doc/development/build_test_package.md
@@ -40,7 +40,7 @@ used to trigger the build.
In scenarios where a configuration change is to be introduced and Omnibus GitLab
repository already has the necessary changes in a specific branch, you can build
-a package against that branch through an environment variable named
-`OMNIBUS_BRANCH`. To do this, specify that environment variable with the name of
+a package against that branch through a CI/CD variable named
+`OMNIBUS_BRANCH`. To do this, specify that variable with the name of
the branch as value in `.gitlab-ci.yml` and push a commit. This will create a
manual job that can be used to trigger the build.
diff --git a/doc/development/changelog.md b/doc/development/changelog.md
index f2c8aa4db62..98a3e75bb3c 100644
--- a/doc/development/changelog.md
+++ b/doc/development/changelog.md
@@ -45,7 +45,7 @@ the `author` field. GitLab team members **should not**.
**must** have a changelog entry, without `merge_request` value
and with `type` set to `security`.
- Any user-facing change **must** have a changelog entry. This includes both visual changes (regardless of how minor), and changes to the rendered DOM which impact how a screen reader may announce the content.
-- Any client-facing change to our REST and GraphQL APIs **must** have a changelog entry. This includes modifying complexity of GraphQL fields.
+- Any client-facing change to our REST and GraphQL APIs **must** have a changelog entry. See the [complete list what comprises a GraphQL breaking change](api_graphql_styleguide.md#breaking-changes).
- Performance improvements **should** have a changelog entry.
- Changes that need to be documented in the Product Intelligence [Event Dictionary](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary)
also require a changelog entry.
@@ -57,8 +57,7 @@ the `author` field. GitLab team members **should not**.
- Any change behind an enabled feature flag **should** have a changelog entry.
- Any change that adds new usage data metrics and changes that needs to be documented in Product Intelligence [Event Dictionary](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary) **should** have a changelog entry.
- A change that adds snowplow events **should** have a changelog entry -
-- A change that [removes a feature flag](feature_flags/development.md) **should** have a changelog entry -
- only if the feature flag did not default to true already.
+- A change that [removes a feature flag](feature_flags/index.md) **must** have a changelog entry.
- A fix for a regression introduced and then fixed in the same release (i.e.,
fixing a bug introduced during a monthly release candidate) **should not**
have a changelog entry.
diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md
index 0341abf5eeb..4ae49103d1b 100644
--- a/doc/development/chatops_on_gitlabcom.md
+++ b/doc/development/chatops_on_gitlabcom.md
@@ -61,4 +61,4 @@ To request access to ChatOps on GitLab.com:
- [ChatOps Usage](../ci/chatops/index.md)
- [Understanding EXPLAIN plans](understanding_explain_plans.md)
-- [Feature Groups](feature_flags/development.md#feature-groups)
+- [Feature Groups](feature_flags/index.md#feature-groups)
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 94b03634e25..ed0d217c247 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -47,7 +47,7 @@ performance:
```
and users include this template with passing an argument to the `performance` job.
-This can be done by specifying the environment variable `TARGET_URL` in _their_ `.gitlab-ci.yml`:
+This can be done by specifying the CI/CD variable `TARGET_URL` in _their_ `.gitlab-ci.yml`:
```yaml
include:
@@ -72,6 +72,10 @@ Please read [versioning](#versioning) section for introducing breaking change sa
When a root `.gitlab-ci.yml` [includes](../../ci/yaml/README.md#include)
multiple templates, these global keywords could be overridden by the
others and cause an unexpected behavior.
+- Include [a changelog](../changelog.md) if your merge request introduces a user-facing change.
+- Use [`$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH`](../../ci/variables/predefined_variables.md)
+ instead of a hardcoded `main` branch, and never use `master`.
+- Use [`rules`](../../ci/yaml/README.md#rules) instead of [`only` or `except`](../../ci/yaml/README.md#onlyexcept-basic), if possible.
## Versioning
@@ -88,7 +92,7 @@ for example `Jobs/Deploy.gitlab-ci.yml`.
You can make a new stable template by copying [the latest template](#latest-version)
available in a major milestone release of GitLab like `13.0`. All breaking changes
must be announced in a blog post before the official release, for example
-[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/releases/2020/05/06/gitlab-com-13-0-breaking-changes/)
+[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/blog/2020/05/06/gitlab-com-13-0-breaking-changes/)
You can change a stable template version in a minor GitLab release like `13.1` if:
@@ -180,7 +184,7 @@ is updated in a major version GitLab release.
## Security
A template could contain malicious code. For example, a template that contains the `export` shell command in a job
-might accidentally expose project secret variables in a job log.
+might accidentally expose secret project CI/CD variables in a job log.
If you're unsure if it's secure or not, you need to ask security experts for cross-validation.
## Contribute CI/CD Template Merge Requests
diff --git a/doc/development/code_intelligence/index.md b/doc/development/code_intelligence/index.md
index ac962e3ae3e..790ba1539b7 100644
--- a/doc/development/code_intelligence/index.md
+++ b/doc/development/code_intelligence/index.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index dada6adcce7..0a811ceba65 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -70,16 +70,16 @@ It picks reviewers and maintainers from the list at the
[engineering projects](https://about.gitlab.com/handbook/engineering/projects/)
page, with these behaviors:
-1. It doesn't pick people whose Slack or [GitLab status](../user/profile/index.md#current-status):
+1. It doesn't pick people whose Slack or [GitLab status](../user/profile/index.md#set-your-current-status):
- contains the string 'OOO', 'PTO', 'Parental Leave', or 'Friends and Family'
- emoji is `:palm_tree:`, `:beach:`, `:beach_umbrella:`, `:beach_with_umbrella:`, `:ferris_wheel:`, `:thermometer:`, `:face_with_thermometer:`, `:red_circle:`, `:bulb:`, `:sun_with_face:`.
1. [Trainee maintainers](https://about.gitlab.com/handbook/engineering/workflow/code-review/#trainee-maintainer)
are three times as likely to be picked as other reviewers.
-1. Team members whose Slack or [GitLab status](../user/profile/index.md#current-status) emoji
+1. Team members whose Slack or [GitLab status](../user/profile/index.md#set-your-current-status) emoji
is 🔵 `:large_blue_circle:` are more likely to be picked. This applies to both reviewers and trainee maintainers.
- Reviewers with `:large_blue_circle:` are two times as likely to be picked as other reviewers.
- Trainee maintainers with `:large_blue_circle:` are four times as likely to be picked as other reviewers.
-1. People whose [GitLab status](../user/profile/index.md#current-status) emoji
+1. People whose [GitLab status](../user/profile/index.md#set-your-current-status) emoji
is 🔶 `:large_orange_diamond:` are half as likely to be picked. This applies to both reviewers and trainee maintainers.
1. It always picks the same reviewers and maintainers for the same
branch name (unless their OOO status changes, as in point 1). It
@@ -283,6 +283,8 @@ first time.
you forget to remove any debugging code?
- Consider providing instructions on how to test the merge request. This can be
helpful for reviewers not familiar with the product feature or area of the codebase.
+- If you know your change depends on another being merged first, note it in the
+ description and set an [merge request dependency](../user/project/merge_requests/merge_request_dependencies.md).
- Be grateful for the reviewer's suggestions. (`Good call. I'll make that change.`)
- Don't take it personally. The review is of the code, not of you.
- Explain why the code exists. ("It's like that because of these reasons. Would
@@ -345,6 +347,8 @@ experience, refactors the existing code). Then:
- For non-mandatory suggestions, decorate with (non-blocking) so the author knows they can
optionally resolve within the merge request or follow-up at a later stage.
- There's a [Chrome/Firefox add-on](https://gitlab.com/conventionalcomments/conventional-comments-button) which you can use to apply [Conventional Comment](https://conventionalcomments.org/) prefixes.
+- Ensure there are no open dependencies. Check [related issues](../user/project/issues/related_issues.md) for blockers. Clarify with the author(s)
+if necessary. If blocked by one or more open MRs, set an [MR dependency](../user/project/merge_requests/merge_request_dependencies.md).
- After a round of line notes, it can be helpful to post a summary note such as
"Looks good to me", or "Just a couple things to address."
- Assign the merge request to the author if changes are required following your
@@ -390,6 +394,8 @@ When ready to merge:
- **Start a new merge request pipeline with the `Run Pipeline` button in the merge
request's "Pipelines" tab, and enable "Merge When Pipeline Succeeds" (MWPS).** Note that:
+ - If **[master is broken](https://about.gitlab.com/handbook/engineering/workflow/#broken-master),
+ do not merge the merge request**. Follow these specific [handbook instructions](https://about.gitlab.com/handbook/engineering/workflow/#maintaining-throughput-during-broken-master).
- If the **latest [Pipeline for Merged Results](../ci/merge_request_pipelines/pipelines_for_merged_results/#pipelines-for-merged-results)** finished less than 2 hours ago, you
might merge without starting a new pipeline as the merge request is close
enough to `master`.
@@ -397,10 +403,6 @@ When ready to merge:
Before triggering the pipeline, review all changes for **malicious code**.
If you cannot trigger the pipeline, review the status of the fork relative to `master`.
If it's more than 100 commits behind, ask the author to rebase it before merging.
- - If [master is broken](https://about.gitlab.com/handbook/engineering/workflow/#broken-master),
- in addition to the two above rules, check that any failure also happens
- in `master` and post a link to the ~"master:broken" issue before clicking the
- red "Merge" button.
- When you set the MR to "Merge When Pipeline Succeeds", you should take over
subsequent revisions for anything that would be spotted after that.
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index da38d1e73b4..7029c8a8384 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -149,8 +149,8 @@ and `~"group::knowledge"` is picked up by someone in the Access group of the Pla
the issue should be relabeled as `~"group::access"` while keeping the original
`~"devops::create"` unchanged.
-We also use stage and group labels to help quantify our [throughput](https://about.gitlab.com/handbook/engineering/management/throughput/).
-Please read [Stage and Group labels in Throughput](https://about.gitlab.com/handbook/engineering/management/throughput/#stage-and-group-labels-in-throughput) for more information on how the labels are used in this context.
+We also use stage and group labels to help measure our [merge request rates](https://about.gitlab.com/handbook/engineering/merge-request-rate/).
+Please read [Stage and Group labels](https://about.gitlab.com/handbook/engineering/metrics/#stage-and-group-labels) for more information on how the labels are used in this context.
### Category labels
@@ -181,7 +181,7 @@ For instance, the "DevOps Report" category is represented by the
`devops_reports.name` value is "DevOps Reports".
If a category's label doesn't respect this naming convention, it should be specified
-with [the `label` attribute](https://about.gitlab.com/handbook/marketing/website/#category-attributes)
+with [the `label` attribute](https://about.gitlab.com/handbook/marketing/inbound-marketing/digital-experience/website/#category-attributes)
in <https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml>.
### Feature labels
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 166f7b350bf..9051b621bcd 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -68,10 +68,11 @@ request is as follows:
1. Use the syntax `Solves #XXX`, `Closes #XXX`, or `Refs #XXX` to mention the issue(s) your merge
request addresses. Referenced issues do not [close automatically](../../user/project/issues/managing_issues.md#closing-issues-automatically).
You must close them manually once the merge request is merged.
+ 1. The MR must include *Before* and *After* screenshots if UI changes are made.
+ 1. Include any steps or setup required to ensure reviewers can view the changes you've made (e.g. include any information about feature flags).
1. If you're allowed to, set a relevant milestone and [labels](issue_workflow.md).
1. UI changes should use available components from the GitLab Design System,
- [Pajamas](https://design.gitlab.com/). The MR must include *Before* and
- *After* screenshots.
+ [Pajamas](https://design.gitlab.com/).
1. If the MR changes CSS classes, please include the list of affected pages, which
can be found by running `grep css-class ./app -R`.
1. If your MR touches code that executes shell commands, reads or opens files, or
diff --git a/doc/development/contributing/style_guides.md b/doc/development/contributing/style_guides.md
index 2a2cfebe964..444a067a780 100644
--- a/doc/development/contributing/style_guides.md
+++ b/doc/development/contributing/style_guides.md
@@ -56,10 +56,10 @@ The current Lefthook configuration can be found in [`lefthook.yml`](https://gitl
Before you push your changes, Lefthook automatically runs the following checks:
- Danger: Runs a subset of checks that `danger-review` runs on your merge requests.
-- ES lint: Run `yarn eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`.
+- ES lint: Run `yarn run lint:eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`.
- HAML lint: Run `bundle exec haml-lint` checks (with the [`.haml-lint.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.haml-lint.yml) configuration) on the modified `*.html.haml` files. Tags: `view`, `haml`, `style`.
- Markdown lint: Run `yarn markdownlint` checks on the modified `*.md` files. Tags: `documentation`, `style`.
-- SCSS lint: Run `bundle exec scss-lint` checks (with the [`.scss-lint.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.scss-lint.yml) configuration) on the modified `*.scss{,.css}` files. Tags: `stylesheet`, `css`, `style`.
+- SCSS lint: Run `yarn lint:stylelint` checks (with the [`.stylelintrc`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.stylelintrc) configuration) on the modified `*.scss{,.css}` files. Tags: `stylesheet`, `css`, `style`.
- RuboCop: Run `bundle exec rubocop` checks (with the [`.rubocop.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.rubocop.yml) configuration) on the modified `*.rb` files. Tags: `backend`, `style`.
- Vale: Run `vale` checks (with the [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.vale.ini) configuration) on the modified `*.md` files. Tags: `documentation`, `style`.
@@ -146,7 +146,7 @@ One way to generate the initial list is to run the `todo` auto generation,
with `exclude limit` set to a high number.
```shell
-bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit=10000
+bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit=100000
```
You can then move the list from the freshly generated `.rubocop_todo.yml` for the Cop being actively
@@ -154,6 +154,16 @@ resolved and place it in the `.rubocop_manual_todo.yml`. In this scenario, do no
changes to the `.rubocop_todo.yml` as an `exclude limit` that is higher than 15 will make the
`.rubocop_todo.yml` hard to parse.
+### Reveal existing RuboCop exceptions
+
+To reveal existing RuboCop exceptions in the code that have been excluded via `.rubocop_todo.yml` and
+`.rubocop_manual_todo.yml`, set the environment variable `REVEAL_RUBOCOP_TODO` to `1`.
+
+This allows you to reveal existing RuboCop exceptions during your daily work cycle and fix them along the way.
+
+NOTE:
+Permanent `Exclude`s should be defined in `.rubocop.yml` instead of `.rubocop_manual_todo.yml`.
+
## Database migrations
See the dedicated [Database Migrations Style Guide](../migration_style_guide.md).
diff --git a/doc/development/database/client_side_connection_pool.md b/doc/development/database/client_side_connection_pool.md
index 1a30d2d73a3..8316a75ac8d 100644
--- a/doc/development/database/client_side_connection_pool.md
+++ b/doc/development/database/client_side_connection_pool.md
@@ -43,7 +43,7 @@ hardcoded value (10).
At this point, we need to investigate what is using more connections
than we anticipated. To do that, we can use the
`gitlab_ruby_threads_running_threads` metric. For example, [this
-graph](https://thanos-query.ops.gitlab.net/graph?g0.range_input=1h&g0.max_source_resolution=0s&g0.expr=sum%20by%20(thread_name)%20(%20gitlab_ruby_threads_running_threads%7Buses_db_connection%3D%22yes%22%7D%20)&g0.tab=0)
+graph](https://thanos.gitlab.net/graph?g0.range_input=1h&g0.max_source_resolution=0s&g0.expr=sum%20by%20(thread_name)%20(%20gitlab_ruby_threads_running_threads%7Buses_db_connection%3D%22yes%22%7D%20)&g0.tab=0)
shows all running threads that connect to the database by their
name. Threads labeled `puma worker` or `sidekiq_worker_thread` are
the threads that define `Gitlab::Runtime.max_threads` so those are
diff --git a/doc/development/database/index.md b/doc/development/database/index.md
index 367ef455898..870ae1542bd 100644
--- a/doc/development/database/index.md
+++ b/doc/development/database/index.md
@@ -69,3 +69,4 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Miscellaneous
- [Maintenance operations](maintenance_operations.md)
+- [Update multiple database objects](setting_multiple_values.md)
diff --git a/doc/development/database/setting_multiple_values.md b/doc/development/database/setting_multiple_values.md
index 54870380047..0f23aae9f79 100644
--- a/doc/development/database/setting_multiple_values.md
+++ b/doc/development/database/setting_multiple_values.md
@@ -4,24 +4,22 @@ group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Setting Multiple Values
+# Update multiple database objects
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32921) in GitLab 13.5.
-There's often a need to update multiple objects with new values for one
-or more columns. One method of doing this is using `Relation#update_all`:
+You can update multiple database objects with new values for one or more columns.
+One method is to use `Relation#update_all`:
```ruby
user.issues.open.update_all(due_date: 7.days.from_now) # (1)
user.issues.update_all('relative_position = relative_position + 1') # (2)
```
-But what do you do if you cannot express the update as either a static value (1)
-or as a calculation (2)?
-
-Thankfully we can use `UPDATE FROM` to express the need to update multiple rows
-with distinct values in a single query. One can either use a temporary table, or
-a Common Table Expression (CTE), and then use that as the source of the updates:
+If you cannot express the update as either a static value (1) or as a calculation (2),
+use `UPDATE FROM` to express the need to update multiple rows with distinct values
+in a single query. Create a temporary table, or a Common Table Expression (CTE),
+and use it as the source of the updates:
```sql
with updates(obj_id, new_title, new_weight) as (
@@ -34,23 +32,22 @@ update issues
where id = obj_id
```
-The bad news: there is no way to express this in ActiveRecord or even dropping
-down to ARel. The `UpdateManager` does not support `update from`, so this
-is not expressible.
-
-The good news: we supply an abstraction to help you generate these kinds of
-updates, called `Gitlab::Database::BulkUpdate`. This constructs queries such as the
-above, and uses binding parameters to avoid SQL injection.
+You can't express this in ActiveRecord, or by dropping down to [Arel](https://api.rubyonrails.org/v6.1.0/classes/Arel.html),
+because the `UpdateManager` does not support `update from`. However, we supply
+an abstraction to help you generate these kinds of updates: `Gitlab::Database::BulkUpdate`.
+This abstraction constructs queries like the previous example, and uses
+binding parameters to avoid SQL injection.
## Usage
-To use this, we need:
+To use `Gitlab::Database::BulkUpdate`, we need:
-- the list of columns to update
-- a mapping from object/ID to the new values to set for that object
-- a way to determine the table for each object
+- The list of columns to update.
+- A mapping from the object (or ID) to the new values to set for that object.
+- A way to determine the table for each object.
-For example, we can express the query above as:
+For example, we can express the example query in a way that determines the
+table by calling `object.class.table_name`:
```ruby
issue_a = Issue.find(..)
@@ -63,10 +60,7 @@ issue_b = Issue.find(..)
})
```
-Here the table can be determined automatically, from calling
-`object.class.table_name`, so we don't need to provide anything.
-
-We can even pass heterogeneous sets of objects, if the updates all make sense
+You can even pass heterogeneous sets of objects, if the updates all make sense
for them:
```ruby
@@ -82,8 +76,8 @@ merge_request = MergeRequest.find(..)
})
```
-If your objects do not return the correct model class (perhaps because they are
-part of a union), then we need to specify this explicitly in a block:
+If your objects do not return the correct model class, such as if they are part
+of a union, then specify the model class explicitly in a block:
```ruby
bazzes = params
@@ -103,7 +97,10 @@ end
## Caveats
-Note that this is a **very low level** tool, and operates on the raw column
-values. Enumerations and state fields must be translated into their underlying
-representations, for example, and nested associations are not supported. No
-validations or hooks are called.
+This tool is **very low level**, and operates directly on the raw column
+values. You should consider these issues if you implement it:
+
+- Enumerations and state fields must be translated into their underlying
+ representations.
+- Nested associations are not supported.
+- No validations or hooks are called.
diff --git a/doc/development/database_query_comments.md b/doc/development/database_query_comments.md
index 8a5abad3815..39b14074073 100644
--- a/doc/development/database_query_comments.md
+++ b/doc/development/database_query_comments.md
@@ -39,24 +39,11 @@ Examples of queries with comments as observed in `development.log`:
1. Rails:
```sql
- SELECT "project_features".* FROM "project_features" WHERE "project_features"."project_id" = $1 LIMIT $2 [["project_id", 5], ["LIMIT", 1]] /*application:web,controller:jobs,action:trace,correlation_id:rYF4mey9CH3,line:/app/policies/project_policy.rb:504:in `feature_available?'*/
+ /*application:web,controller:jobs,action:trace,correlation_id:rYF4mey9CH3,line:/app/policies/project_policy.rb:504:in `feature_available?'*/ SELECT "project_features".* FROM "project_features" WHERE "project_features"."project_id" = $1 LIMIT $2 [["project_id", 5], ["LIMIT", 1]]
```
1. Sidekiq:
```sql
- SELECT "ci_pipelines".* FROM "ci_pipelines" WHERE "ci_pipelines"."id" = $1 LIMIT $2 [["id", 64], ["LIMIT", 1]] /*application:sidekiq,jid:e7d6668a39a991e323009833,job_class:ExpireJobCacheWorker,correlation_id:rYF4mey9CH3,line:/app/workers/expire_job_cache_worker.rb:14:in `perform'*/
+ /*application:sidekiq,jid:e7d6668a39a991e323009833,job_class:ExpireJobCacheWorker,correlation_id:rYF4mey9CH3,line:/app/workers/expire_job_cache_worker.rb:14:in `perform'*/ SELECT "ci_pipelines".* FROM "ci_pipelines" WHERE "ci_pipelines"."id" = $1 LIMIT $2 [["id", 64], ["LIMIT", 1]]
```
-
-## Enable/Disable the feature
-
-Enabling or disabling the feature requires a **restart/SIGHUP** of the Web and
-Sidekiq workers, as the feature flag's state is memoized upon starting up.
-
-The `feature_flag` for this feature is **disabled** by default. You can enable
-or disable it with:
-
-```ruby
-Feature.enable(:marginalia)
-Feature.disable(:marginalia)
-```
diff --git a/doc/development/directory_structure.md b/doc/development/directory_structure.md
index c2329feb941..c96e2cc3254 100644
--- a/doc/development/directory_structure.md
+++ b/doc/development/directory_structure.md
@@ -34,3 +34,61 @@ module MyDomain
end
end
```
+
+### About namespace naming
+
+A good guideline for naming a top-level namespace (bounded context) is to use the related
+feature category. For example, `Continuous Integration` feature category maps to `Ci::` namespace.
+
+Alternatively a new class could be added to `Projects::` or `Groups::` if it's either:
+
+- Strictly related to one of these domains. For example `Projects::Alias`.
+- A new component that does not have yet a more specific domain. In this case, when
+ a more explicit domain does emerge we would need to move the class to a more specific
+ namespace.
+
+Do not use the [stage or group name](https://about.gitlab.com/handbook/product/categories/#devops-stages)
+since a feature category could be reassigned to a different group in the future.
+
+```ruby
+# bad
+module Create
+ class Commit
+ end
+end
+
+# good
+module Repositories
+ class Commit
+ end
+end
+```
+
+On the other hand, a feature category may sometimes be too granular. Features tend to be
+treated differently according to Product and Marketing, while they may share a lot of
+domain models and behavior under the hood. In this case, having too many bounded contexts
+could make them shallow and more coupled with other contexts.
+
+Bounded contexts (or top-level namespaces) can be seen as macro-components in the overall app.
+Good bounded contexts should be [deep](https://medium.com/@nakabonne/depth-of-module-f62dac3c2fdb)
+so consider having nested namespaces to further break down complex parts of the domain.
+E.g. `Ci::Config::`.
+
+For example, instead of having separate and granular bounded contexts like: `ContainerScanning::`,
+`ContainerHostSecurity::`, `ContainerNetworkSecurity::`, we could have:
+
+```ruby
+module ContainerSecurity
+ module HostSecurity
+ end
+
+ module NetworkSecurity
+ end
+
+ module Scanning
+ end
+end
+```
+
+If classes that are defined into a namespace have a lot in common with classes in other namespaces,
+chances are that these two namespaces are part of the same bounded context.
diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md
index eb20e721e46..17967c5f63c 100644
--- a/doc/development/distributed_tracing.md
+++ b/doc/development/distributed_tracing.md
@@ -206,7 +206,7 @@ If `GITLAB_TRACING` is not configured correctly, this issue is logged:
By default, GitLab ships with the Jaeger tracer, but other tracers can be included at compile time.
Details of how this can be done are included in the [LabKit tracing
-documentation](https://godoc.org/gitlab.com/gitlab-org/labkit/tracing).
+documentation](https://pkg.go.dev/gitlab.com/gitlab-org/labkit/tracing).
If no log messages about tracing are emitted, the `GITLAB_TRACING` environment variable is likely
not set.
diff --git a/doc/development/documentation/feature_flags.md b/doc/development/documentation/feature_flags.md
index c9c291abd2c..8fe3f0cbf8e 100644
--- a/doc/development/documentation/feature_flags.md
+++ b/doc/development/documentation/feature_flags.md
@@ -14,9 +14,13 @@ feature flag depends on its state (enabled or disabled). When the state
changes, the developer who made the change **must update the documentation**
accordingly.
+Every feature introduced to the codebase, even if it's behind a feature flag,
+must be documented. For context, see the
+[latest merge request that updated this guideline](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47917#note_459984428).
+
## Criteria
-According to the process of [deploying GitLab features behind feature flags](../feature_flags/process.md):
+According to the process of [deploying GitLab features behind feature flags](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle):
> - _By default, feature flags should be off._
> - _Feature flags should remain in the codebase for a short period as possible to reduce the need for feature flag accounting._
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index 92fd17f9d3e..70fa80b3306 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -118,7 +118,7 @@ If you change the Dockerfile configuration and rebuild the images, you can break
pipeline in the main `gitlab` repository as well as in `gitlab-docs`. Create an image with
a different name first and test it to ensure you do not break the pipelines.
-1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI / CD > Pipelines**.
+1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI/CD > Pipelines**.
1. Click the **Run Pipeline** button.
1. See that a new pipeline is running. The jobs that build the images are in the first
stage, `build-images`. You can click the pipeline number to see the larger pipeline
@@ -137,7 +137,7 @@ and deploys it to <https://docs.gitlab.com>.
If you need to build and deploy the site immediately (must have maintainer level permissions):
-1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI / CD > Schedules**.
+1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI/CD > Schedules**.
1. For the `Build docs.gitlab.com every 4 hours` scheduled pipeline, click the **play** (**{play}**) button.
Read more about the [deployment process](deployment_process.md).
diff --git a/doc/development/documentation/site_architecture/release_process.md b/doc/development/documentation/site_architecture/release_process.md
index ba5363dbb71..7bdf3fbdcf8 100644
--- a/doc/development/documentation/site_architecture/release_process.md
+++ b/doc/development/documentation/site_architecture/release_process.md
@@ -4,191 +4,165 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Docs monthly release process
+# Monthly release process
-When a new GitLab version is released on the 22nd, we need to create the respective
-single Docker image, and update some files so that the dropdown works correctly.
+When a new GitLab version is released on the 22nd, we need to release the published documentation
+for the new version.
-## 1. Add the chart version
+This should be done as soon as possible after the GitLab version is announced, so that:
-Since the charts use a different version number than all the other GitLab
-products, we need to add a
-[version mapping](https://docs.gitlab.com/charts/installation/version_mappings.html):
+- The published documentation includes the three most recent minor releases of the current major
+ version, and the most recent minor releases of the last two major versions. For example 13.9,
+ 13.8, 13.7, 12.10, and 11.11.
+- Documentation updates after the 22nd are for the next release. The versions drop down
+ should have the current milestone with `-pre` appended to it, for example `13.10-pre`.
-The charts stable branch is not created automatically like the other products.
-There's an [issue to track this](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/1442).
-It is usually created on the 21st or the 22nd.
+Each documentation release:
-To add a new charts version:
+- Has a dedicated branch, named in the format `XX.yy`.
+- Has a Docker image that contains a build of that branch.
+
+For example:
+
+- For [GitLab 13.9](https://docs.gitlab.com/13.9/index.html), the
+ [stable branch](https://gitlab.com/gitlab-org/gitlab-docs/-/tree/13.9) and Docker image:
+ [`registry.gitlab.com/gitlab-org/gitlab-docs:13.9`](https://gitlab.com/gitlab-org/gitlab-docs/container_registry/631635).
+- For [GitLab 13.8](https://docs.gitlab.com/13.8/index.html), the
+ [stable branch](https://gitlab.com/gitlab-org/gitlab-docs/-/tree/13.8) and Docker image:
+ [`registry.gitlab.com/gitlab-org/gitlab-docs:13.8`](https://gitlab.com/gitlab-org/gitlab-docs/container_registry/631635).
+
+To set up a documentation release, follow these steps:
+
+1. [Add the charts version](#add-chart-version), so that the documentation is built using the
+ [version of the charts project that maps to](https://docs.gitlab.com/charts/installation/version_mappings.html)
+ the GitLab release. This step may have been completed already.
+1. [Create a stable branch and Docker image](#create-stable-branch-and-docker-image-for-release) for
+ the new version.
+1. [Create a release merge request](#create-release-merge-request) for the new version, which
+ updates the version dropdown menu for the current documentation and adds the release to the
+ Docker configuration. For example, the
+ [release merge request for 13.9](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1555).
+1. [Update the three online versions](#update-dropdown-for-online-versions), so that they display the new release on their
+ version dropdown menus. For example:
+ - The merge request to [update the 13.9 version dropdown menu for the 13.9 release](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1556).
+ - The merge request to [update the 13.8 version dropdown menu for the 13.9 release](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1557).
+ - The merge request to [update the 13.7 version dropdown menu for the 13.9 release](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1558).
+1. [Merge the release merge request and run the necessary Docker image builds](#merge-release-merge-request-and-run-docker-image-builds).
+
+## Add chart version
+
+To add a new charts version for the release:
1. Make sure you're in the root path of the `gitlab-docs` repository.
1. Open `content/_data/chart_versions.yaml` and add the new stable branch version using the
- version mapping. Note that only the `major.minor` version is needed.
+ [version mapping](https://docs.gitlab.com/charts/installation/version_mappings.html). Only the
+ `major.minor` version is needed.
1. Create a new merge request and merge it.
NOTE:
-It can be handy to create the future mappings since they are pretty much known.
-In that case, when a new GitLab version is released, you don't have to repeat
-this first step.
+If you have time, add anticipated future mappings to `content/_data/chart_versions.yaml`. This saves
+a step for the next GitLab release.
-## 2. Create an image for a single version
+## Create stable branch and Docker image for release
-The single docs version must be created before the release merge request, but
-this needs to happen when the stable branches for all products have been created.
+To create a stable branch and Docker image for the release:
1. Make sure you're in the root path of the `gitlab-docs` repository.
-1. Run the Rake task to create the single version:
+1. Run the Rake task to create the single version. For example, to create the 13.9 release branch
+ and perform others tasks:
```shell
- ./bin/rake "release:single[12.0]"
+ ./bin/rake "release:single[13.9]"
```
- A new `Dockerfile.12.0` should have been created and `.gitlab-ci.yml` should
- have the branches variables updated into a new branch. They are automatically
- committed.
+ A branch for the release is created, a new `Dockerfile.13.9` is created, and `.gitlab-ci.yml`
+ has branches variables updated into a new branch. These files are automatically committed.
+
+1. Push the newly created branch, but **don't create a merge request**. After you push, the
+ `image:docs-single` job creates a new Docker image tagged with the name of the branch you created
+ earlier. You can see the Docker image in the `registry` environment at
+ <https://gitlab.com/gitlab-org/gitlab-docs/-/environments/folders/registry>.
-1. Push the newly created branch, but **don't create a merge request**.
- After you push, the `image:docs-single` job creates a new Docker image
- tagged with the branch name you created in the first step. In the end, the
- image is uploaded in the [Container Registry](https://gitlab.com/gitlab-org/gitlab-docs/container_registry)
- and it is listed under the `registry` environment folder at
- `https://gitlab.com/gitlab-org/gitlab-docs/-/environments/folders/registry` (must
- have developer access).
+For example, see [the 13.9 release pipeline](https://gitlab.com/gitlab-org/gitlab-docs/-/pipelines/260288747).
-Optionally, you can test locally by building the image and running it:
+Optionally, you can test locally by:
-```shell
-docker build -t docs:12.0 -f Dockerfile.12.0 .
-docker run -it --rm -p 4000:4000 docs:12.0
-```
+1. Building the image and running it. For example, for GitLab 13.9 documentation:
-Visit `http://localhost:4000/12.0/` to see if everything works correctly.
+ ```shell
+ docker build -t docs:13.9 -f Dockerfile.13.9 .
+ docker run -it --rm -p 4000:4000 docs:13.9
+ ```
-## 3. Create the release merge request
+1. Visiting <http://localhost:4000/13.9/> to see if everything works correctly.
+
+## Create release merge request
NOTE:
-To be [automated](https://gitlab.com/gitlab-org/gitlab-docs/-/issues/750).
+An [epic is open](https://gitlab.com/groups/gitlab-org/-/epics/4361) to automate this step.
-Now it's time to create the monthly release merge request that adds the new
-version and rotates the old one:
+To create the release merge request for the release:
1. Make sure you're in the root path of the `gitlab-docs` repository.
-1. Create a branch `release-X-Y`:
+1. Create a branch `release-X-Y`. For example:
```shell
git checkout master
- git checkout -b release-12-0
+ git checkout -b release-13-9
```
-1. **Rotate the online and offline versions:**
-
- At any given time, there are 4 browsable online versions: one pulled from
- the upstream master branches (docs for GitLab.com) and the three latest
- stable versions.
+1. Edit `content/_data/versions.yaml` and update the lists of versions to reflect the new release:
- Edit `content/_data/versions.yaml` and rotate the versions to reflect the
- new changes:
+ - Add the latest version to the `online:` section.
+ - Move the oldest version in `online:` to the `offline:` section. There should now be three
+ versions in `online:`.
- - `online`: The 3 latest stable versions.
- - `offline`: All the previous versions offered as an offline archive.
+1. Update these Dockerfiles:
-1. **Update the `:latest` and `:archives` Docker images:**
+ - `dockerfiles/Dockerfile.archives`: Add the latest version to the top of the list.
+ - `Dockerfile.master`: Remove the oldest version, and add the newest version to the
+ top of the list.
- The following two Dockerfiles need to be updated:
-
- 1. `dockerfiles/Dockerfile.archives` - Add the latest version at the top of
- the list.
- 1. `Dockerfile.master` - Rotate the versions (oldest gets removed and latest
- is added at the top of the list).
-
-1. In the end, there should be four files in total that have changed.
- Commit and push to create the merge request using the "Release" template:
+1. Commit and push to create the merge request. For example:
```shell
git add content/ Dockerfile.master dockerfiles/Dockerfile.archives
- git commit -m "Release 12.0"
- git push origin release-12-0
+ git commit -m "Release 13.9"
+ git push origin release-13-9
```
-## 4. Update the dropdown for all online versions
-
-The versions dropdown is in a way "hardcoded". When the site is built, it looks
-at the contents of `content/_data/versions.yaml` and based on that, the dropdown
-is populated. Older branches have different content, which means the
-dropdown list is one or more releases behind. Remember that the new changes of
-the dropdown are included in the unmerged `release-X-Y` branch.
+Do not merge the release merge request yet.
-The content of `content/_data/versions.yaml` needs to change for all online
-versions (stable branches `X.Y` of the `gitlab-docs` project):
+## Update dropdown for online versions
-1. Run the Rake task that creates all the respective merge requests needed to
- update the dropdowns. Set these to automatically be merged when their
- pipelines succeed:
+To update`content/_data/versions.yaml` for all online versions (stable branches `X.Y` of the
+`gitlab-docs` project):
- NOTE:
- The `release-X-Y` branch needs to be present locally,
- and you need to have switched to it, otherwise the Rake task fails.
+1. Run the Rake task that creates all of the necessary merge requests to update the dropdowns. For
+ example, for the 13.9 release:
```shell
- git checkout release-X-Y
+ git checkout release-13-9
./bin/rake release:dropdowns
```
-1. [Visit the merge requests page](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests?label_name%5B%5D=release)
- to check that their pipelines pass, and once all are merged, proceed to the
- following and final step.
+ These merge requests are set to automatically merge.
-NOTE:
-In case a pipeline fails, see [troubleshooting](#troubleshooting).
+1. [Visit the merge requests page](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests?label_name%5B%5D=release)
+ to check that their pipelines pass. After all MRs are merged, proceed to the following and final
+ step.
-## 5. Merge the release merge request
+## Merge release merge request and run Docker image builds
-The dropdown merge requests should have now been merged into their respective
-version (stable `X.Y` branch), which triggers another pipeline. At this point,
-you need to only babysit the pipelines and make sure they don't fail:
+The merge requests for the dropdowns should now all be merged into their respective stable branches.
+Each merge triggers a new pipeline for each stable branch. Wait for the stable branch pipelines to
+complete, then:
1. Check the [pipelines page](https://gitlab.com/gitlab-org/gitlab-docs/pipelines)
and make sure all stable branches have green pipelines.
-1. After all the pipelines of the online versions succeed, merge the release merge request.
+1. After all the pipelines succeed, merge the [release merge request](#create-release-merge-request).
1. Finally, run the
[`Build docker images weekly` pipeline](https://gitlab.com/gitlab-org/gitlab-docs/pipeline_schedules)
that builds the `:latest` and `:archives` Docker images.
-Once the scheduled pipeline succeeds, the docs site is deployed with all
-new versions online.
-
-## Troubleshooting
-
-Releasing a new version is a long process that involves many moving parts.
-
-### `test_internal_links_and_anchors` failing on dropdown merge requests
-
-WARNING:
-We now pin versions in the `.gitlab-ci.yml` of the respective branch,
-so the steps below are deprecated.
-
-When [updating the dropdown for the stable versions](#4-update-the-dropdown-for-all-online-versions),
-there may be cases where some links might fail. The process of how the
-dropdown MRs are created have a caveat, and that is that the tests run by
-pulling the master branches of all products, instead of the respective stable
-ones.
-
-In a real world scenario, the [Update 12.2 dropdown to match that of 12.4](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/604)
-merge request failed because of the [`test_internal_links_and_anchors` test](https://gitlab.com/gitlab-org/gitlab-docs/-/jobs/328042431).
-
-This happened because there has been a rename of a product (`gitlab-monitor` to `gitlab-exporter`)
-and the old name was still referenced in the 12.2 docs. If the respective stable
-branches for 12.2 were used, this wouldn't have failed, but as we can see from
-the [`compile_dev` job](https://gitlab.com/gitlab-org/gitlab-docs/-/jobs/328042427),
-the `master` branches were pulled.
-
-To fix this, re-run the pipeline (`https://gitlab.com/gitlab-org/gitlab-docs/pipelines/new`)
-for the `update-12-2-for-release-12-4` branch, by including the following environment variables:
-
-- `BRANCH_CE` set to `12-2-stable`
-- `BRANCH_EE` set to `12-2-stable-ee`
-- `BRANCH_OMNIBUS` set to `12-2-stable`
-- `BRANCH_RUNNER` set to `12-2-stable`
-- `BRANCH_CHARTS` set to `2-2-stable`
-
-This should make the MR pass.
+As the last step in the scheduled pipeline, the documentation site deploys with all new versions.
diff --git a/doc/development/documentation/styleguide.md b/doc/development/documentation/styleguide.md
deleted file mode 100644
index ade0b89a92c..00000000000
--- a/doc/development/documentation/styleguide.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'styleguide/index.md'
----
-
-This document was moved to [another location](styleguide/index.md).
-
-<!-- This redirect file can be deleted after <2022-02-13>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 7737aa58506..4831e5bbce5 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -108,7 +108,7 @@ of GitLab more efficient.
New information that would be useful toward the future usage or troubleshooting
of GitLab should not be written directly in a forum or other messaging system,
-but added to a documentation MR and then referenced, as described above.
+but added to a documentation MR and then referenced, as described above.
The more we reflexively add information to the documentation, the more
the documentation helps others efficiently accomplish tasks and solve problems.
@@ -601,6 +601,7 @@ Follow these guidelines for punctuation:
| Rule | Example |
|------------------------------------------------------------------|--------------------------------------------------------|
+| Avoid semicolons. Use two sentences instead. | _That's the way that the world goes 'round. You're up one day and the next you're down._
| Always end full sentences with a period. | _For a complete overview, read through this document._ |
| Always add a space after a period when beginning a new sentence. | _For a complete overview, check this doc. For other references, check out this guide._ |
| Do not use double spaces. (Tested in [`SentenceSpacing.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/SentenceSpacing.yml).) | --- |
@@ -1606,34 +1607,32 @@ displayed for the page or feature.
#### Version text in the **Version History**
-If all content in a section is related, add version text after the header
-for the section. The version information must be surrounded by blank lines, and
-each entry should be on its own line.
+If all content in a section is related, add version text after the header for
+the section. The version information must:
-Add the version history information as a blockquote:
+- Be surrounded by blank lines.
+- Start with `>`. If there are multiple bullets, each line must start with `> -`.
+- The string must include these words in this order (capitalization doesn't matter):
+ - `introduced`, `deprecated`, `moved`
+ - `in` or `to`
+ - `GitLab`
+- Whenever possible, include a link to the completed issue, merge request, or epic
+ that introduced the feature. An issue is preferred over a merge request, and
+ a merge request is preferred over an epic.
```markdown
## Feature name
-> Introduced in GitLab 11.3.
+> [Introduced](<link-to-issue>) in GitLab 11.3.
This feature does something.
-```
-Whenever possible, version text should have a link to the completed issue, merge
-request, or epic that introduced the feature. An issue is preferred over a merge
-request, and a merge request is preferred over an epic. For example:
+## Feature name 2
-```markdown
-> [Introduced](<link-to-issue>) in GitLab 11.3.
-```
-
-If you're adding information about new features or changes in a release, update
-the blockquote to use a bulleted list:
-
-```markdown
> - [Introduced](<link-to-issue>) in GitLab 11.3.
-> - Enabled by default in GitLab 11.4.
+> - [Enabled by default](<link-to-issue>) in GitLab 11.4.
+
+This feature does something else.
```
If a feature is moved to another tier:
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index f3d6e0a5c71..eed544911cb 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -272,7 +272,11 @@ To configure Vale in your editor, install one of the following as appropriate:
In the extension's settings:
- Select the **Use CLI** checkbox.
- - In the **Config** setting, enter an absolute path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini) in one of the cloned GitLab repositories on your computer.
+ - In the <!-- vale gitlab.Spelling = NO --> **Config** setting, enter an absolute
+ path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini)
+ in one of the cloned GitLab repositories on your computer.
+ <!-- vale gitlab.Spelling = YES -->
+
- In the **Path** setting, enter the absolute path to the Vale binary. In most
cases, `vale` should work. To find the location, run `which vale` in a terminal.
diff --git a/doc/development/elasticsearch.md b/doc/development/elasticsearch.md
index 3392bd1fbf6..3f14ca454fe 100644
--- a/doc/development/elasticsearch.md
+++ b/doc/development/elasticsearch.md
@@ -184,7 +184,7 @@ If the current version is `v12p1`, and we need to create a new version for `v12p
1. Change the namespace for files under `v12p1` folder from `Latest` to `V12p1`
1. Make changes to files under the `latest` folder as needed
-## Creating a new Global Search migration
+## Creating a new Advanced Search migration
> This functionality was introduced by [#234046](https://gitlab.com/gitlab-org/gitlab/-/issues/234046).
@@ -219,7 +219,9 @@ Any update to the Elastic index mappings should be replicated in [`Elastic::Late
Migrations can be built with a retry limit and have the ability to be [failed and marked as halted](https://gitlab.com/gitlab-org/gitlab/-/blob/66e899b6637372a4faf61cfd2f254cbdd2fb9f6d/ee/lib/elastic/migration.rb#L40).
Any data or index cleanup needed to support migration retries should be handled within the migration.
-### Migration options supported by the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
+### Migration options supported by the `Elastic::MigrationWorker`
+
+[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb) supports the following migration options:
- `batched!` - Allow the migration to run in batches. If set, the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
will re-enqueue itself with a delay which is set using the `throttle_delay` option described below. The batching
@@ -230,6 +232,9 @@ enough time to finish. Additionally, the time should be less than 30 minutes sin
[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
cron worker runs. Default value is 5 minutes.
+- `pause_indexing!` - Pause indexing while the migration runs. This setting will record the indexing setting before
+the migration runs and set it back to that value when the migration is completed.
+
```ruby
# frozen_string_literal: true
@@ -242,6 +247,102 @@ class BatchedMigrationName < Elastic::Migration
end
```
+### Multi-version compatibility
+
+These Advanced Search migrations, like any other GitLab changes, need to support the case where
+[multiple versions of the application are running at the same time](multi_version_compatibility.md).
+
+Depending on the order of deployment, it's possible that the migration
+has started or finished and there's still a server running the application code from before the
+migration. We need to take this into consideration until we can [ensure all Advanced Search migrations
+start after the deployment has finished](https://gitlab.com/gitlab-org/gitlab/-/issues/321619).
+
+### Reverting a migration
+
+Because Elasticsearch does not support transactions, we always need to design our
+migrations to accommodate a situation where the application
+code is reverted after the migration has started or after it is finished.
+
+For this reason we generally defer destructive actions (for example, deletions after
+some data is moved) to a later merge request after the migrations have
+completed successfully. To be safe, for self-managed customers we should also
+defer it to another release if there is risk of important data loss.
+
+### Best practices for Advanced Search migrations
+
+Follow these best practices for best results:
+
+- When working in batches, keep the batch size under 9,000 documents
+ and `throttle_delay` over 3 minutes. The bulk indexer is set to run
+ every 1 minute and process a batch of 10,000 documents. These limits
+ allow the bulk indexer time to process records before another migration
+ batch is attempted.
+- To ensure that document counts are up to date, it is recommended to refresh
+ the index before checking if a migration is completed.
+- Add logging statements to each migration when the migration starts, when a
+ completion check occurs, and when the migration is completed. These logs
+ are helpful when debugging issues with migrations.
+- Pause indexing if you're using any Elasticsearch Reindex API operations.
+- Consider adding a retry limit if there is potential for the migration to fail.
+ This ensures that migrations can be halted if an issue occurs.
+
+## Deleting Advanced Search migrations in a major version upgrade
+
+Since our Advanced Search migrations usually require us to support multiple
+code paths for a long period of time, it's important to clean those up when we
+safely can.
+
+We choose to use GitLab major version upgrades as a safe time to remove
+backwards compatibility for indices that have not been fully migrated. We
+[document this in our upgrade
+documentation](../update/index.md#upgrading-to-a-new-major-version). We also
+choose to remove the migration code and tests so that:
+
+- We don't need to maintain any code that is called from our Advanced Search
+ migrations.
+- We don't waste CI time running tests for migrations that we don't support
+ anymore.
+
+To be extra safe, we will not delete migrations that were created in the last
+minor version before the major upgrade. So, if the we are upgrading to `%14.0`,
+we should not delete migrations that were only added in `%13.11`. This is an
+extra safety net as we expect there are migrations that get merged that may
+take multiple weeks to finish on GitLab.com. It would be bad if we upgraded
+GitLab.com to `%14.0` before the migrations in `%13.11` were finished. Since
+our deployments to GitLab.com are automated and we currently don't have
+automated checks to prevent this, the extra precaution is warranted.
+Additionally, even if we did have automated checks to prevent it, we wouldn't
+actually want to hold up GitLab.com deployments on Advanced Search migrations,
+as they may still have another week to go, and that's too long to block
+deployments.
+
+### Process for removing migrations
+
+For every migration that was created 2 minor versions before the major version
+being upgraded to, we do the following:
+
+1. Confirm the migration has actually completed successfully for GitLab.com.
+1. Replace the content of `migrate` and `completed?` methods as follows:
+
+ ```ruby
+ def migrate
+ log_raise "Migration has been deleted in the last major version upgrade." \
+ "Migrations are supposed to be finished before upgrading major version https://docs.gitlab.com/ee/update/#upgrading-to-a-new-major-version ." \
+ "In order to correct this issue you will need to reacreate your index from scratch https://docs.gitlab.com/ee/integration/elasticsearch.html#last-resort-to-recreate-an-index ."
+ end
+
+ def completed?
+ false
+ end
+ ```
+
+1. Delete any spec files to support this migration.
+1. Remove any logic handling backwards compatibility for this migration. You
+ can find this by looking for
+ `Elastic::DataMigrationService.migration_has_finished?(:migration_name_in_lowercase)`.
+1. Create a merge request with these changes. Noting that we should not
+ accidentally merge this before the major release is started.
+
## Performance Monitoring
### Prometheus
diff --git a/doc/development/emails.md b/doc/development/emails.md
index 0b1f3c5b74c..1de1da33dc2 100644
--- a/doc/development/emails.md
+++ b/doc/development/emails.md
@@ -4,7 +4,7 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Dealing with email in development
+# Working with email in development
## Ensuring compatibility with mailer Sidekiq jobs
@@ -54,7 +54,8 @@ See the [Rails guides](https://guides.rubyonrails.org/action_mailer_basics.html#
incoming_email:
enabled: true
- # The email address including the `%{key}` placeholder that will be replaced to reference the item being replied to.
+ # The email address including the %{key} placeholder that will be replaced to reference the item being replied to. This %{key} should be included in its entirety within the email address and not replaced by another value.
+ # For example: emailadress+%key@gmail.com.
# The placeholder can be omitted but if present, it must appear in the "user" part of the address (before the `@`).
address: "gitlab-incoming+%{key}@gmail.com"
diff --git a/doc/development/experiment_guide/experimentation.md b/doc/development/experiment_guide/experimentation.md
new file mode 100644
index 00000000000..7135f8acd9b
--- /dev/null
+++ b/doc/development/experiment_guide/experimentation.md
@@ -0,0 +1,399 @@
+---
+stage: Growth
+group: Activation
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Create an A/B test with `Experimentation Module`
+
+## Implement the experiment
+
+1. Add the experiment to the `Gitlab::Experimentation::EXPERIMENTS` hash in
+ [`experimentation.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib%2Fgitlab%2Fexperimentation.rb):
+
+ ```ruby
+ EXPERIMENTS = {
+ other_experiment: {
+ #...
+ },
+ # Add your experiment here:
+ signup_flow: {
+ tracking_category: 'Growth::Activation::Experiment::SignUpFlow' # Used for providing the category when setting up tracking data
+ }
+ }.freeze
+ ```
+
+1. Use the experiment in the code.
+
+ Experiments can be performed on a `subject`. The provided `subject` should
+ respond to `to_global_id` or `to_s`.
+ The resulting string is bucketed and assigned to either the control or the
+ experimental group, so you must always provide the same `subject`
+ for an experiment to have the same experience.
+
+ 1. Use this standard for the experiment in a controller:
+
+ - Experiment run for a user:
+
+ ```ruby
+ class ProjectController < ApplicationController
+ def show
+ # experiment_enabled?(:experiment_key) is also available in views and helpers
+ if experiment_enabled?(:signup_flow, subject: current_user)
+ # render the experiment
+ else
+ # render the original version
+ end
+ end
+ end
+ ```
+
+ - Experiment run for a namespace:
+
+ ```ruby
+ if experiment_enabled?(:signup_flow, subject: namespace)
+ # experiment code
+ else
+ # control code
+ end
+ ```
+
+ When no subject is given, it falls back to a cookie that gets set and is consistent until
+ the cookie gets deleted.
+
+ ```ruby
+ class RegistrationController < ApplicationController
+ def show
+ # falls back to a cookie
+ if experiment_enabled?(:signup_flow)
+ # render the experiment
+ else
+ # render the original version
+ end
+ end
+ end
+ ```
+
+ 1. Make the experiment available to the frontend in a controller. This example
+ checks whether the experiment is enabled and pushes the result to the frontend:
+
+ ```ruby
+ before_action do
+ push_frontend_experiment(:signup_flow, subject: current_user)
+ end
+ ```
+
+ You can check the state of the feature flag in JavaScript:
+
+ ```javascript
+ import { isExperimentEnabled } from '~/experimentation';
+
+ if ( isExperimentEnabled('signupFlow') ) {
+ // ...
+ }
+ ```
+
+You can also run an experiment outside of the controller scope, such as in a worker:
+
+```ruby
+class SomeWorker
+ def perform
+ # Check if the experiment is active at all (the percentage_of_time_value > 0)
+ return unless Gitlab::Experimentation.active?(:experiment_key)
+
+ # Since we cannot access cookies in a worker, we need to bucket models
+ # based on a unique, unchanging attribute instead.
+ # It is therefore necessery to always provide the same subject.
+ if Gitlab::Experimentation.in_experiment_group?(:experiment_key, subject: user)
+ # execute experimental code
+ else
+ # execute control code
+ end
+ end
+end
+```
+
+## Implement tracking events
+
+To determine whether the experiment is a success or not, we must implement tracking events
+to acquire data for analyzing. We can send events to Snowplow via either the backend or frontend.
+Read the [product intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/) for more details.
+
+### Track backend events
+
+The framework provides a helper method that is available in controllers:
+
+```ruby
+before_action do
+ track_experiment_event(:signup_flow, 'action', 'value', subject: current_user)
+end
+```
+
+To test it:
+
+```ruby
+context 'when the experiment is active and the user is in the experimental group' do
+ before do
+ stub_experiment(signup_flow: true)
+ stub_experiment_for_subject(signup_flow: true)
+ end
+
+ it 'tracks an event', :snowplow do
+ subject
+
+ expect_snowplow_event(
+ category: 'Growth::Activation::Experiment::SignUpFlow',
+ action: 'action',
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ )
+ end
+end
+```
+
+### Track frontend events
+
+The framework provides a helper method that is available in controllers:
+
+```ruby
+before_action do
+ push_frontend_experiment(:signup_flow, subject: current_user)
+ frontend_experimentation_tracking_data(:signup_flow, 'action', 'value', subject: current_user)
+end
+```
+
+This pushes tracking data to `gon.experiments` and `gon.tracking_data`.
+
+```ruby
+expect(Gon.experiments['signupFlow']).to eq(true)
+
+expect(Gon.tracking_data).to eq(
+ {
+ category: 'Growth::Activation::Experiment::SignUpFlow',
+ action: 'action',
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ }
+)
+```
+
+To track it:
+
+```javascript
+import { isExperimentEnabled } from '~/lib/utils/experimentation';
+import Tracking from '~/tracking';
+
+document.addEventListener('DOMContentLoaded', () => {
+ const signupFlowExperimentEnabled = isExperimentEnabled('signupFlow');
+
+ if (signupFlowExperimentEnabled && gon.tracking_data) {
+ const { category, action, ...data } = gon.tracking_data;
+
+ Tracking.event(category, action, data);
+ }
+}
+```
+
+To test it in Jest:
+
+```javascript
+import { withGonExperiment } from 'helpers/experimentation_helper';
+import Tracking from '~/tracking';
+
+describe('event tracking', () => {
+ describe('with tracking data', () => {
+ withGonExperiment('signupFlow');
+
+ beforeEach(() => {
+ jest.spyOn(Tracking, 'event').mockImplementation(() => {});
+
+ gon.tracking_data = {
+ category: 'Growth::Activation::Experiment::SignUpFlow',
+ action: 'action',
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ };
+ });
+
+ it('should track data', () => {
+ performAction()
+
+ expect(Tracking.event).toHaveBeenCalledWith(
+ 'Growth::Activation::Experiment::SignUpFlow',
+ 'action',
+ {
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ },
+ );
+ });
+ });
+});
+```
+
+## Record experiment user
+
+In addition to the anonymous tracking of events, we can also record which users
+have participated in which experiments, and whether they were given the control
+experience or the experimental experience.
+
+The `record_experiment_user` helper method is available to all controllers, and it
+enables you to record these experiment participants (the current user) and which
+experience they were given:
+
+```ruby
+before_action do
+ record_experiment_user(:signup_flow)
+end
+```
+
+Subsequent calls to this method for the same experiment and the same user have no
+effect unless the user is then enrolled into a different experience. This happens
+when we roll out the experimental experience to a greater percentage of users.
+
+This data is completely separate from the [events tracking data](#implement-tracking-events).
+They are not linked together in any way.
+
+### Add context
+
+You can add arbitrary context data in a hash which gets stored as part of the experiment
+user record. New calls to the `record_experiment_user` with newer contexts are merged
+deeply into the existing context.
+
+This data can then be used by data analytics dashboards.
+
+```ruby
+before_action do
+ record_experiment_user(:signup_flow, foo: 42, bar: { a: 22})
+ # context is { "foo" => 42, "bar" => { "a" => 22 }}
+end
+
+# Additional contexts for newer record calls are merged deeply
+record_experiment_user(:signup_flow, foo: 40, bar: { b: 2 }, thor: 3)
+# context becomes { "foo" => 40, "bar" => { "a" => 22, "b" => 2 }, "thor" => 3}
+```
+
+## Record experiment conversion event
+
+Along with the tracking of backend and frontend events and the
+[recording of experiment participants](#record-experiment-user), we can also record
+when a user performs the desired conversion event action. For example:
+
+- **Experimental experience:** Show an in-product nudge to test if the change causes more
+ people to sign up for trials.
+- **Conversion event:** The user starts a trial.
+
+The `record_experiment_conversion_event` helper method is available to all controllers.
+Use it to record the conversion event for the current user, regardless of whether
+the user is in the control or experimental group:
+
+```ruby
+before_action do
+ record_experiment_conversion_event(:signup_flow)
+end
+```
+
+Note that the use of this method requires that we have first
+[recorded the user](#record-experiment-user) as being part of the experiment.
+
+## Enable the experiment
+
+After all merge requests have been merged, use [ChatOps](../../ci/chatops/index.md) in the
+[appropriate channel](../feature_flags/controls.md#communicate-the-change) to start the experiment for 10% of the users.
+The feature flag should have the name of the experiment with the `_experiment_percentage` suffix appended.
+For visibility, share any commands run against production in the `#s_growth` channel:
+
+ ```shell
+ /chatops run feature set signup_flow_experiment_percentage 10
+ ```
+
+ If you notice issues with the experiment, you can disable the experiment by removing the feature flag:
+
+ ```shell
+ /chatops run feature delete signup_flow_experiment_percentage
+ ```
+
+## Add user to experiment group manually
+
+To force the application to add your current user into the experiment group,
+add a query string parameter to the path where the experiment runs. If you add the
+query string parameter, the experiment works only for this request, and doesn't work
+after following links or submitting forms.
+
+For example, to forcibly enable the `EXPERIMENT_KEY` experiment, add `force_experiment=EXPERIMENT_KEY`
+to the URL:
+
+```shell
+https://gitlab.com/<EXPERIMENT_ENTRY_URL>?force_experiment=<EXPERIMENT_KEY>
+```
+
+## Add user to experiment group with a cookie
+
+You can force the current user into the experiment group for `<EXPERIMENT_KEY>`
+during the browser session by using your browser's developer tools:
+
+```javascript
+document.cookie = "force_experiment=<EXPERIMENT_KEY>; path=/";
+```
+
+Use a comma to list more than one experiment to be forced:
+
+```javascript
+document.cookie = "force_experiment=<EXPERIMENT_KEY>,<ANOTHER_EXPERIMENT_KEY>; path=/";
+```
+
+To clear the experiments, unset the `force_experiment` cookie:
+
+```javascript
+document.cookie = "force_experiment=; path=/";
+```
+
+## Testing and test helpers
+
+### RSpec
+
+Use the following in RSpec to mock the experiment:
+
+```ruby
+context 'when the experiment is active' do
+ before do
+ stub_experiment(signup_flow: true)
+ end
+
+ context 'when the user is in the experimental group' do
+ before do
+ stub_experiment_for_subject(signup_flow: true)
+ end
+
+ it { is_expected.to do_experimental_thing }
+ end
+
+ context 'when the user is in the control group' do
+ before do
+ stub_experiment_for_subject(signup_flow: false)
+ end
+
+ it { is_expected.to do_control_thing }
+ end
+end
+```
+
+### Jest
+
+Use the following in Jest to mock the experiment:
+
+```javascript
+import { withGonExperiment } from 'helpers/experimentation_helper';
+
+describe('given experiment is enabled', () => {
+ withGonExperiment('signupFlow');
+
+ it('should do the experimental thing', () => {
+ expect(wrapper.find('.js-some-experiment-triggered-element')).toEqual(expect.any(Element));
+ });
+});
+```
diff --git a/doc/development/experiment_guide/gitlab_experiment.md b/doc/development/experiment_guide/gitlab_experiment.md
new file mode 100644
index 00000000000..6b15449b812
--- /dev/null
+++ b/doc/development/experiment_guide/gitlab_experiment.md
@@ -0,0 +1,547 @@
+---
+stage: Growth
+group: Adoption
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Implementing an A/B/n experiment using GLEX
+
+## Introduction
+
+`Gitlab::Experiment` (GLEX) is tightly coupled with the concepts provided by
+[Feature flags in development of GitLab](../feature_flags/index.md). Here, we refer
+to this layer as feature flags, and may also use the term Flipper, because we
+built our development and experiment feature flags atop it.
+
+You're strongly encouraged to read and understand the
+[Feature flags in development of GitLab](../feature_flags/index.md) portion of the
+documentation before considering running experiments. Experiments add additional
+concepts which may seem confusing or advanced without understanding the underpinnings
+of how GitLab uses feature flags in development. One concept: GLEX supports multivariate
+experiments, which are sometimes referred to as A/B/n tests.
+
+The [`gitlab-experiment` project](https://gitlab.com/gitlab-org/gitlab-experiment)
+exists in a separate repository, so it can be shared across any GitLab property that uses
+Ruby. You should feel comfortable reading the documentation on that project as well
+if you want to dig into more advanced topics.
+
+## Glossary of terms
+
+To ensure a shared language, you should understand these fundamental terms we use
+when communicating about experiments:
+
+- `experiment`: Any deviation of code paths we want to run at some times, but not others.
+- `context`: A consistent experience we provide in an experiment.
+- `control`: The default, or "original" code path.
+- `candidate`: Defines an experiment with only one code path.
+- `variant(s)`: Defines an experiment with multiple code paths.
+
+### How it works
+
+Use this decision tree diagram to understand how GLEX works. When an experiment runs,
+the following logic is executed to determine what variant should be provided,
+given how the experiment has been defined and using the provided context:
+
+```mermaid
+graph TD
+ GP[General Pool/Population] --> Running?
+ Running? -->|Yes| Cached?[Cached? / Pre-segmented?]
+ Running? -->|No| Excluded[Control / No Tracking]
+ Cached? -->|No| Excluded?
+ Cached? -->|Yes| Cached[Cached Value]
+ Excluded? -->|Yes / Cached| Excluded
+ Excluded? -->|No| Segmented?
+ Segmented? -->|Yes / Cached| VariantA
+ Segmented? -->|No| Included?[Experiment Group?]
+ Included? -->|Yes| Rollout
+ Included? -->|No| Control
+ Rollout -->|Cached| VariantA
+ Rollout -->|Cached| VariantB
+ Rollout -->|Cached| VariantC
+
+classDef included fill:#380d75,color:#ffffff,stroke:none
+classDef excluded fill:#fca121,stroke:none
+classDef cached fill:#2e2e2e,color:#ffffff,stroke:none
+classDef default fill:#fff,stroke:#6e49cb
+
+class VariantA,VariantB,VariantC included
+class Control,Excluded excluded
+class Cached cached
+```
+
+## Implement an experiment
+
+Start by generating a feature flag using the `bin/feature-flag` command as you
+normally would for a development feature flag, making sure to use `experiment` for
+the type. For the sake of documentation let's name our feature flag (and experiment)
+"pill_color".
+
+```shell
+bin/feature-flag pill_color -t experiment
+```
+
+After you generate the desired feature flag, you can immediately implement an
+experiment in code. An experiment implementation can be as simple as:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.use { 'control' }
+ e.try(:red) { 'red' }
+ e.try(:blue) { 'blue' }
+end
+```
+
+When this code executes, the experiment is run, a variant is assigned, and (if within a
+controller or view) a `window.gon.experiment.pillColor` object will be available in the
+client layer, with details like:
+
+- The assigned variant.
+- The context key for client tracking events.
+
+In addition, when an experiment runs, an event is tracked for
+the experiment `:assignment`. We cover more about events, tracking, and
+the client layer later.
+
+In local development, you can make the experiment active by using the feature flag
+interface. You can also target specific cases by providing the relevant experiment
+to the call to enable the feature flag:
+
+```ruby
+# Enable for everyone
+Feature.enable(:pill_color)
+
+# Get the `experiment` method -- already available in controllers, views, and mailers.
+include Gitlab::Experiment::Dsl
+# Enable for only the first user
+Feature.enable(:pill_color, experiment(:pill_color, actor: User.first))
+```
+
+To roll out your experiment feature flag on an environment, run
+the following command using ChatOps (which is covered in more depth in the
+[Feature flags in development of GitLab](../feature_flags/index.md) documentation).
+This command creates a scenario where half of everyone who encounters
+the experiment would be assigned the _control_, 25% would be assigned the _red_
+variant, and 25% would be assigned the _blue_ variant:
+
+```slack
+/chatops run feature set pill_color 50 --actors
+```
+
+For an even distribution in this example, change the command to set it to 66% instead
+of 50.
+
+NOTE:
+To immediately stop running an experiment, use the
+`/chatops run feature set pill_color false` command.
+
+WARNING:
+We strongly recommend using the `--actors` flag when using the ChatOps commands,
+as anything else may give odd behaviors due to how the caching of variant assignment is
+handled.
+
+We can also implement this experiment in a HAML file with HTML wrappings:
+
+```haml
+#cta-interface
+ - experiment(:pill_color, actor: current_user) do |e|
+ - e.use do
+ .pill-button control
+ - e.try(:red) do
+ .pill-button.red red
+ - e.try(:blue) do
+ .pill-button.blue blue
+```
+
+### The importance of context
+
+In our previous example experiment, our context (this is an important term) is a hash
+that's set to `{ actor: current_user }`. Context must be unique based on how you
+want to run your experiment, and should be understood at a lower level.
+
+It's expected, and recommended, that you use some of these
+contexts to simplify reporting:
+
+- `{ actor: current_user }`: Assigns a variant and is "sticky" to each user
+ (or "client" if `current_user` is nil) who enters the experiment.
+- `{ project: project }`: Assigns a variant and is "sticky" to the project currently
+ being viewed. If running your experiment is more useful when viewing a project,
+ rather than when a specific user is viewing any project, consider this approach.
+- `{ group: group }`: Similar to the project example, but applies to a wider
+ scope of projects and users.
+- `{ actor: current_user, project: project }`: Assigns a variant and is "sticky"
+ to the user who is viewing the given project. This creates a different variant
+ assignment possibility for every project that `current_user` views. Understand this
+ can create a large cache size if an experiment like this in a highly trafficked part
+ of the application.
+- `{ wday: Time.current.wday }`: Assigns a variant based on the current day of the
+ week. In this example, it would consistently assign one variant on Friday, and a
+ potentially different variant on Saturday.
+
+Context is critical to how you define and report on your experiment. It's usually
+the most important aspect of how you choose to implement your experiment, so consider
+it carefully, and discuss it with the wider team if needed. Also, take into account
+that the context you choose affects our cache size.
+
+After the above examples, we can state the general case: *given a specific
+and consistent context, we can provide a consistent experience and track events for
+that experience.* To dive a bit deeper into the implementation details: a context key
+is generated from the context that's provided. Use this context key to:
+
+- Determine the assigned variant.
+- Identify events tracked against that context key.
+
+We can think about this as the experience that we've rendered, which is both dictated
+and tracked by the context key. The context key is used to track the interaction and
+results of the experience we've rendered to that context key. These concepts are
+somewhat abstract and hard to understand initially, but this approach enables us to
+communicate about experiments as something that's wider than just user behavior.
+
+NOTE:
+Using `actor:` utilizes cookies if the `current_user` is nil. If you don't need
+cookies though - meaning that the exposed functionality would only be visible to
+signed in users - `{ user: current_user }` would be just as effective.
+
+WARNING:
+The caching of variant assignment is done by using this context, and so consider
+your impact on the cache size when defining your experiment. If you use
+`{ time: Time.current }` you would be inflating the cache size every time the
+experiment is run. Not only that, your experiment would not be "sticky" and events
+wouldn't be resolvable.
+
+### Advanced experimentation
+
+GLEX allows for two general implementation styles:
+
+1. The simple experiment style described previously.
+1. A more advanced style where an experiment class can be provided.
+
+The advanced style is handled by naming convention, and works similar to what you
+would expect in Rails.
+
+To generate a custom experiment class that can override the defaults in
+`ApplicationExperiment` (our base GLEX implementation), use the rails generator:
+
+```shell
+rails generate gitlab:experiment pill_color control red blue
+```
+
+This generates an experiment class in `app/experiments/pill_color_experiment.rb`
+with the variants (or _behaviors_) we've provided to the generator. Here's an example
+of how that class would look after migrating the previous example into it:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ def control_behavior
+ 'control'
+ end
+
+ def red_behavior
+ 'red'
+ end
+
+ def blue_behavior
+ 'blue'
+ end
+end
+```
+
+We can now simplify where we run our experiment to the following call, instead of
+providing the block we were initially providing, by explicitly calling `run`:
+
+```ruby
+experiment(:pill_color, actor: current_user).run
+```
+
+The _behavior_ methods we defined in our experiment class represent the default
+implementation. You can still use the block syntax to override these _behavior_
+methods however, so the following would also be valid:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.use { '<strong>control</strong>' }
+end
+```
+
+NOTE:
+When passing a block to the `experiment` method, it is implicitly invoked as
+if `run` has been called.
+
+#### Segmentation rules
+
+You can use runtime segmentation rules to, for instance, segment contexts into a specific
+variant. The `segment` method is a callback (like `before_action`) and so allows providing
+a block or method name.
+
+In this example, any user named `'Richard'` would always be assigned the _red_
+variant, and any account older than 2 weeks old would be assigned the _blue_ variant:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ segment(variant: :red) { context.actor.first_name == 'Richard' }
+ segment :old_account?, variant: :blue
+
+ # ...behaviors
+
+ private
+
+ def old_account?
+ context.actor.created_at < 2.weeks.ago
+ end
+end
+```
+
+When an experiment runs, the segmentation rules are executed in the order they're
+defined. The first segmentation rule to produce a truthy result assigns the variant.
+
+In our example, any user named `'Richard'`, regardless of account age, will always
+be assigned the _red_ variant. If you want the opposite logic, flip the order.
+
+NOTE:
+Keep in mind when defining segmentation rules: after a truthy result, the remaining
+segmentation rules are skipped to achieve optimal performance.
+
+#### Exclusion rules
+
+Exclusion rules are similar to segmentation rules, but are intended to determine
+if a context should even be considered as something we should include in the experiment
+and track events toward. Exclusion means we don't care about the events in relation
+to the given context.
+
+These examples exclude all users named `'Richard'`, *and* any account
+older than 2 weeks old. Not only are they given the control behavior - which could
+be nothing - but no events are tracked in these cases as well.
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ exclude :old_account?, ->{ context.actor.first_name == 'Richard' }
+
+ # ...behaviors
+
+ private
+
+ def old_account?
+ context.actor.created_at < 2.weeks.ago
+ end
+end
+```
+
+We can also do exclusion when we run the experiment. For instance,
+if we wanted to prevent the inclusion of non-administrators in an experiment, consider
+the following experiment. This type of logic enables us to do complex experiments
+while preventing us from passing things into our experiments, because
+we want to minimize passing things into our experiments:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.exclude! unless can?(current_user, :admin_project, project)
+end
+```
+
+You may also need to check exclusion in custom tracking logic by calling `should_track?`:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ # ...behaviors
+
+ def expensive_tracking_logic
+ return unless should_track?
+
+ track(:my_event, value: expensive_method_call)
+ end
+end
+```
+
+Exclusion rules aren't the best way to determine if an experiment is active. Override
+the `enabled?` method for a high-level way of determining if an experiment should
+run and track. Make the `enabled?` check as efficient as possible because it's the
+first early opt-out path an experiment can implement.
+
+### Tracking events
+
+One of the most important aspects of experiments is gathering data and reporting on
+it. GLEX provides an interface that allows tracking events across an experiment.
+You can implement it consistently if you provide the same context between
+calls to your experiment. If you do not yet understand context, you should read
+about contexts now.
+
+We can assume we run the experiment in one or a few places, but
+track events potentially in many places. The tracking call remains the same, with
+the arguments you would normally use when
+[tracking events using snowplow](../snowplow.md). The easiest example
+of tracking an event in Ruby would be:
+
+```ruby
+experiment(:pill_color, actor: current_user).track(:created)
+```
+
+When you run an experiment with any of these examples, an `:assigned` event
+is tracked automatically by default. All events that are tracked from an
+experiment have a special
+[experiment context](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-0)
+added to the event. This can be used - typically by the data team - to create a connection
+between the events on a given experiment.
+
+If our current user hasn't encountered the experiment yet (meaning where the experiment
+is run), and we track an event for them, they are assigned a variant and see
+that variant if they ever encountered the experiment later, when an `:assignment`
+event would be tracked at that time for them.
+
+NOTE:
+GitLab tries to be sensitive and respectful of our customers regarding tracking,
+so GLEX allows us to implement an experiment without ever tracking identifying
+IDs. It's not always possible, though, based on experiment reporting requirements.
+You may be asked from time to time to track a specific record ID in experiments.
+The approach is largely up to the PM and engineer creating the implementation.
+No recommendations are provided here at this time.
+
+## Test with RSpec
+
+This gem provides some RSpec helpers and custom matchers. These are in flux as of GitLab 13.10.
+
+First, require the RSpec support file to mix in some of the basics:
+
+```ruby
+require 'gitlab/experiment/rspec'
+```
+
+You still need to include matchers and other aspects, which happens
+automatically for files in `spec/experiments`, but for other files and specs
+you want to include it in, you can specify the `:experiment` type:
+
+```ruby
+it "tests", :experiment do
+end
+```
+
+### Stub helpers
+
+You can stub experiments using `stub_experiments`. Pass it a hash using experiment
+names as the keys, and the variants you want each to resolve to, as the values:
+
+```ruby
+# Ensures the experiments named `:example` & `:example2` are both
+# "enabled" and that each will resolve to the given variant
+# (`:my_variant` & `:control` respectively).
+stub_experiments(example: :my_variant, example2: :control)
+
+experiment(:example) do |e|
+ e.enabled? # => true
+ e.variant.name # => 'my_variant'
+end
+
+experiment(:example2) do |e|
+ e.enabled? # => true
+ e.variant.name # => 'control'
+end
+```
+
+### Exclusion and segmentation matchers
+
+You can also test the exclusion and segmentation matchers.
+
+```ruby
+class ExampleExperiment < ApplicationExperiment
+ exclude { context.actor.first_name == 'Richard' }
+ segment(variant: :candidate) { context.actor.username == 'jejacks0n' }
+end
+
+excluded = double(username: 'rdiggitty', first_name: 'Richard')
+segmented = double(username: 'jejacks0n', first_name: 'Jeremy')
+
+# exclude matcher
+expect(experiment(:example)).to exclude(actor: excluded)
+expect(experiment(:example)).not_to exclude(actor: segmented)
+
+# segment matcher
+expect(experiment(:example)).to segment(actor: segmented).into(:candidate)
+expect(experiment(:example)).not_to segment(actor: excluded)
+```
+
+### Tracking matcher
+
+Tracking events is a major aspect of experimentation. We try
+to provide a flexible way to ensure your tracking calls are covered.
+
+You can do this on the instance level or at an "any instance" level:
+
+```ruby
+subject = experiment(:example)
+
+expect(subject).to track(:my_event)
+
+subject.track(:my_event)
+```
+
+You can use the `on_any_instance` chain method to specify that it could happen on
+any instance of the experiment. This helps you if you're calling
+`experiment(:example).track` downstream:
+
+```ruby
+expect(experiment(:example)).to track(:my_event).on_any_instance
+
+experiment(:example).track(:my_event)
+```
+
+A full example of the methods you can chain onto the `track` matcher:
+
+```ruby
+expect(experiment(:example)).to track(:my_event, value: 1, property: '_property_')
+ .on_any_instance
+ .with_context(foo: :bar)
+ .for(:variant_name)
+
+experiment(:example, :variant_name, foo: :bar).track(:my_event, value: 1, property: '_property_')
+```
+
+## Experiments in the client layer
+
+This is in flux as of GitLab 13.10, and can't be documented just yet.
+
+Any experiment that's been run in the request lifecycle surfaces in `window.gon.experiment`,
+and matches [this schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-0)
+so you can use it when resolving some concepts around experimentation in the client layer.
+
+## Notes on feature flags
+
+NOTE:
+We use the terms "enabled" and "disabled" here, even though it's against our
+[documentation style guide recommendations](../documentation/styleguide/index.md#avoid-ableist-language)
+because these are the terms that the feature flag documentation uses.
+
+You may already be familiar with the concept of feature flags in GitLab, but using
+feature flags in experiments is a bit different. While in general terms, a feature flag
+is viewed as being either `on` or `off`, this isn't accurate for experiments.
+
+Generally, `off` means that when we ask if a feature flag is enabled, it will always
+return `false`, and `on` means that it will always return `true`. An interim state,
+considered `conditional`, also exists. GLEX takes advantage of this trinary state of
+feature flags. To understand this `conditional` aspect: consider that either of these
+settings puts a feature flag into this state:
+
+- Setting a `percentage_of_actors` of any percent greater than 0%.
+- Enabling it for a single user or group.
+
+Conditional means that it returns `true` in some situations, but not all situations.
+
+When a feature flag is disabled (meaning the state is `off`), the experiment is
+considered _inactive_. You can visualize this in the [decision tree diagram](#how-it-works)
+as reaching the first [Running?] node, and traversing the negative path.
+
+When a feature flag is rolled out to a `percentage_of_actors` or similar (meaning the
+state is `conditional`) the experiment is considered to be _running_
+where sometimes the control is assigned, and sometimes the candidate is assigned.
+We don't refer to this as being enabled, because that's a confusing and overloaded
+term here. In the experiment terms, our experiment is _running_, and the feature flag is
+`conditional`.
+
+When a feature flag is enabled (meaning the state is `on`), the candidate will always be
+assigned.
+
+We should try to be consistent with our terms, and so for experiments, we have an
+_inactive_ experiment until we set the feature flag to `conditional`. After which,
+our experiment is then considered _running_. If you choose to "enable" your feature flag,
+you should consider the experiment to be _resolved_, because everyone is assigned
+the candidate unless they've opted out of experimentation.
+
+As of GitLab 13.10, work is being done to improve this process and how we communicate
+about it.
diff --git a/doc/development/experiment_guide/index.md b/doc/development/experiment_guide/index.md
index 21c61324dc1..15430831f4a 100644
--- a/doc/development/experiment_guide/index.md
+++ b/doc/development/experiment_guide/index.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Experiments can be conducted by any GitLab team, most often the teams from the [Growth Sub-department](https://about.gitlab.com/handbook/engineering/development/growth/). Experiments are not tied to releases because they primarily target GitLab.com.
-Experiments are run as an A/B test and are behind a feature flag to turn the test on or off. Based on the data the experiment generates, the team decides if the experiment had a positive impact and should be made the new default or rolled back.
+Experiments are run as an A/B/n test, and are behind a feature flag to turn the test on or off. Based on the data the experiment generates, the team decides if the experiment had a positive impact and should be made the new default, or rolled back.
## Experiment tracking issue
@@ -36,386 +36,27 @@ and link to the issue that resolves the experiment. If the experiment is
successful and becomes part of the product, any follow up issues should be
addressed.
-## Experiments using `gitlab-experiment`
+## Implementing an experiment
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300383) in GitLab 13.7.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - It's enabled on GitLab.com.
-> - It is not yet intended for use in GitLab self-managed instances.
+There are currently two options when implementing an experiment.
-[GitLab Experiment](https://gitlab.com/gitlab-org/gitlab-experiment/) is a gem included
-in GitLab that can be used for running experiments.
+One is built into GitLab directly and has been around for a while (this is called
+`Exerimentation Module`), and the other is provided by
+[`gitlab-experiment`](https://gitlab.com/gitlab-org/gitlab-experiment) and is referred
+to as `Gitlab::Experiment` -- GLEX for short.
-## How to create an A/B test using `experimentation.rb`
+Both approaches use [experiment](../feature_flags/index.md#experiment-type)
+feature flags, and there is currently no strong suggestion to use one over the other.
-### Implement the experiment
+| Feature | `Experimentation Module` | GLEX |
+| -------------------- |------------------------- | ---- |
+| Record user grouping | Yes | No |
+| Uses feature flags | Yes | Yes |
+| Multivariate (A/B/n) | No | Yes |
-1. Add the experiment to the `Gitlab::Experimentation::EXPERIMENTS` hash in [`experimentation.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib%2Fgitlab%2Fexperimentation.rb):
+- [Implementing an A/B experiment using `Experimentation Module`](experimentation.md)
+- [Implementing an A/B/n experiment using GLEX](gitlab_experiment.md)
- ```ruby
- EXPERIMENTS = {
- other_experiment: {
- #...
- },
- # Add your experiment here:
- signup_flow: {
- tracking_category: 'Growth::Activation::Experiment::SignUpFlow' # Used for providing the category when setting up tracking data
- }
- }.freeze
- ```
-
-1. Use the experiment in the code.
-
- Experiments can be performed on a `subject`. The `subject` that gets provided needs to respond to `to_global_id` or `to_s`.
- The resulting string is bucketed and assigned to either the control or the experimental group. It's therefore necessary to always provide the same `subject` for an experiment to have the same experience.
-
- - Use this standard for the experiment in a controller:
-
- Experiment run for a user:
-
- ```ruby
- class ProjectController < ApplicationController
- def show
- # experiment_enabled?(:experiment_key) is also available in views and helpers
- if experiment_enabled?(:signup_flow, subject: current_user)
- # render the experiment
- else
- # render the original version
- end
- end
- end
- ```
-
- or experiment run for a namespace:
-
- ```ruby
- if experiment_enabled?(:signup_flow, subject: namespace)
- # experiment code
- else
- # control code
- end
- ```
-
- When no subject is given, it falls back to a cookie that gets set and is consistent until
- the cookie gets deleted.
-
- ```ruby
- class RegistrationController < ApplicationController
- def show
- # falls back to a cookie
- if experiment_enabled?(:signup_flow)
- # render the experiment
- else
- # render the original version
- end
- end
- end
- ```
-
- - Make the experiment available to the frontend in a controller:
-
- ```ruby
- before_action do
- push_frontend_experiment(:signup_flow, subject: current_user)
- end
- ```
-
- The above checks whether the experiment is enabled and pushes the result to the frontend.
-
- You can check the state of the feature flag in JavaScript:
-
- ```javascript
- import { isExperimentEnabled } from '~/experimentation';
-
- if ( isExperimentEnabled('signupFlow') ) {
- // ...
- }
- ```
-
- - It is also possible to run an experiment outside of the controller scope, for example in a worker:
-
- ```ruby
- class SomeWorker
- def perform
- # Check if the experiment is active at all (the percentage_of_time_value > 0)
- return unless Gitlab::Experimentation.active?(:experiment_key)
-
- # Since we cannot access cookies in a worker, we need to bucket models based on a unique, unchanging attribute instead.
- # It is therefore necessery to always provide the same subject.
- if Gitlab::Experimentation.in_experiment_group?(:experiment_key, subject: user)
- # execute experimental code
- else
- # execute control code
- end
- end
- end
- ```
-
-### Implement the tracking events
-
-To determine whether the experiment is a success or not, we must implement tracking events
-to acquire data for analyzing. We can send events to Snowplow via either the backend or frontend.
-Read the [product intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/) for more details.
-
-#### Track backend events
-
-The framework provides the following helper method that is available in controllers:
-
-```ruby
-before_action do
- track_experiment_event(:signup_flow, 'action', 'value', subject: current_user)
-end
-```
-
-Which can be tested as follows:
-
-```ruby
-context 'when the experiment is active and the user is in the experimental group' do
- before do
- stub_experiment(signup_flow: true)
- stub_experiment_for_subject(signup_flow: true)
- end
-
- it 'tracks an event', :snowplow do
- subject
-
- expect_snowplow_event(
- category: 'Growth::Activation::Experiment::SignUpFlow',
- action: 'action',
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- )
- end
-end
-```
-
-#### Track frontend events
-
-The framework provides the following helper method that is available in controllers:
-
-```ruby
-before_action do
- push_frontend_experiment(:signup_flow, subject: current_user)
- frontend_experimentation_tracking_data(:signup_flow, 'action', 'value', subject: current_user)
-end
-```
-
-This pushes tracking data to `gon.experiments` and `gon.tracking_data`.
-
-```ruby
-expect(Gon.experiments['signupFlow']).to eq(true)
-
-expect(Gon.tracking_data).to eq(
- {
- category: 'Growth::Activation::Experiment::SignUpFlow',
- action: 'action',
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- }
-)
-```
-
-Which can then be used for tracking as follows:
-
-```javascript
-import { isExperimentEnabled } from '~/lib/utils/experimentation';
-import Tracking from '~/tracking';
-
-document.addEventListener('DOMContentLoaded', () => {
- const signupFlowExperimentEnabled = isExperimentEnabled('signupFlow');
-
- if (signupFlowExperimentEnabled && gon.tracking_data) {
- const { category, action, ...data } = gon.tracking_data;
-
- Tracking.event(category, action, data);
- }
-}
-```
-
-Which can be tested in Jest as follows:
-
-```javascript
-import { withGonExperiment } from 'helpers/experimentation_helper';
-import Tracking from '~/tracking';
-
-describe('event tracking', () => {
- describe('with tracking data', () => {
- withGonExperiment('signupFlow');
-
- beforeEach(() => {
- jest.spyOn(Tracking, 'event').mockImplementation(() => {});
-
- gon.tracking_data = {
- category: 'Growth::Activation::Experiment::SignUpFlow',
- action: 'action',
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- };
- });
-
- it('should track data', () => {
- performAction()
-
- expect(Tracking.event).toHaveBeenCalledWith(
- 'Growth::Activation::Experiment::SignUpFlow',
- 'action',
- {
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- },
- );
- });
- });
-});
-```
-
-### Record experiment user
-
-In addition to the anonymous tracking of events, we can also record which users have participated in which experiments and whether they were given the control experience or the experimental experience.
-
-The `record_experiment_user` helper method is available to all controllers, and it enables you to record these experiment participants (the current user) and which experience they were given:
-
-```ruby
-before_action do
- record_experiment_user(:signup_flow)
-end
-```
-
-Subsequent calls to this method for the same experiment and the same user have no effect unless the user has gets enrolled into a different experience. This happens when we roll out the experimental experience to a greater percentage of users.
-
-Note that this data is completely separate from the [events tracking data](#implement-the-tracking-events). They are not linked together in any way.
-
-#### Add context
-
-You can add arbitrary context data in a hash which gets stored as part of the experiment user record. New calls to the `record_experiment_user` with newer contexts get merged deeply into the existing context.
-
-This data can then be used by data analytics dashboards.
-
-```ruby
-before_action do
- record_experiment_user(:signup_flow, foo: 42, bar: { a: 22})
- # context is { "foo" => 42, "bar" => { "a" => 22 }}
-end
-
-# Additional contexts for newer record calls are merged deeply
-record_experiment_user(:signup_flow, foo: 40, bar: { b: 2 }, thor: 3)
-# context becomes { "foo" => 40, "bar" => { "a" => 22, "b" => 2 }, "thor" => 3}
-```
-
-### Record experiment conversion event
-
-Along with the tracking of backend and frontend events and the [recording of experiment participants](#record-experiment-user), we can also record when a user performs the desired conversion event action. For example:
-
-- **Experimental experience:** Show an in-product nudge to see if it causes more people to sign up for trials.
-- **Conversion event:** The user starts a trial.
-
-The `record_experiment_conversion_event` helper method is available to all controllers. It enables us to record the conversion event for the current user, regardless of whether they are in the control or experimental group:
-
-```ruby
-before_action do
- record_experiment_conversion_event(:signup_flow)
-end
-```
-
-Note that the use of this method requires that we have first [recorded the user as being part of the experiment](#record-experiment-user).
-
-### Enable the experiment
-
-After all merge requests have been merged, use [`chatops`](../../ci/chatops/index.md) in the
-[appropriate channel](../feature_flags/controls.md#communicate-the-change) to start the experiment for 10% of the users.
-The feature flag should have the name of the experiment with the `_experiment_percentage` suffix appended.
-For visibility, please also share any commands run against production in the `#s_growth` channel:
-
- ```shell
- /chatops run feature set signup_flow_experiment_percentage 10
- ```
-
- If you notice issues with the experiment, you can disable the experiment by removing the feature flag:
-
- ```shell
- /chatops run feature delete signup_flow_experiment_percentage
- ```
-
-### Manually force the current user to be in the experiment group
-
-You may force the application to put your current user in the experiment group. To do so
-add a query string parameter to the path where the experiment runs. If you do so,
-the experiment will work only for this request and won't work after following links or submitting forms.
-
-For example, to forcibly enable the `EXPERIMENT_KEY` experiment, add `force_experiment=EXPERIMENT_KEY`
-to the URL:
-
-```shell
-https://gitlab.com/<EXPERIMENT_ENTRY_URL>?force_experiment=<EXPERIMENT_KEY>
-```
-
-### A cookie-based approach to force an experiment
-
-It's possible to force the current user to be in the experiment group for `<EXPERIMENT_KEY>`
-during the browser session by using your browser's developer tools:
-
-```javascript
-document.cookie = "force_experiment=<EXPERIMENT_KEY>; path=/";
-```
-
-Use a comma to list more than one experiment to be forced:
-
-```javascript
-document.cookie = "force_experiment=<EXPERIMENT_KEY>,<ANOTHER_EXPERIMENT_KEY>; path=/";
-```
-
-To clear the experiments, unset the `force_experiment` cookie:
-
-```javascript
-document.cookie = "force_experiment=; path=/";
-```
-
-### Testing and test helpers
-
-#### RSpec
-
-Use the following in RSpec to mock the experiment:
-
-```ruby
-context 'when the experiment is active' do
- before do
- stub_experiment(signup_flow: true)
- end
-
- context 'when the user is in the experimental group' do
- before do
- stub_experiment_for_subject(signup_flow: true)
- end
-
- it { is_expected.to do_experimental_thing }
- end
-
- context 'when the user is in the control group' do
- before do
- stub_experiment_for_subject(signup_flow: false)
- end
-
- it { is_expected.to do_control_thing }
- end
-end
-```
-
-#### Jest
-
-Use the following in Jest to mock the experiment:
-
-```javascript
-import { withGonExperiment } from 'helpers/experimentation_helper';
-
-describe('given experiment is enabled', () => {
- withGonExperiment('signupFlow');
-
- it('should do the experimental thing', () => {
- expect(wrapper.find('.js-some-experiment-triggered-element')).toEqual(expect.any(Element));
- });
-});
-```
+Historical Context: `Experimentation Module` was built iteratively with the needs that
+appeared while implementing Growth sub-department experiments, while GLEX was built
+with the learnings of the team and an easier to use API.
diff --git a/doc/development/export_csv.md b/doc/development/export_csv.md
index 0bf12149779..c301b6b9d66 100644
--- a/doc/development/export_csv.md
+++ b/doc/development/export_csv.md
@@ -14,7 +14,7 @@ This document lists the different implementations of CSV export in GitLab codeba
| Downloading | - Query and write data in batches to a temporary file.<br>- Loads the file into memory.<br>- Sends the file to the client. | - Report available immediately. | - Large amount of data might cause request timeout.<br>- Memory intensive.<br>- Request expires when user navigates to a different page. | [Export Chain of Custody Report](../user/compliance/compliance_dashboard/#chain-of-custody-report) |
| As email attachment | - Asynchronously process the query with background job.<br>- Email uses the export as an attachment. | - Asynchronous processing. | - Requires users use a different app (email) to download the CSV.<br>- Email providers may limit attachment size. | - [Export Issues](../user/project/issues/csv_export.md)<br>- [Export Merge Requests](../user/project/merge_requests/csv_export.md) |
| As downloadable link in email (*) | - Asynchronously process the query with background job.<br>- Email uses an export link. | - Asynchronous processing.<br>- Bypasses email provider attachment size limit. | - Requires users use a different app (email).<br>- Requires additional storage and cleanup. | [Export User Permissions](https://gitlab.com/gitlab-org/gitlab/-/issues/1772) |
-| Polling (non-persistent state) | - Asynchronously processes the query with the background job.<br>- Frontend(FE) polls every few seconds to check if CSV file is ready. | - Asynchronous processing.<br>- Automatically downloads to local machine on completion.<br>- In-app solution. | - Non-persistable request - request expires when user navigates to a different page.<br>- API is processed for each polling request. | [Export Vulnerabilities](../user/application_security/vulnerability_report/#export-vulnerabilities) |
+| Polling (non-persistent state) | - Asynchronously processes the query with the background job.<br>- Frontend(FE) polls every few seconds to check if CSV file is ready. | - Asynchronous processing.<br>- Automatically downloads to local machine on completion.<br>- In-app solution. | - Non-persistable request - request expires when user navigates to a different page.<br>- API is processed for each polling request. | [Export Vulnerabilities](../user/application_security/vulnerability_report/#export-vulnerability-details) |
| Polling (persistent state) (*) | - Asynchronously processes the query with background job.<br>- Backend (BE) maintains the export state<br>- FE polls every few seconds to check status.<br>- FE shows 'Download link' when export is ready.<br>- User can download or regenerate a new report. | - Asynchronous processing.<br>- No database calls made during the polling requests (HTTP 304 status is returned until export status changes).<br>- Does not require user to stay on page until export is complete.<br>- In-app solution.<br>- Can be expanded into a generic CSV feature (such as dashboard / CSV API). | - Requires to maintain export states in DB.<br>- Does not automatically download the CSV export to local machine, requires users to click 'Download' button. | [Export Merge Commits Report](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43055) |
NOTE:
diff --git a/doc/development/fe_guide/accessibility.md b/doc/development/fe_guide/accessibility.md
index 5ad1a701fac..5f22c13ca06 100644
--- a/doc/development/fe_guide/accessibility.md
+++ b/doc/development/fe_guide/accessibility.md
@@ -4,14 +4,195 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Accessibility & Readability
+# Accessibility
+
+Accessibility is important for users who use screen readers or rely on keyboard-only functionality
+to ensure they have an equivalent experience to sighted mouse users.
+
+This page contains guidelines we should follow.
+
+## Quick summary
+
+Since [no ARIA is better than bad ARIA](https://www.w3.org/TR/wai-aria-practices/#no_aria_better_bad_aria),
+review the following recommendations before using `aria-*`, `role`, and `tabindex`.
+Use semantic HTML, which typically has accessibility semantics baked in, but always be sure to test with
+[relevant combinations of screen readers and browsers](https://www.accessibility-developer-guide.com/knowledge/screen-readers/relevant-combinations/).
+
+In [WebAIM's accessibility analysis of the top million home pages](https://webaim.org/projects/million/#aria),
+they found that "ARIA correlated to higher detectable errors".
+It is likely that *misuse* of ARIA is a big cause of increased errors,
+so when in doubt don't use `aria-*`, `role`, and `tabindex`, and stick with semantic HTML.
+
+## Provide accessible names to screen readers
+
+To provide markup with accessible names, ensure every:
+
+- `input` has an associated `label`.
+- `button` and `a` have child text, or `aria-label` when text isn’t present.
+ For example, an icon button with no visible text.
+- `img` has an `alt` attribute.
+- `fieldset` has `legend` as its first child.
+- `figure` has `figcaption` as its first child.
+- `table` has `caption` as its first child.
+
+If the `label`, child text, or child element is not visually desired,
+use `.gl-sr-only` to hide the element from everything but screen readers.
+
+Ensure the accessible name is descriptive enough to be understood in isolation.
+
+```html
+// bad
+<button>Submit</button>
+<a href="url">page</a>
+
+// good
+<button>Submit review</button>
+<a href="url">GitLab's accessibility page</a>
+```
+
+## Role
+
+In general, avoid using `role`.
+Use semantic HTML elements that implicitly have a `role` instead.
+
+| Bad | Good |
+| --- | --- |
+| `<div role="button">` | `<button>` |
+| `<div role="img">` | `<img>` |
+| `<div role="link">` | `<a>` |
+| `<div role="header">` | `<h1>` to `<h6>` |
+| `<div role="textbox">` | `<input>` or `<textarea>` |
+| `<div role="article">` | `<article>` |
+| `<div role="list">` | `<ol>` or `<ul>` |
+| `<div role="listitem">` | `<li>` |
+| `<div role="table">` | `<table>` |
+| `<div role="rowgroup">` | `<thead>`, `<tbody>`, or `<tfoot>` |
+| `<div role="row">` | `<tr>` |
+| `<div role="columnheader">` | `<th>` |
+| `<div role="cell">` | `<td>` |
+
+## Support keyboard-only use
+
+Keyboard users rely on focus outlines to understand where they are on the page. Therefore, if an
+element is interactive you must ensure:
+
+- It can receive keyboard focus.
+- It has a visible focus state.
+
+Use semantic HTML, such as `a` and `button`, which provides these behaviours by default.
+
+See the [Pajamas Keyboard-only page](https://design.gitlab.com/accessibility-audits/2-keyboard-only/) for more detail.
+
+## Tabindex
+
+Prefer **no** `tabindex` to using `tabindex`, since:
+
+- Using semantic HTML such as `button` implicitly provides `tabindex="0"`
+- Tabbing order should match the visual reading order and positive `tabindex`s interfere with this
+
+### Avoid using `tabindex="0"` to make an element interactive
+
+Use interactive elements instead of `div`s and `span`s.
+For example:
+
+- If the element should be clickable, use a `button`
+- If the element should be text editable, use an `input` or `textarea`
+
+Once the markup is semantically complete, use CSS to update it to its desired visual state.
+
+```html
+// bad
+<div role="button" tabindex="0" @click="expand">Expand</div>
+
+// good
+<button @click="expand">Expand</button>
+```
+
+### Do not use `tabindex="0"` on interactive elements
+
+Interactive elements are already tab accessible so adding `tabindex` is redundant.
+
+```html
+// bad
+<a href="help" tabindex="0">Help</a>
+<button tabindex="0">Submit</button>
+
+// good
+<a href="help">Help</a>
+<button>Submit</button>
+```
+
+### Do not use `tabindex="0"` on elements for screen readers to read
+
+Screen readers can read text that is not tab accessible.
+The use of `tabindex="0"` is unnecessary and can cause problems,
+as screen reader users then expect to be able to interact with it.
+
+```html
+// bad
+<span tabindex="0" :aria-label="message">{{ message }}</span>
+
+// good
+<p>{{ message }}</p>
+```
+
+### Do not use a positive `tabindex`
+
+[Always avoid using `tabindex="1"`](https://webaim.org/techniques/keyboard/tabindex#overview)
+or greater.
+
+## Hiding elements
+
+Use the following table to hide elements from users, when appropriate.
+
+| Hide from sighted users | Hide from screen readers | Hide from both sighted and screen reader users |
+| --- | --- | --- |
+| `.gl-sr-only` | `aria-hidden="true"` | `display: none`, `visibility: hidden`, or `hidden` attribute |
+
+### Hide decorative images from screen readers
+
+To reduce noise for screen reader users, hide decorative images using `alt=""`.
+If the image is not an `img` element, such as an inline SVG, you can hide it by adding both `role="img"` and `alt=""`.
+
+`gl-icon` components automatically hide their icons from screen readers so `aria-hidden="true"` is
+unnecessary when using `gl-icon`.
+
+```html
+// good - decorative images hidden from screen readers
+<img src="decorative.jpg" alt="">
+<svg role="img" alt="">
+<gl-icon name="epic"/>
+```
+
+## When should ARIA be used
+
+No ARIA is required when using semantic HTML because it incorporates accessibility.
+
+However, there are some UI patterns and widgets that do not have semantic HTML equivalents.
+Building such widgets require ARIA to make them understandable to screen readers.
+Proper research and testing should be done to ensure compliance with ARIA.
+
+Ideally, these widgets would exist only in [GitLab UI](https://gitlab-org.gitlab.io/gitlab-ui/).
+Use of ARIA would then only occur in [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui/) and not [GitLab](https://gitlab.com/gitlab-org/gitlab/).
## Resources
-[Chrome Accessibility Developer Tools](https://github.com/GoogleChrome/accessibility-developer-tools)
-assist with testing for potential accessibility problems in GitLab.
+### Viewing the browser accessibility tree
+
+- [Firefox DevTools guide](https://developer.mozilla.org/en-US/docs/Tools/Accessibility_inspector#accessing_the_accessibility_inspector)
+- [Chrome DevTools guide](https://developers.google.com/web/tools/chrome-devtools/accessibility/reference#pane)
+
+### Browser extensions
+
+We have two options for Web accessibility testing:
+
+- [axe](https://www.deque.com/axe/) for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/)
+- [axe](https://www.deque.com/axe/) for [Chrome](https://chrome.google.com/webstore/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd)
-The [axe](https://www.deque.com/axe/) browser extension (available for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/) and [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd)) provides running audits and feedback on markup, CSS, and even potentially problematic color usages.
+### Other links
-Accessibility best-practices and more in-depth information are available on
-[the Audit Rules page](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules) for the Chrome Accessibility Developer Tools. The [Awesome Accessibility](https://github.com/brunopulis/awesome-a11y) list is a compilation of accessibility-related material.
+- [The A11Y Project](https://www.a11yproject.com/) is a good resource for accessibility
+- [Awesome Accessibility](https://github.com/brunopulis/awesome-a11y)
+ is a compilation of accessibility-related material
+- You can read [Chrome Accessibility Developer Tools'](https://github.com/GoogleChrome/accessibility-developer-tools)
+ rules on its [Audit Rules page](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules)
diff --git a/doc/development/fe_guide/architecture.md b/doc/development/fe_guide/architecture.md
index c51f99ca9d2..afaf6df8f8a 100644
--- a/doc/development/fe_guide/architecture.md
+++ b/doc/development/fe_guide/architecture.md
@@ -17,6 +17,13 @@ when appropriate.
You can find the Frontend Architecture experts on the [team page](https://about.gitlab.com/company/team/).
+## Widget Architecture
+
+The [Plan stage](https://about.gitlab.com/handbook/engineering/development/dev/fe-plan/)
+is refactoring the right sidebar to consist of **widgets**. They have a specific architecture to be
+reusable and to expose an interface that can be used by external Vue applications on the page.
+Learn more about the [widget architecture](widgets.md).
+
## Examples
You can find [documentation about the desired architecture](vue.md) for a new
diff --git a/doc/development/fe_guide/dark_mode.md b/doc/development/fe_guide/dark_mode.md
index dd7ffd1ee6c..34901bbb1e6 100644
--- a/doc/development/fe_guide/dark_mode.md
+++ b/doc/development/fe_guide/dark_mode.md
@@ -17,7 +17,7 @@ Note the following:
- The dark mode palette is defined in `app/assets/stylesheets/themes/_dark.scss`.
This is loaded _before_ application.scss to generate `application_dark.css`
- We define two types of variables in `_dark.scss`:
- - SCSS variables are used in framework, components, and utitlity classes.
+ - SCSS variables are used in framework, components, and utility classes.
- CSS variables are used for any colors within the `app/assets/stylesheets/page_bundles` directory.
- `app/views/layouts/_head.html.haml` then loads application or application_dark based on the user's theme preference.
@@ -68,7 +68,7 @@ We [plan to add](https://gitlab.com/gitlab-org/gitlab/-/issues/301147) the CSS v
## When to use SCSS variables
There are a few things we do in SCSS that we cannot (easily) do with CSS, such as the following
-functions:
+functions:
- `lighten`
- `darken`
diff --git a/doc/development/fe_guide/dependencies.md b/doc/development/fe_guide/dependencies.md
index 8fe03544f85..bf46e8e16ce 100644
--- a/doc/development/fe_guide/dependencies.md
+++ b/doc/development/fe_guide/dependencies.md
@@ -20,7 +20,7 @@ This distinction is used by omnibus to determine which dependencies it requires
Exceptions are made for some tools that we require in the
`compile-production-assets` CI job such as `webpack-bundle-analyzer` to analyze our
-production assets post-compile.
+production assets post-compile.
## Updating dependencies
diff --git a/doc/development/fe_guide/editor_lite.md b/doc/development/fe_guide/editor_lite.md
index f783a97fbd3..5ad0c753ced 100644
--- a/doc/development/fe_guide/editor_lite.md
+++ b/doc/development/fe_guide/editor_lite.md
@@ -4,116 +4,141 @@ group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Editor Lite
+# Editor Lite **(FREE)**
-## Background
+**Editor Lite** provides the editing experience at GitLab. This thin wrapper around
+[the Monaco editor](https://microsoft.github.io/monaco-editor/) provides necessary
+helpers and abstractions, and extends Monaco [using extensions](#extensions). Multiple
+GitLab features use it, including:
-**Editor Lite** is a technological product driving features like [Web Editor](../../user/project/repository/web_editor.md), [Snippets](../../user/snippets.md), and [CI Linter](../../ci/lint.md). Editor Lite is the driving technology for any single-file editing experience across the product.
-
-Editor Lite is a thin wrapper around [the Monaco editor](https://microsoft.github.io/monaco-editor/index.html) that provides the necessary helpers and abstractions and extends Monaco using extensions.
+- [Web IDE](../../user/project/web_ide/index.md)
+- [CI Linter](../../ci/lint.md)
+- [Snippets](../../user/snippets.md)
+- [Web Editor](../../user/project/repository/web_editor.md)
## How to use Editor Lite
-Editor Lite is framework-agnostic and can be used in any application, whether it's Rails or Vue. For the convenience of integration, we have the dedicated `<editor-lite>` Vue component, but in general, the integration of Editor Lite is pretty straightforward:
+Editor Lite is framework-agnostic and can be used in any application, including both
+Rails and Vue. To help with integration, we have the dedicated `<editor-lite>`
+Vue component, but the integration of Editor Lite is generally straightforward:
1. Import Editor Lite:
-```javascript
-import EditorLite from '~/editor/editor_lite';
-```
+ ```javascript
+ import EditorLite from '~/editor/editor_lite';
+ ```
1. Initialize global editor for the view:
-```javascript
-const editor = new EditorLite({
- // Editor Options.
- // The list of all accepted options can be found at
- // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
-});
-```
+ ```javascript
+ const editor = new EditorLite({
+ // Editor Options.
+ // The list of all accepted options can be found at
+ // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
+ });
+ ```
1. Create an editor's instance:
-```javascript
-editor.createInstance({
- // Editor Lite configuration options.
-})
-```
+ ```javascript
+ editor.createInstance({
+ // Editor Lite configuration options.
+ })
+ ```
An instance of Editor Lite accepts the following configuration options:
| Option | Required? | Description |
-| ---- | ---- | ---- |
-| `el` | `true` | `HTML Node`: element on which to render the editor |
-| `blobPath` | `false` | `String`: the name of a file to render in the editor. It is used to identify the correct syntax highlighter to use with that or another file type. Can accept wildcard as in `*.js` when the actual filename isn't known or doesn't play any role |
-| `blobContent` | `false` | `String`: the initial content to be rendered in the editor |
-| `extensions` | `false` | `Array`: extensions to use in this instance |
-| `blobGlobalId` | `false` | `String`: auto-generated property.<br>**Note:** this prop might go away in the future. Do not pass `blobGlobalId` unless you know what you're doing.|
-| [Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html) | `false` | `Object(s)`: any prop outside of the list above is treated as an Editor Option for this particular instance. This way, one can override global Editor Options on the instance level. |
+| -------------- | ------- | ---- |
+| `el` | `true` | `HTML Node`: The element on which to render the editor. |
+| `blobPath` | `false` | `String`: The name of a file to render in the editor, used to identify the correct syntax highlighter to use with that file, or another file type. Can accept wildcards like `*.js` when the actual filename isn't known or doesn't play any role. |
+| `blobContent` | `false` | `String`: The initial content to render in the editor. |
+| `extensions` | `false` | `Array`: Extensions to use in this instance. |
+| `blobGlobalId` | `false` | `String`: An auto-generated property.<br>**Note:** This property may go away in the future. Do not pass `blobGlobalId` unless you know what you're doing.|
+| Editor Options | `false` | `Object(s)`: Any property outside of the list above is treated as an Editor Option for this particular instance. Use this field to override global Editor Options on the instance level. A full [index of Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html) is available. |
## API
-The editor follows the same public API as [provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) with just a few additional functions on the instance level:
+The editor uses the same public API as
+[provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html)
+with additional functions on the instance level:
-| Function | Arguments | Description
-| ----- | ----- | ----- |
-| `updateModelLanguage` | `path`: String | Updates the instance's syntax highlighting to follow the extension of the passed `path`. Available only on _instance_ level|
-| `use` | Array of objects | Array of **extensions** to apply to the instance. Accepts only the array of _objects_, which means that the extensions' ES6 modules should be fetched and resolved in your views/components before being passed to `use`. This prop is available on _instance_ (applies extension to this particular instance) and _global editor_ (applies the same extension to all instances) levels. |
+| Function | Arguments | Description
+| --------------------- | ----- | ----- |
+| `updateModelLanguage` | `path`: String | Updates the instance's syntax highlighting to follow the extension of the passed `path`. Available only on the instance level.|
+| `use` | Array of objects | Array of extensions to apply to the instance. Accepts only the array of _objects_. You must fetch the extensions' ES6 modules must be fetched and resolved in your views or components before they are passed to `use`. This property is available on _instance_ (applies extension to this particular instance) and _global editor_ (applies the same extension to all instances) levels. |
| Monaco Editor options | See [documentation](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) | Default Monaco editor options |
## Tips
1. Editor's loading state.
-Editor Lite comes with the loading state built-in, making spinners and loaders rarely needed in HTML. To benefit the built-in loading state, set the `data-editor-loading` property on the HTML element that is supposed to contain the editor. Editor Lite shows the loader automatically while it's bootstrapping.
-![Editor Lite: loading state](img/editor_lite_loading.png)
+ The loading state is built in to Editor Lite, making spinners and loaders
+ rarely needed in HTML. To benefit the built-in loading state, set the `data-editor-loading`
+ property on the HTML element that should contain the editor. When bootstrapping,
+ Editor Lite shows the loader automatically.
+
+ ![Editor Lite: loading state](img/editor_lite_loading.png)
1. Update syntax highlighting if the filename changes.
-```javascript
-// fileNameEl here is the HTML input element that contains the file name
-fileNameEl.addEventListener('change', () => {
- this.editor.updateModelLanguage(fileNameEl.value);
-});
-```
+ ```javascript
+ // fileNameEl here is the HTML input element that contains the file name
+ fileNameEl.addEventListener('change', () => {
+ this.editor.updateModelLanguage(fileNameEl.value);
+ });
+ ```
1. Get the editor's content.
-We might set up listeners on the editor for every change but it rapidly can become an expensive operation. Instead , we can get editor's content when it's needed. For example on a form's submission:
+ We may set up listeners on the editor for every change, but it rapidly can become
+ an expensive operation. Instead, get the editor's content when it's needed.
+ For example, on a form's submission:
-```javascript
-form.addEventListener('submit', () => {
- my_content_variable = this.editor.getValue();
-});
-```
+ ```javascript
+ form.addEventListener('submit', () => {
+ my_content_variable = this.editor.getValue();
+ });
+ ```
1. Performance
-Even though Editor Lite itself is extremely slim, it still depends on Monaco editor. Monaco is not an easily tree-shakeable module. Hence, every time you add Editor Lite to a view, the JavaScript bundle's size significantly increases, affecting your view's loading performance. It is recommended to import the editor on demand on those views where it is not 100% certain that the editor is needed. Or if the editor is a secondary element of the view. Loading Editor Lite on demand is no different from loading any other module:
+ Even though Editor Lite itself is extremely slim, it still depends on Monaco editor,
+ which adds weight. Every time you add Editor Lite to a view, the JavaScript bundle's
+ size significantly increases, affecting your view's loading performance. We recommend
+ you import the editor on demand if either:
-```javascript
-someActionFunction() {
- import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite').
- then(({ default: EditorLite }) => {
- const editor = new EditorLite();
- ...
- });
- ...
-}
-```
+ - You're uncertain if the view needs the editor.
+ - The editor is a secondary element of the view.
+
+ Loading Editor Lite on demand is handled like loading any other module:
+
+ ```javascript
+ someActionFunction() {
+ import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite').
+ then(({ default: EditorLite }) => {
+ const editor = new EditorLite();
+ ...
+ });
+ ...
+ }
+ ```
## Extensions
-Editor Lite has been built to provide a universal, extensible editing tool to the whole product,
-which would not depend on any particular group. Even though the Editor Lite's core is owned by
+Editor Lite provides a universal, extensible editing tool to the whole product,
+and doesn't depend on any particular group. Even though the Editor Lite's core is owned by
[Create::Editor FE Team](https://about.gitlab.com/handbook/engineering/development/dev/create-editor/),
-the main functional elements — extensions — can be owned by any group. Editor Lite extensions' main idea
-is that the core of the editor remains very slim and stable. At the same time, whatever new functionality
-is needed can be added as an extension to this core, without touching the core itself. Any group is allowed
-to build and own new editing functionality without being afraid of it being broken or overridden with
-the Editor Lite changes.
+any group can own the extensions—the main functional elements. The goal of
+Editor Lite extensions is to keep the editor's core slim and stable. Any
+needed features can be added as extensions to this core. Any group can
+build and own new editing features without worrying about changes to Editor Lite
+breaking or overriding them.
-Structurally, the complete implementation of Editor Lite could be presented as the following diagram:
+You can depend on other modules in your extensions. This organization helps keep
+the size of Editor Lite's core at bay by importing dependencies only when needed.
+
+Structurally, the complete implementation of Editor Lite can be presented as this diagram:
```mermaid
graph TD;
@@ -125,7 +150,7 @@ graph TD;
A[Editor Lite]---Z[Monaco]
```
-Technically, an extension is just an ES6 module that exports a JavaScript object:
+An extension is an ES6 module that exports a JavaScript object:
```javascript
import { Position } from 'monaco-editor';
@@ -138,10 +163,9 @@ export default {
```
-Important things to note here:
-
-- We can depend on other modules in our extensions. This organization helps keep the size of Editor Lite's core at bay by importing dependencies only when needed.
-- `this` in extension's functions refers to the current Editor Lite instance. Using `this`, you get access to the complete instance's API, such as the `setPosition()` method in this particular case.
+In the extension's functions, `this` refers to the current Editor Lite instance.
+Using `this`, you get access to the complete instance's API, such as the
+`setPosition()` method in this particular case.
### Using an existing extension
@@ -159,7 +183,11 @@ editor.use(MyExtension);
### Creating an extension
-Let's create our first Editor Lite extension. Extensions are ES6 modules exporting a basic `Object` that is used to extend Editor Lite's functionality. As a test, let's create an extension that extends Editor Lite with a new function that, when called, outputs editor's content in `alert`.
+Let's create our first Editor Lite extension. Extensions are
+[ES6 modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) exporting a
+basic `Object`, used to extend Editor Lite's features. As a test, let's
+create an extension that extends Editor Lite with a new function that, when called,
+outputs the editor's content in `alert`.
`~/my_folder/my_fancy_extension.js:`
@@ -171,7 +199,10 @@ export default {
};
```
-And that's it with our extension! Note that we're using `this` as a reference to the instance. And through it, we get access to the complete underlying [Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) like `getValue()` in this case.
+In the code example, `this` refers to the instance. By referring to the instance,
+we can access the complete underlying
+[Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html),
+which includes functions like `getValue()`.
Now let's use our extension:
@@ -191,7 +222,11 @@ someButton.addEventListener('click', () => {
});
```
-First of all, we import Editor Lite and our new extension. Then we create the editor and its instance. By default Editor Lite has no `throwContentAtMe` method. But the `editor.use(MyFancyExtension)` line brings that method to our instance. After that, we can use it any time we need it. In this case, we call it when some theoretical button has been clicked.
+First of all, we import Editor Lite and our new extension. Then we create the
+editor and its instance. By default Editor Lite has no `throwContentAtMe` method.
+But the `editor.use(MyFancyExtension)` line brings that method to our instance.
+After that, we can use it any time we need it. In this case, we call it when some
+theoretical button has been clicked.
This script would result in an alert containing the editor's content when `someButton` is clicked.
@@ -201,27 +236,28 @@ This script would result in an alert containing the editor's content when `someB
1. Performance
-Just like Editor Lite itself, any extension can be loaded on demand to not harm loading performance of the views:
+ Just like Editor Lite itself, any extension can be loaded on demand to not harm
+ loading performance of the views:
-```javascript
-const EditorPromise = import(
- /* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite'
-);
-const MarkdownExtensionPromise = import('~/editor/editor_markdown_ext');
-
-Promise.all([EditorPromise, MarkdownExtensionPromise])
- .then(([{ default: EditorLite }, { default: MarkdownExtension }]) => {
- const editor = new EditorLite().createInstance({
- ...
- });
- editor.use(MarkdownExtension);
- });
-```
+ ```javascript
+ const EditorPromise = import(
+ /* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite'
+ );
+ const MarkdownExtensionPromise = import('~/editor/editor_markdown_ext');
+
+ Promise.all([EditorPromise, MarkdownExtensionPromise])
+ .then(([{ default: EditorLite }, { default: MarkdownExtension }]) => {
+ const editor = new EditorLite().createInstance({
+ ...
+ });
+ editor.use(MarkdownExtension);
+ });
+ ```
1. Using multiple extensions
-Just pass the array of extensions to your `use` method:
+ Just pass the array of extensions to your `use` method:
-```javascript
-editor.use([FileTemplateExtension, MyFancyExtension]);
-```
+ ```javascript
+ editor.use([FileTemplateExtension, MyFancyExtension]);
+ ```
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index a53d9fee029..2e812d9fa0a 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -63,6 +63,7 @@ see [Immutability and cache updates](#immutability-and-cache-updates) for more i
If you use VS Code, the Apollo GraphQL extension supports autocompletion in `.graphql` files. To set up
the GraphQL extension, follow these steps:
+1. Generate the schema: `bundle exec rake gitlab:graphql:schema:dump`
1. Add an `apollo.config.js` file to the root of your `gitlab` local directory.
1. Populate the file with the following content:
@@ -72,7 +73,7 @@ the GraphQL extension, follow these steps:
includes: ['./app/assets/javascripts/**/*.graphql', './ee/app/assets/javascripts/**/*.graphql'],
service: {
name: 'GitLab',
- localSchemaFile: './doc/api/graphql/reference/gitlab_schema.graphql',
+ localSchemaFile: './tmp/tests/graphql/gitlab_schema.graphql',
},
},
};
@@ -422,7 +423,7 @@ query getAuthorData($authorNameEnabled: Boolean = false) {
```
Then in the Vue (or JavaScript) call to the query we can pass in our feature flag. This feature
-flag needs to be already set up correctly. See the [feature flag documentation](../feature_flags/development.md)
+flag needs to be already set up correctly. See the [feature flag documentation](../feature_flags/index.md)
for the correct way to do this.
```javascript
@@ -768,6 +769,23 @@ export default {
### Testing
+#### Generating the GraphQL schema
+
+Some of our tests load the schema JSON files. To generate these files, run:
+
+```shell
+bundle exec rake gitlab:graphql:schema:dump
+```
+
+You should run this task after pulling from upstream, or when rebasing your
+branch. This is run automatically as part of `gdk update`.
+
+NOTE:
+If you use the RubyMine IDE, and have marked the `tmp` directory as
+"Excluded", you should "Mark Directory As -> Not Excluded" for
+`gitlab/tmp/tests/graphql`. This will allow the **JS GraphQL** plugin to
+automatically find and index the schema.
+
#### Mocking response as component data
<!-- vale gitlab.Spelling = NO -->
@@ -1093,6 +1111,45 @@ it('calls a mutation with correct parameters and reorders designs', async () =>
});
```
+To mock multiple query response states, success and failure, Apollo Client's native retry behavior can combine with Jest's mock functions to create a series of responses. These do not need to be advanced manually, but they do need to be awaited in specific fashion.
+
+```javascript
+describe('when query times out', () => {
+ const advanceApolloTimers = async () => {
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+ await wrapper.vm.$nextTick();
+ };
+
+ beforeEach(async () => {
+ const failSucceedFail = jest
+ .fn()
+ .mockResolvedValueOnce({ errors: [{ message: 'timeout' }] })
+ .mockResolvedValueOnce(mockPipelineResponse)
+ .mockResolvedValueOnce({ errors: [{ message: 'timeout' }] });
+
+ createComponentWithApollo(failSucceedFail);
+ await wrapper.vm.$nextTick();
+ });
+
+ it('shows correct errors and does not overwrite populated data when data is empty', async () => {
+ /* fails at first, shows error, no data yet */
+ expect(getAlert().exists()).toBe(true);
+ expect(getGraph().exists()).toBe(false);
+
+ /* succeeds, clears error, shows graph */
+ await advanceApolloTimers();
+ expect(getAlert().exists()).toBe(false);
+ expect(getGraph().exists()).toBe(true);
+
+ /* fails again, alert retuns but data persists */
+ await advanceApolloTimers();
+ expect(getAlert().exists()).toBe(true);
+ expect(getGraph().exists()).toBe(true);
+ });
+});
+```
+
#### Testing `@client` queries
##### Using mock resolvers
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index 711c6a5f875..1315520342e 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -104,7 +104,7 @@ See the relevant style guides for our guidelines and for information on linting:
- [JavaScript](style/javascript.md). Our guide is based on
the excellent [Airbnb](https://github.com/airbnb/javascript) style guide with a few small
changes.
-- [SCSS](style/scss.md): our SCSS conventions which are enforced through [`scss-lint`](https://github.com/sds/scss-lint).
+- [SCSS](style/scss.md): [our SCSS conventions](https://gitlab.com/gitlab-org/frontend/gitlab-stylelint-config) which are enforced through [`stylelint`](https://stylelint.io).
- [HTML](style/html.md). Guidelines for writing HTML code consistent with the rest of the codebase.
- [Vue](style/vue.md). Guidelines and conventions for Vue code may be found here.
diff --git a/doc/development/fe_guide/keyboard_shortcuts.md b/doc/development/fe_guide/keyboard_shortcuts.md
index e50e9ec65df..aab252da305 100644
--- a/doc/development/fe_guide/keyboard_shortcuts.md
+++ b/doc/development/fe_guide/keyboard_shortcuts.md
@@ -33,9 +33,10 @@ Mousetrap.bind(keysFor(TOGGLE_PERFORMANCE_BAR), togglePerformanceBar);
## Shortcut customization
`keybindings.js` stores keyboard shortcut customizations as a JSON string in
-`localStorage`. When `keybindings.js` is first imported, it fetches any
-customizations from `localStorage` and merges these customizations into the
-default set of keybindings. There is no UI to edit these customizations.
+`localStorage`. When `keysFor` is called, it uses the provided command object's
+`id` to lookup any customizations found in `localStorage` and returns the custom
+keybindings, or the default keybindings if the command has not been customized.
+There is no UI to edit these customizations.
## Adding new shortcuts
@@ -44,27 +45,33 @@ developers are encouraged to build _lots_ of keyboard shortcuts into GitLab.
Shortcuts that are less likely to be used should be
[disabled](#disabling-shortcuts) by default.
-To add a new shortcut, define and export a new command string in
+To add a new shortcut, define and export a new command object in
`keybindings.js`:
```javascript
-export const MAKE_COFFEE = 'foodAndBeverage.makeCoffee';
+export const MAKE_COFFEE = {
+ id: 'foodAndBeverage.makeCoffee',
+ description: s__('KeyboardShortcuts|Make coffee'),
+ defaultKeys: ['mod+shift+c'],
+};
```
-Next, add a new command definition under the appropriate group in the
-`keybindingGroups` array:
+Next, add a new command to the appropriate keybinding group object:
```javascript
-{
- description: s__('KeyboardShortcuts|Make coffee'),
- command: MAKE_COFFEE,
- defaultKeys: ['mod+shift+c'],
- customKeys: customizations[MAKE_COFFEE],
+const COFFEE_GROUP = {
+ id: 'foodAndBeverage',
+ name: s__('KeyboardShortcuts|Food and Beverage'),
+ keybindings: [
+ MAKE_ESPRESSO,
+ MAKE_LATTE,
+ MAKE_COFFEE
+ ];
}
```
Finally, in the application code, import the `keysFor` function and the new
-command and bind the shortcut to the handler using Mousetrap:
+command object and bind the shortcut to the handler using Mousetrap:
```javascript
import { keysFor, MAKE_COFFEE } from '~/behaviors/shortcuts/keybindings'
@@ -81,16 +88,34 @@ shortcut to an empty array `[]`. For example, to introduce a new shortcut that
is disabled by default, a command can be defined like this:
```javascript
-export const MAKE_MOCHA = 'foodAndBeverage.makeMocha';
-
-{
+export const MAKE_MOCHA = {
+ id: 'foodAndBeverage.makeMocha',
description: s__('KeyboardShortcuts|Make a mocha'),
- command: MAKE_MOCHA,
defaultKeys: [],
- customKeys: customizations[MAKE_MOCHA],
-}
+};
```
+## Making shortcuts non-customizable
+
+Occasionally, it's important that a keyboard shortcut _not_ be customizable
+(although this should be a rare occurrence).
+
+In this case, a shortcut can be defined with `customizable: false`, which
+disables customization of the keybinding:
+
+```javascript
+export const MAKE_AMERICANO = {
+ id: 'foodAndBeverage.makeAmericano',
+ description: s__('KeyboardShortcuts|Make an Americano'),
+ defaultKeys: ['mod+shift+a'],
+
+ // this disables customization of this shortcut
+ customizable: false
+};
+```
+
+This shortcut will always be bound to its `defaultKeys`.
+
## Make cross-platform shortcuts
It's difficult to make shortcuts that work well in all platforms and browsers.
diff --git a/doc/development/fe_guide/security.md b/doc/development/fe_guide/security.md
index df4613d521d..1a6646df877 100644
--- a/doc/development/fe_guide/security.md
+++ b/doc/development/fe_guide/security.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Resources
-[Mozilla’s HTTP Observatory CLI](https://github.com/mozilla/http-observatory-cli) and
+[Mozilla’s HTTP Observatory CLI](https://github.com/mozilla/http-observatory-cli) and
[Qualys SSL Labs Server Test](https://www.ssllabs.com/ssltest/analyze.html) are good resources for finding
potential problems and ensuring compliance with security best practices.
@@ -105,3 +105,9 @@ element.appendChild(sanitize(unsafeHtml));
This `sanitize` function takes the same configuration as the
original.
+
+### Fixing Security Issues
+
+When refactoring old code, it's important that we don't accidentally remove specs written to catch security issues which might still be relevant.
+
+We should mark specs with `#security` in either the `describe` or `it` blocks to communicate to the engineer reading the code that by removing these specs could have severe consequences down the road, and you are removing code that could catch a reintroduction of a security issue.
diff --git a/doc/development/fe_guide/style/html.md b/doc/development/fe_guide/style/html.md
index e53686de1a0..18f72a9655c 100644
--- a/doc/development/fe_guide/style/html.md
+++ b/doc/development/fe_guide/style/html.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# HTML style guide
+See also our [accessibility page](../accessibility.md).
+
## Semantic elements
[Semantic elements](https://developer.mozilla.org/en-US/docs/Glossary/Semantics) are HTML tags that
@@ -52,30 +54,27 @@ Button tags requires a `type` attribute according to the [W3C HTML specification
<button type="button"></button>
```
-### Button role
-
-If an HTML element has an `onClick` handler but is not a button, it should have `role="button"`. This is [more accessible](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role).
-
-```html
-// bad
-<div onClick="doSomething"></div>
-
-// good
-<div role="button" onClick="doSomething"></div>
-```
-
## Links
### Blank target
+Avoid forcing links to open in a new window as this reduces the control the user has over the link.
+However, it might be a good idea to use a blank target when replacing the current page with
+the link makes the user lose content or progress.
+
Use `rel="noopener noreferrer"` whenever your links open in a new window, i.e. `target="_blank"`. This prevents a security vulnerability [documented by JitBit](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/).
+When using `gl-link`, using `target="_blank"` is sufficient as it automatically adds `rel="noopener noreferrer"` to the link.
+
```html
// bad
<a href="url" target="_blank"></a>
// good
<a href="url" target="_blank" rel="noopener noreferrer"></a>
+
+// good
+<gl-link href="url" target="_blank"></gl-link>
```
### Fake links
diff --git a/doc/development/fe_guide/style/index.md b/doc/development/fe_guide/style/index.md
index 89a3d874184..f3da78647be 100644
--- a/doc/development/fe_guide/style/index.md
+++ b/doc/development/fe_guide/style/index.md
@@ -16,7 +16,7 @@ changes.
## SCSS style guide
-Our [SCSS conventions](scss.md) which are enforced through [`scss-lint`](https://github.com/sds/scss-lint).
+Our [SCSS conventions](scss.md) which are enforced through [`stylelint`](https://stylelint.io).
## HTML style guide
diff --git a/doc/development/fe_guide/style/javascript.md b/doc/development/fe_guide/style/javascript.md
index 5c35b880eab..334372af1f4 100644
--- a/doc/development/fe_guide/style/javascript.md
+++ b/doc/development/fe_guide/style/javascript.md
@@ -14,7 +14,7 @@ In addition to the style guidelines set by Airbnb, we also have a few specific r
listed below.
NOTE:
-You can run ESLint locally by running `yarn eslint`
+You can run ESLint locally by running `yarn run lint:eslint:all` or `yarn run lint:eslint $PATH_TO_FILE`.
## Avoid forEach
@@ -294,3 +294,24 @@ Strive to write many small pure functions and minimize where mutations occur
var c = pureFunction(values.foo);
```
+
+## Export constants as primitives
+
+Prefer exporting constant primitives with a common namespace over exporting objects. This allows for better compile-time reference checks and helps to avoid accidential `undefined`s at runtime. In addition, it helps in reducing bundle sizes.
+
+Only export the constants as a collection (array, or object) when there is a need to iterate over them, for instance, for a prop validator.
+
+ ```javascript
+ // bad
+ export const VARIANT = {
+ WARNING: 'warning',
+ ERROR: 'error',
+ };
+
+ // good
+ export const VARIANT_WARNING = 'warning';
+ export const VARIANT_ERROR = 'error';
+
+ // good, if the constants need to be iterated over
+ export const VARIANTS = [VARIANT_WARNING, VARIANT_ERROR];
+ ```
diff --git a/doc/development/fe_guide/style/scss.md b/doc/development/fe_guide/style/scss.md
index 1d0b3c2b7fc..c0817626360 100644
--- a/doc/development/fe_guide/style/scss.md
+++ b/doc/development/fe_guide/style/scss.md
@@ -99,7 +99,7 @@ ul {
// Best
// prefer an existing utility class over adding existing styles
-```0
+```
Class names are also preferable to IDs. Rules that use IDs
are not-reusable, as there can only be one affected element on
@@ -132,16 +132,14 @@ Before adding a new variable for a color or a size, guarantee:
## Linting
-We use [SCSS Lint](https://github.com/sds/scss-lint) to check for style guide conformity. It uses the
-ruleset in `.scss-lint.yml`, which is located in the home directory of the
-project.
+We use [stylelint](https://stylelint.io) to check for style guide conformity. It uses the
+ruleset in `.stylelintrc` and rules from [our SCSS configuration](https://gitlab.com/gitlab-org/frontend/gitlab-stylelint-config). `.stylelintrc` is located in the home directory of the project.
-To check if any warnings are produced by your changes, run `rake
-scss_lint` in the GitLab directory. SCSS Lint also runs in GitLab CI/CD to
+To check if any warnings are produced by your changes, run `yarn lint:stylelint` in the GitLab directory. Stylelint also runs in GitLab CI/CD to
catch any warnings.
If the Rake task is throwing warnings you don't understand, SCSS Lint's
-documentation includes [a full list of their linters](https://github.com/sds/scss-lint/blob/master/lib/scss_lint/linter/README.md).
+documentation includes [a full list of their rules](https://stylelint.io/user-guide/rules/list).
### Fixing issues
diff --git a/doc/development/fe_guide/style/vue.md b/doc/development/fe_guide/style/vue.md
index 0288238a9e5..d62145b4a4c 100644
--- a/doc/development/fe_guide/style/vue.md
+++ b/doc/development/fe_guide/style/vue.md
@@ -432,41 +432,7 @@ must be unique. It's advised to use `kebab-case` namespaces.
Useful links:
1. [`key`](https://vuejs.org/v2/guide/list.html#key)
-1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential )
-
-## Vue and Bootstrap
-
-1. Tooltips: Do not rely on `has-tooltip` class name for Vue components
-
- ```html
- // bad
- <span
- class="has-tooltip"
- title="Some tooltip text">
- Text
- </span>
-
- // good
- <span
- v-tooltip
- title="Some tooltip text">
- Text
- </span>
- ```
-
-1. Tooltips: When using a tooltip, include the tooltip directive, `./app/assets/javascripts/vue_shared/directives/tooltip.js`
-
-1. Don't change `data-original-title`.
-
- ```html
- // bad
- <span data-original-title="tooltip text">Foo</span>
-
- // good
- <span title="tooltip text">Foo</span>
-
- $('span').tooltip('_fixTitle');
- ```
+1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential)
## Vue testing
diff --git a/doc/development/fe_guide/tooling.md b/doc/development/fe_guide/tooling.md
index 7a2d8fccdbf..1ab97d8a1f5 100644
--- a/doc/development/fe_guide/tooling.md
+++ b/doc/development/fe_guide/tooling.md
@@ -17,7 +17,7 @@ This section describes yarn scripts that are available to validate and apply aut
To check all staged files (based on `git diff`) with ESLint, run the following script:
```shell
-yarn eslint-staged
+yarn run lint:eslint:staged
```
A list of problems found are logged to the console.
@@ -25,15 +25,21 @@ A list of problems found are logged to the console.
To apply automatic ESLint fixes to all staged files (based on `git diff`), run the following script:
```shell
-yarn eslint-staged-fix
+yarn run lint:eslint:staged:fix
```
If manual changes are required, a list of changes are sent to the console.
+To check a specific file in the repository with ESLINT, run the following script (replacing $PATH_TO_FILE):
+
+```shell
+yarn run lint:eslint $PATH_TO_FILE
+```
+
To check **all** files in the repository with ESLint, run the following script:
```shell
-yarn eslint
+yarn run lint:eslint:all
```
A list of problems found are logged to the console.
@@ -41,7 +47,7 @@ A list of problems found are logged to the console.
To apply automatic ESLint fixes to **all** files in the repository, run the following script:
```shell
-yarn eslint-fix
+yarn run lint:eslint:all:fix
```
If manual changes are required, a list of changes are sent to the console.
@@ -98,6 +104,57 @@ When declaring multiple globals, always use one `/* global [name] */` line per v
/* global jQuery */
```
+### Deprecating functions with `import/no-deprecated`
+
+Our `@gitlab/eslint-plugin` Node module contains the [`eslint-plugin-import`](https://gitlab.com/gitlab-org/frontend/eslint-plugin) package.
+
+We can use the [`import/no-deprecated`](https://github.com/benmosher/eslint-plugin-import/blob/HEAD/docs/rules/no-deprecated.md) rule to deprecate functions using a JSDoc block with a `@deprecated` tag:
+
+```javascript
+/**
+ * Convert search query into an object
+ *
+ * @param {String} query from "document.location.search"
+ * @param {Object} options
+ * @param {Boolean} options.gatherArrays - gather array values into an Array
+ * @returns {Object}
+ *
+ * ex: "?one=1&two=2" into {one: 1, two: 2}
+ * @deprecated Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information
+ */
+export function queryToObject(query, options = {}) {
+ ...
+}
+```
+
+It is strongly encouraged that you:
+
+- Put in an **alternative path for developers** looking to use this function.
+- **Provide a link to the issue** that tracks the migration process.
+
+NOTE:
+Uses are detected if you import the deprecated function into another file. They are not detected when the function is used in the same file.
+
+Running `$ yarn eslint` after this will give us the list of deprecated usages:
+
+```shell
+$ yarn eslint
+
+./app/assets/javascripts/issuable_form.js
+ 9:10 error Deprecated: Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information import/no-deprecated
+ 33:23 error Deprecated: Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information import/no-deprecated
+...
+```
+
+Grep for disabled cases of this rule to generate a working list to create issues from, so you can track the effort of removing deprecated uses:
+
+```shell
+$ grep "eslint-disable.*import/no-deprecated" -r .
+
+./app/assets/javascripts/issuable_form.js:import { queryToObject, objectToQuery } from './lib/utils/url_utility'; // eslint-disable-line import/no-deprecate
+./app/assets/javascripts/issuable_form.js: // eslint-disable-next-line import/no-deprecated
+```
+
## Formatting with Prettier
> Support for `.graphql` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227280) in GitLab 13.2.
@@ -125,44 +182,28 @@ Please take care that you only let Prettier format the same file types as the gl
The following yarn scripts are available to do global formatting:
```shell
-yarn prettier-staged-save
+yarn run lint:prettier:staged:fix
```
Updates all staged files (based on `git diff`) with Prettier and saves the needed changes.
```shell
-yarn prettier-staged
+yarn run lint:prettier:staged
```
Checks all staged files (based on `git diff`) with Prettier and log which files would need manual updating to the console.
```shell
-yarn prettier-all
+yarn run lint:prettier
```
Checks all files with Prettier and logs which files need manual updating to the console.
```shell
-yarn prettier-all-save
-```
-
-Formats all files in the repository with Prettier. (This should only be used to test global rule updates otherwise you would end up with huge MR's).
-
-The source of these Yarn scripts can be found in `/scripts/frontend/prettier.js`.
-
-#### Scripts during Conversion period
-
-```shell
-node ./scripts/frontend/prettier.js check-all ./vendor/
-```
-
-This iterates over all files in a specific folder, and checks them.
-
-```shell
-node ./scripts/frontend/prettier.js save-all ./vendor/
+yarn run lint:prettier:fix
```
-This iterates over all files in a specific folder and saves them.
+Formats all files in the repository with Prettier.
### VSCode Settings
diff --git a/doc/development/fe_guide/troubleshooting.md b/doc/development/fe_guide/troubleshooting.md
index abaf9cd68c7..250fe5106d3 100644
--- a/doc/development/fe_guide/troubleshooting.md
+++ b/doc/development/fe_guide/troubleshooting.md
@@ -39,3 +39,30 @@ See [this video](https://youtu.be/-BkEhghP-kM) for an in-depth overview and inve
```
Please note that `toMatchObject` actually changes the nature of the assertion and won't fail if some items are **missing** from the expectation.
+
+### Script issues
+
+## `core-js` errors when running scripts within the GitLab repository
+
+The following command assumes you've set up the GitLab repository in the
+`~/workspace/gdk` directory. When running scripts within the GitLab repository,
+such as code transformations, you might run into issues with `core-js` like this:
+
+```shell
+~/workspace/gdk/gitlab/node_modules/core-js/modules/es.global-this.js:7
+$({
+^
+TypeError: $ is not a function
+ at Object.<anonymous> (~/workspace/gdk/gitlab/node_modules/core-js/modules/es.global-this.js:6:1)
+ at Module._compile (internal/modules/cjs/loader.js:1063:30)
+ at Module._compile (~/workspace/gdk/gitlab/node_modules/pirates/lib/index.js:99:24)
+ at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
+ at Object.newLoader [as .js] (~/workspace/gdk/gitlab/node_modules/pirates/lib/index.js:104:7)
+ at Module.load (internal/modules/cjs/loader.js:928:32)
+ at Function.Module._load (internal/modules/cjs/loader.js:769:14)
+ at Module.require (internal/modules/cjs/loader.js:952:19)
+ at require (internal/modules/cjs/helpers.js:88:18)
+ at Object.<anonymous> (~/workspace/gdk/gitlab/node_modules/core-js/modules/esnext.global-this.js:2:1)
+```
+
+**Remedy - Try moving the script into a separate repository and point to it to files in the GitLab repository**
diff --git a/doc/development/fe_guide/vue.md b/doc/development/fe_guide/vue.md
index 5b902e1b16e..220a4a107aa 100644
--- a/doc/development/fe_guide/vue.md
+++ b/doc/development/fe_guide/vue.md
@@ -237,6 +237,9 @@ Each Vue component has a unique output. This output is always present in the ren
Although each method of a Vue component can be tested individually, our goal is to test the output
of the render function, which represents the state at all times.
+Visit the [Vue testing guide](https://vuejs.org/v2/guide/testing.html#Unit-Testing) for help
+testing the rendered output.
+
Here's an example of a well structured unit test for [this Vue component](#appendix---vue-component-subject-under-test):
```javascript
@@ -331,11 +334,6 @@ describe('~/todos/app.vue', () => {
});
```
-### Test the component's output
-
-The main return value of a Vue component is the rendered output. In order to test the component we
-need to test the rendered output. Visit the [Vue testing guide](https://vuejs.org/v2/guide/testing.html#Unit-Testing).
-
### Child components
1. Test any directive that defines if/how child component is rendered (for example, `v-if` and `v-for`).
diff --git a/doc/development/fe_guide/vuex.md b/doc/development/fe_guide/vuex.md
index cc1d9ccab77..d44ab64ae5d 100644
--- a/doc/development/fe_guide/vuex.md
+++ b/doc/development/fe_guide/vuex.md
@@ -440,12 +440,11 @@ components, we need to include the store and provide the correct state:
//component_spec.js
import Vue from 'vue';
import Vuex from 'vuex';
-import { mount, createLocalVue } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import { createStore } from './store';
import Component from './component.vue'
-const localVue = createLocalVue();
-localVue.use(Vuex);
+Vue.use(Vuex);
describe('component', () => {
let store;
@@ -455,7 +454,6 @@ describe('component', () => {
store = createStore();
wrapper = mount(Component, {
- localVue,
store,
});
};
@@ -483,6 +481,11 @@ describe('component', () => {
});
```
+Some test files may still use the
+[deprecated `createLocalVue` function](https://gitlab.com/gitlab-org/gitlab/-/issues/220482)
+from `@vue/test-utils` and `localVue.use(Vuex)`. This is unnecessary, and should be
+avoided or removed when possible.
+
### Two way data binding
When storing form data in Vuex, it is sometimes necessary to update the value stored. The store
diff --git a/doc/development/fe_guide/widgets.md b/doc/development/fe_guide/widgets.md
new file mode 100644
index 00000000000..02876afe597
--- /dev/null
+++ b/doc/development/fe_guide/widgets.md
@@ -0,0 +1,143 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Widgets
+
+Frontend widgets are standalone Vue applications or Vue component trees that can be added on a page
+to handle a part of the functionality.
+
+Good examples of widgets are [sidebar assignees](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue) and [sidebar confidentiality](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue).
+
+When building a widget, we should follow a few principles described below.
+
+## Vue Apollo is required
+
+All widgets should use the same stack (Vue + Apollo Client).
+To make it happen, we must add Vue Apollo to the application root (if we use a widget
+as a component) or provide it directly to a widget. For sidebar widgets, use the
+[sidebar Apollo Client and Apollo Provider](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/graphql.js):
+
+```javascript
+import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
+import { apolloProvider } from '~/sidebar/graphql';
+
+function mountConfidentialComponent() {
+ new Vue({
+ apolloProvider,
+ components: {
+ SidebarConfidentialityWidget,
+ },
+ /* ... */
+ });
+}
+```
+
+## Required injections
+
+All editable sidebar widgets should use [`SidebarEditableItem`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue) to handle collapsed/expanded state. This component requires the `canUpdate` property provided in the application root.
+
+## No global state mappings
+
+We aim to make widgets as reusable as possible. That's why we should avoid adding any external state
+bindings to widgets or to their child components. This includes Vuex mappings and mediator stores.
+
+## Widget's responsibility
+
+A widget is responsible for fetching and updating an entity it's designed for (assignees, iterations, and so on).
+This means a widget should **always** fetch data (if it's not in Apollo cache already).
+Even if we provide an initial value to the widget, it should perform a GraphQL query in the background
+to be stored in Apollo cache.
+
+Eventually, when we have an Apollo Client cache as a global application state, we won't need to pass
+initial data to the sidebar widget. Then it will be capable of retrieving the data from the cache.
+
+## Using GraphQL queries and mutations
+
+We need widgets to be flexible to work with different entities (epics, issues, merge requests, and so on).
+Because we need different GraphQL queries and mutations for different sidebars, we create
+[_mappings_](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/constants.js#L9):
+
+```javascript
+export const assigneesQueries = {
+ [IssuableType.Issue]: {
+ query: getIssueParticipants,
+ mutation: updateAssigneesMutation,
+ },
+ [IssuableType.MergeRequest]: {
+ query: getMergeRequestParticipants,
+ mutation: updateMergeRequestParticipantsMutation,
+ },
+};
+```
+
+To handle the same logic for query updates, we **alias** query fields. For example:
+
+- `group` or `project` become `workspace`
+- `issue`, `epic`, or `mergeRequest` become `issuable`
+
+Unfortunately, Apollo assigns aliased fields a typename of `undefined`, so we need to fetch `__typename` explicitly:
+
+```plaintext
+query issueConfidential($fullPath: ID!, $iid: String) {
+ workspace: project(fullPath: $fullPath) {
+ __typename
+ issuable: issue(iid: $iid) {
+ __typename
+ id
+ confidential
+ }
+ }
+}
+```
+
+## Communication with other Vue applications
+
+If we need to communicate the changes of the widget state (for example, after successful mutation)
+to the parent application, we should emit an event:
+
+```javascript
+updateAssignees(assigneeUsernames) {
+ return this.$apollo
+ .mutate({
+ mutation: this.$options.assigneesQueries[this.issuableType].mutation,
+ variables: {...},
+ })
+ .then(({ data }) => {
+ const assignees = data.issueSetAssignees?.issue?.assignees?.nodes || [];
+ this.$emit('assignees-updated', assignees);
+ })
+}
+```
+
+Sometimes, we want to listen to the changes on the different Vue application like `NotesApp`.
+In this case, we can use a renderless component that imports a client and listens to a certain query:
+
+```javascript
+import { fetchPolicies } from '~/lib/graphql';
+import { confidentialityQueries } from '~/sidebar/constants';
+import { defaultClient as gqlClient } from '~/sidebar/graphql';
+
+created() {
+ if (this.issuableType !== IssuableType.Issue) {
+ return;
+ }
+
+ gqlClient
+ .watchQuery({
+ query: confidentialityQueries[this.issuableType].query,
+ variables: {...},
+ fetchPolicy: fetchPolicies.CACHE_ONLY,
+ })
+ .subscribe((res) => {
+ this.setConfidentiality(issuable.confidential);
+ });
+},
+methods: {
+ ...mapActions(['setConfidentiality']),
+},
+```
+
+[View an example of such a component.](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/notes/components/sidebar_subscription.vue)
diff --git a/doc/development/feature_flags/controls.md b/doc/development/feature_flags/controls.md
index 21ac152c469..fc327a2defc 100644
--- a/doc/development/feature_flags/controls.md
+++ b/doc/development/feature_flags/controls.md
@@ -36,7 +36,7 @@ easier to measure the impact of both separately.
The GitLab feature library (using
[Flipper](https://github.com/jnunemaker/flipper), and covered in the [Feature
-Flags process](process.md) guide) supports rolling out changes to a percentage of
+Flags process](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle) guide) supports rolling out changes to a percentage of
time to users. This in turn can be controlled using [GitLab ChatOps](../../ci/chatops/index.md).
For an up to date list of feature flag commands please see [the source
@@ -240,7 +240,7 @@ To disable a feature flag that has been enabled for a specific project you can r
/chatops run feature set --group=gitlab-org some_feature false
```
-You cannot selectively disable feature flags for a specific project/group/user without applying a [specific method of implementing](development.md#selectively-disable-by-actor) the feature flags.
+You cannot selectively disable feature flags for a specific project/group/user without applying a [specific method of implementing](index.md#selectively-disable-by-actor) the feature flags.
### Feature flag change logging
@@ -276,17 +276,19 @@ and reduces confidence in our testing suite covering all possible combinations.
Additionally, a feature flag overwritten in some of the environments can result
in undefined and untested system behavior.
-To remove a feature flag:
+To remove a feature flag, open **one merge request** to make the changes. In the MR:
-1. Open a new merge request with the ~"feature flag" label so
- release managers are aware the changes are hidden behind a feature flag.
+1. Add the ~"feature flag" label so release managers are aware the changes are hidden behind a feature flag.
1. If the merge request has to be picked into a stable branch, add the
appropriate `~"Pick into X.Y"` label, for example `~"Pick into 13.0"`.
- See [the feature flag process](process.md#including-a-feature-behind-feature-flag-in-the-final-release)
+ See [the feature flag process](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle#including-a-feature-behind-feature-flag-in-the-final-release)
for further details.
-1. Remove all references to the feature flag from the codebase.
+1. Remove all references to the feature flag from the codebase, including tests.
1. Remove the YAML definition for the feature from the repository.
-1. Clean up the feature flag from all environments with `/chatops run feature delete some_feature`.
+
+Once the above MR has been merged, you should:
+
+1. [Clean up the feature flag from all environments](#cleanup-chatops) with `/chatops run feature delete some_feature`.
1. Close the rollout issue for the feature flag after the feature flag is removed from the codebase.
### Cleanup ChatOps
diff --git a/doc/development/feature_flags/development.md b/doc/development/feature_flags/development.md
index 0cdfa3e68d7..79efd6d5502 100644
--- a/doc/development/feature_flags/development.md
+++ b/doc/development/feature_flags/development.md
@@ -1,593 +1,7 @@
---
-type: reference, dev
-stage: none
-group: Development
-info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
+redirect_to: 'index.md'
---
-# Developing with feature flags
-
-This document provides guidelines on how to use feature flags
-in the GitLab codebase to conditionally enable features
-and test them.
-
-Features that are developed and merged behind a feature flag
-should not include a changelog entry. The entry should be added either in the merge
-request removing the feature flag or the merge request where the default value of
-the feature flag is set to enabled. If the feature contains any database migrations, it
-*should* include a changelog entry for the database changes.
-
-WARNING:
-All newly-introduced feature flags should be [disabled by default](process.md#feature-flags-in-gitlab-development).
-
-NOTE:
-This document is the subject of continued work as part of an epic to [improve internal usage of Feature Flags](https://gitlab.com/groups/gitlab-org/-/epics/3551). Raise any suggestions as new issues and attach them to the epic.
-
-## Risk of a broken master (main) branch
-
-Feature flags **must** be used in the MR that introduces them. Not doing so causes a
-[broken master](https://about.gitlab.com/handbook/engineering/workflow/#broken-master) scenario due
-to the `rspec:feature-flags` job that only runs on the `master` branch.
-
-## Types of feature flags
-
-Choose a feature flag type that matches the expected usage.
-
-### `development` type
-
-`development` feature flags are short-lived feature flags,
-used so that unfinished code can be deployed in production.
-
-A `development` feature flag should have a rollout issue,
-ideally created using the [Feature Flag Roll Out template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md).
-
-This is the default type used when calling `Feature.enabled?`.
-
-### `ops` type
-
-`ops` feature flags are long-lived feature flags that control operational aspects
-of GitLab product behavior. For example, feature flags that disable features that might
-have a performance impact, like special Sidekiq worker behavior.
-
-`ops` feature flags likely do not have rollout issues, as it is hard to
-predict when they are enabled or disabled.
-
-To use `ops` feature flags, you must append `type: :ops` to `Feature.enabled?`
-invocations:
-
-```ruby
-# Check if feature flag is enabled
-Feature.enabled?(:my_ops_flag, project, type: :ops)
-
-# Check if feature flag is disabled
-Feature.disabled?(:my_ops_flag, project, type: :ops)
-
-# Push feature flag to Frontend
-push_frontend_feature_flag(:my_ops_flag, project, type: :ops)
-```
-
-### `experiment` type
-
-`experiment` feature flags are used for A/B testing on GitLab.com.
-
-An `experiment` feature flag should conform to the same standards as a `development` feature flag,
-although the interface has some differences. More information can be found in the [experiment guide](../experiment_guide/index.md).
-
-## Feature flag definition and validation
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229161) in GitLab 13.3.
-
-During development (`RAILS_ENV=development`) or testing (`RAILS_ENV=test`) all feature flag usage is being strictly validated.
-
-This process is meant to ensure consistent feature flag usage in the codebase. All feature flags **must**:
-
-- Be known. Only use feature flags that are explicitly defined.
-- Not be defined twice. They have to be defined either in FOSS or EE, but not both.
-- Use a valid and consistent `type:` across all invocations.
-- Use the same `default_enabled:` across all invocations.
-- Have an owner.
-
-All feature flags known to GitLab are self-documented in YAML files stored in:
-
-- [`config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/feature_flags)
-- [`ee/config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/feature_flags)
-
-Each feature flag is defined in a separate YAML file consisting of a number of fields:
-
-| Field | Required | Description |
-|---------------------|----------|----------------------------------------------------------------|
-| `name` | yes | Name of the feature flag. |
-| `type` | yes | Type of feature flag. |
-| `default_enabled` | yes | The default state of the feature flag that is strictly validated, with `default_enabled:` passed as an argument. |
-| `introduced_by_url` | no | The URL to the Merge Request that introduced the feature flag. |
-| `rollout_issue_url` | no | The URL to the Issue covering the feature flag rollout. |
-| `group` | no | The [group](https://about.gitlab.com/handbook/product/categories/#devops-stages) that owns the feature flag. |
-
-NOTE:
-All validations are skipped when running in `RAILS_ENV=production`.
-
-## Create a new feature flag
-
-The GitLab codebase provides [`bin/feature-flag`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/bin/feature-flag),
-a dedicated tool to create new feature flag definitions.
-The tool asks various questions about the new feature flag, then creates
-a YAML definition in `config/feature_flags` or `ee/config/feature_flags`.
-
-Only feature flags that have a YAML definition file can be used when running the development or testing environments.
-
-```shell
-$ bin/feature-flag my_feature_flag
->> Specify the group introducing the feature flag, like `group::apm`:
-?> group::memory
-
->> URL of the MR introducing the feature flag (enter to skip):
-?> https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
-
->> Open this URL and fill in the rest of the details:
-https://gitlab.com/gitlab-org/gitlab/-/issues/new?issue%5Btitle%5D=%5BFeature+flag%5D+Rollout+of+%60test-flag%60&issuable_template=Feature+Flag+Roll+Out
-
->> URL of the rollout issue (enter to skip):
-?> https://gitlab.com/gitlab-org/gitlab/-/issues/232533
-create config/feature_flags/development/my_feature_flag.yml
----
-name: my_feature_flag
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/232533
-group: group::memory
-type: development
-default_enabled: false
-```
-
-NOTE:
-To create a feature flag that is only used in EE, add the `--ee` flag: `bin/feature-flag --ee`
-
-## Delete a feature flag
-
-See [cleaning up feature flags](controls.md#cleaning-up) for more information about
-deleting feature flags.
-
-## Develop with a feature flag
-
-There are two main ways of using Feature Flags in the GitLab codebase:
-
-- [Backend code (Rails)](#backend)
-- [Frontend code (VueJS)](#frontend)
-
-### Backend
-
-The feature flag interface is defined in [`lib/feature.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/feature.rb).
-This interface provides a set of methods to check if the feature flag is enabled or disabled:
-
-```ruby
-if Feature.enabled?(:my_feature_flag, project)
- # execute code if feature flag is enabled
-else
- # execute code if feature flag is disabled
-end
-
-if Feature.disabled?(:my_feature_flag, project)
- # execute code if feature flag is disabled
-end
-```
-
-In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
-in the merge request. Use `default_enabled: true` when checking the feature flag state:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, default_enabled: true)
- # execute code if feature flag is enabled
-else
- # execute code if feature flag is disabled
-end
-
-if Feature.disabled?(:my_feature_flag, project, default_enabled: true)
- # execute code if feature flag is disabled
-end
-```
-
-If not specified, `default_enabled` is `false`.
-
-To force reading the `default_enabled` value from the relative YAML definition file, use
-`default_enabled: :yaml`:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, default_enabled: :yaml)
- # execute code if feature flag is enabled
-end
-```
-
-```ruby
-if Feature.disabled?(:feature_flag, project, default_enabled: :yaml)
- # execute code if feature flag is disabled
-end
-```
-
-This allows to use the same feature flag check across various parts of the codebase and
-maintain the status of `default_enabled` in the YAML definition file which is the SSOT.
-
-If `default_enabled: :yaml` is used, a YAML definition is expected or an error is raised
-in development or test environment, while returning `false` on production.
-
-If not specified, the default feature flag type for `Feature.enabled?` and `Feature.disabled?`
-is `type: development`. For all other feature flag types, you must specify the `type:`:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, type: :ops)
- # execute code if ops feature flag is enabled
-else
- # execute code if ops feature flag is disabled
-end
-
-if Feature.disabled?(:my_feature_flag, project, type: :ops)
- # execute code if feature flag is disabled
-end
-```
-
-WARNING:
-Don't use feature flags at application load time. For example, using the `Feature` class in
-`config/initializers/*` or at the class level could cause an unexpected error. This error occurs
-because a database that a feature flag adapter might depend on doesn't exist at load time
-(especially for fresh installations). Checking for the database's existence at the caller isn't
-recommended, as some adapters don't require a database at all (for example, the HTTP adapter). The
-feature flag setup check must be abstracted in the `Feature` namespace. This approach also requires
-application reload when the feature flag changes. You must therefore ask SREs to reload the
-Web/API/Sidekiq fleet on production, which takes time to fully rollout/rollback the changes. For
-these reasons, use environment variables (for example, `ENV['YOUR_FEATURE_NAME']`) or `gitlab.yml`
-instead.
-
-Here's an example of a pattern that you should avoid:
-
-```ruby
-class MyClass
- if Feature.enabled?(:...)
- new_process
- else
- legacy_process
- end
-end
-```
-
-### Frontend
-
-Use the `push_frontend_feature_flag` method for frontend code, which is
-available to all controllers that inherit from `ApplicationController`. You can use
-this method to expose the state of a feature flag, for example:
-
-```ruby
-before_action do
- # Prefer to scope it per project or user e.g.
- push_frontend_feature_flag(:vim_bindings, project)
-end
-
-def index
- # ...
-end
-
-def edit
- # ...
-end
-```
-
-You can then check the state of the feature flag in JavaScript as follows:
-
-```javascript
-if ( gon.features.vimBindings ) {
- // ...
-}
-```
-
-The name of the feature flag in JavaScript is always camelCase,
-so checking for `gon.features.vim_bindings` would not work.
-
-See the [Vue guide](../fe_guide/vue.md#accessing-feature-flags) for details about
-how to access feature flags in a Vue component.
-
-In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
-in the merge request. Use `default_enabled: true` when checking the feature flag state:
-
-```ruby
-before_action do
- # Prefer to scope it per project or user e.g.
- push_frontend_feature_flag(:vim_bindings, project, default_enabled: true)
-end
-```
-
-If not specified, the default feature flag type for `push_frontend_feature_flag`
-is `type: development`. For all other feature flag types, you must specify the `type:`:
-
-```ruby
-before_action do
- push_frontend_feature_flag(:vim_bindings, project, type: :ops)
-end
-```
-
-### Feature actors
-
-**It is strongly advised to use actors with feature flags.** Actors provide a simple
-way to enable a feature flag only for a given project, group or user. This makes debugging
-easier, as you can filter logs and errors for example, based on actors. This also makes it possible
-to enable the feature on the `gitlab-org` or `gitlab-com` groups first, while the rest of
-the users aren't impacted.
-
-Actors also provide an easy way to do a percentage rollout of a feature in a sticky way.
-If a 1% rollout enabled a feature for a specific actor, that actor will continue to have the feature enabled at
-10%, 50%, and 100%.
-
-GitLab currently supports the following models as feature flag actors:
-
-- `User`
-- `Project`
-- `Group`
-
-The actor is a second parameter of the `Feature.enabled?` call. The
-same actor type must be used consistently for all invocations of `Feature.enabled?`.
-
-```ruby
-Feature.enabled?(:feature_flag, project)
-Feature.enabled?(:feature_flag, group)
-Feature.enabled?(:feature_flag, user)
-```
-
-#### Selectively disable by actor
-
-By default you cannot selectively disable a feature flag by actor.
-
-```shell
-# This will not work how you would expect.
-/chatops run feature set some_feature true
-/chatops run feature set --project=gitlab-org/gitlab some_feature false
-```
-
-However, if you add two feature flags, you can write your conditional statement in such a way that the equivalent selective disable is possible.
-
-```ruby
-Feature.enabled?(:a_feature, project) && Feature.disabled?(:a_feature_override, project)
-```
-
-```shell
-# This will enable a feature flag globally, except for gitlab-org/gitlab
-/chatops run feature set a_feature true
-/chatops run feature set --project=gitlab-org/gitlab a_feature_override true
-```
-
-### Enable additional objects as actors
-
-To use feature gates based on actors, the model needs to respond to
-`flipper_id`. For example, to enable for the Foo model:
-
-```ruby
-class Foo < ActiveRecord::Base
- include FeatureGate
-end
-```
-
-Only models that `include FeatureGate` or expose `flipper_id` method can be
-used as an actor for `Feature.enabled?`.
-
-### Feature flags for licensed features
-
-You can't use a feature flag with the same name as a licensed feature name, because
-it would cause a naming collision. This was [widely discussed and removed](https://gitlab.com/gitlab-org/gitlab/-/issues/259611)
-because it is confusing.
-
-To check for licensed features, add a dedicated feature flag under a different name
-and check it explicitly, for example:
-
-```ruby
-Feature.enabled?(:licensed_feature_feature_flag, project) &&
- project.feature_available?(:licensed_feature)
-```
-
-### Feature groups
-
-Feature groups must be defined statically in `lib/feature.rb` (in the
-`.register_feature_groups` method), but their implementation can obviously be
-dynamic (querying the DB, for example).
-
-Once defined in `lib/feature.rb`, you can to activate a
-feature for a given feature group via the [`feature_group` parameter of the features API](../../api/features.md#set-or-create-a-feature)
-
-### Enabling a feature flag locally (in development)
-
-In the rails console (`rails c`), enter the following command to enable a feature flag:
-
-```ruby
-Feature.enable(:feature_flag_name)
-```
-
-Similarly, the following command disables a feature flag:
-
-```ruby
-Feature.disable(:feature_flag_name)
-```
-
-You can also enable a feature flag for a given gate:
-
-```ruby
-Feature.enable(:feature_flag_name, Project.find_by_full_path("root/my-project"))
-```
-
-### Removing a feature flag locally (in development)
-
-When manually enabling or disabling a feature flag from the Rails console, its default value gets overwritten.
-This can cause confusion when changing the flag's `default_enabled` attribute.
-
-To reset the feature flag to the default status, you can remove it in the rails console (`rails c`)
-as follows:
-
-```ruby
-Feature.remove(:feature_flag_name)
-```
-
-## Feature flags in tests
-
-Introducing a feature flag into the codebase creates an additional code path that should be tested.
-It is strongly advised to test all code affected by a feature flag, both when **enabled** and **disabled**
-to ensure the feature works properly.
-
-When using the testing environment, all feature flags are enabled by default.
-
-WARNING:
-This does not apply to end-to-end (QA) tests, which [do not disable feature flags by default](#end-to-end-qa-tests). There is a different [process for using feature flags in end-to-end tests](../testing_guide/end_to_end/feature_flags.md).
-
-To disable a feature flag in a test, use the `stub_feature_flags`
-helper. For example, to globally disable the `ci_live_trace` feature
-flag in a test:
-
-```ruby
-stub_feature_flags(ci_live_trace: false)
-
-Feature.enabled?(:ci_live_trace) # => false
-```
-
-If you wish to set up a test where a feature flag is enabled only
-for some actors and not others, you can specify this in options
-passed to the helper. For example, to enable the `ci_live_trace`
-feature flag for a specific project:
-
-```ruby
-project1, project2 = build_list(:project, 2)
-
-# Feature will only be enabled for project1
-stub_feature_flags(ci_live_trace: project1)
-
-Feature.enabled?(:ci_live_trace) # => false
-Feature.enabled?(:ci_live_trace, project1) # => true
-Feature.enabled?(:ci_live_trace, project2) # => false
-```
-
-The behavior of FlipperGate is as follows:
-
-1. You can enable an override for a specified actor to be enabled.
-1. You can disable (remove) an override for a specified actor,
- falling back to the default state.
-1. There's no way to model that you explicitly disabled a specified actor.
-
-```ruby
-Feature.enable(:my_feature)
-Feature.disable(:my_feature, project1)
-Feature.enabled?(:my_feature) # => true
-Feature.enabled?(:my_feature, project1) # => true
-
-Feature.disable(:my_feature2)
-Feature.enable(:my_feature2, project1)
-Feature.enabled?(:my_feature2) # => false
-Feature.enabled?(:my_feature2, project1) # => true
-```
-
-### `have_pushed_frontend_feature_flags`
-
-Use `have_pushed_frontend_feature_flags` to test if [`push_frontend_feature_flag`](#frontend)
-has added the feature flag to the HTML.
-
-For example,
-
-```ruby
-stub_feature_flags(value_stream_analytics_path_navigation: false)
-
-visit group_analytics_cycle_analytics_path(group)
-
-expect(page).to have_pushed_frontend_feature_flags(valueStreamAnalyticsPathNavigation: false)
-```
-
-### `stub_feature_flags` vs `Feature.enable*`
-
-It is preferred to use `stub_feature_flags` to enable feature flags
-in the testing environment. This method provides a simple and well described
-interface for simple use cases.
-
-However, in some cases more complex behavior needs to be tested,
-like percentage rollouts of feature flags. This can be done using
-`.enable_percentage_of_time` or `.enable_percentage_of_actors`:
-
-```ruby
-# Good: feature needs to be explicitly disabled, as it is enabled by default if not defined
-stub_feature_flags(my_feature: false)
-stub_feature_flags(my_feature: true)
-stub_feature_flags(my_feature: project)
-stub_feature_flags(my_feature: [project, project2])
-
-# Bad
-Feature.enable(:my_feature_2)
-
-# Good: enable my_feature for 50% of time
-Feature.enable_percentage_of_time(:my_feature_3, 50)
-
-# Good: enable my_feature for 50% of actors/gates/things
-Feature.enable_percentage_of_actors(:my_feature_4, 50)
-```
-
-Each feature flag that has a defined state is persisted
-during test execution time:
-
-```ruby
-Feature.persisted_names.include?('my_feature') => true
-Feature.persisted_names.include?('my_feature_2') => true
-Feature.persisted_names.include?('my_feature_3') => true
-Feature.persisted_names.include?('my_feature_4') => true
-```
-
-### Stubbing actor
-
-When you want to enable a feature flag for a specific actor only,
-you can stub its representation. A gate that is passed
-as an argument to `Feature.enabled?` and `Feature.disabled?` must be an object
-that includes `FeatureGate`.
-
-In specs you can use the `stub_feature_flag_gate` method that allows you to
-quickly create a custom actor:
-
-```ruby
-gate = stub_feature_flag_gate('CustomActor')
-
-stub_feature_flags(ci_live_trace: gate)
-
-Feature.enabled?(:ci_live_trace) # => false
-Feature.enabled?(:ci_live_trace, gate) # => true
-```
-
-You can also disable a feature flag for a specific actor:
-
-```ruby
-gate = stub_feature_flag_gate('CustomActor')
-
-stub_feature_flags(ci_live_trace: false, thing: gate)
-```
-
-### Controlling feature flags engine in tests
-
-Our Flipper engine in the test environment works in a memory mode `Flipper::Adapters::Memory`.
-`production` and `development` modes use `Flipper::Adapters::ActiveRecord`.
-
-You can control whether the `Flipper::Adapters::Memory` or `ActiveRecord` mode is being used.
-
-#### `stub_feature_flags: true` (default and preferred)
-
-In this mode Flipper is configured to use `Flipper::Adapters::Memory` and mark all feature
-flags to be on-by-default and persisted on a first use. This overwrites the `default_enabled:`
-of `Feature.enabled?` and `Feature.disabled?` returning always `true` unless feature flag
-is persisted.
-
-Make sure behavior under feature flag doesn't go untested in some non-specific contexts.
-
-### `stub_feature_flags: false`
-
-This disables a memory-stubbed flipper, and uses `Flipper::Adapters::ActiveRecord`
-a mode that is used by `production` and `development`.
-
-You should use this mode only when you really want to tests aspects of Flipper
-with how it interacts with `ActiveRecord`.
-
-### End-to-end (QA) tests
-
-Toggling feature flags works differently in end-to-end (QA) tests. The end-to-end test framework does not have direct access to
-Rails or the database, so it can't use Flipper. Instead, it uses [the public API](../../api/features.md#set-or-create-a-feature). Each end-to-end test can [enable or disable a feature flag during the test](../testing_guide/end_to_end/feature_flags.md). Alternatively, you can enable or disable a feature flag before one or more tests when you [run them from your GitLab repository's `qa` directory](https://gitlab.com/gitlab-org/gitlab/tree/master/qa#running-tests-with-a-feature-flag-enabled-or-disabled), or if you [run the tests via GitLab QA](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#running-tests-with-a-feature-flag-enabled).
-
-[As noted above, feature flags are not enabled by default in end-to-end tests.](#feature-flags-in-tests)
-This means that end-to-end tests will run with feature flags in the default state implemented in the source
-code, or with the feature flag in its current state on the GitLab instance under test, unless the
-test is written to enable/disable a feature flag explicitly.
-
-When a feature flag is changed on Staging or on GitLab.com, a Slack message will be posted to the `#qa-staging` or `#qa-production` channels to inform
-the pipeline triage DRI so that they can more easily determine if any failures are related to a feature flag change. However, if you are working on a change you can
-help to avoid unexpected failures by [confirming that the end-to-end tests pass with a feature flag enabled.](../testing_guide/end_to_end/feature_flags.md#confirming-that-end-to-end-tests-pass-with-a-feature-flag-enabled)
+This document was moved to [another location](index.md).
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/development/feature_flags/index.md b/doc/development/feature_flags/index.md
index 4890cc5da35..5c98dc2e473 100644
--- a/doc/development/feature_flags/index.md
+++ b/doc/development/feature_flags/index.md
@@ -1,75 +1,636 @@
---
+type: reference, dev
stage: none
group: Development
info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
---
-# Feature flags in development of GitLab
+# Developing with feature flags
**NOTE**:
The documentation below covers feature flags used by GitLab to deploy its own features, which **is not** the same
as the [feature flags offered as part of the product](../../operations/feature_flags.md).
-## When to use feature flags
+This document provides guidelines on how to use feature flags
+in the GitLab codebase to conditionally enable features
+and test them.
-Developers are required to use feature flags for changes that could affect availability of existing GitLab functionality (if it only affects the new feature you're making that is probably acceptable).
-Such changes include:
+Features that are developed and merged behind a feature flag
+should not include a changelog entry. The entry should be added either in the merge
+request removing the feature flag or the merge request where the default value of
+the feature flag is set to enabled. If the feature contains any database migrations, it
+*should* include a changelog entry for the database changes.
-1. New features in high traffic areas (e.g. a new merge request widget, new option in issues/epics, new CI functionality).
-1. Complex performance improvements that may require additional testing in production (e.g. rewriting complex queries, changes to frequently used API endpoints).
-1. Invasive changes to the user interface (e.g. introducing a new navigation bar, removal of a sidebar, UI element change in issues or MR interface).
-1. Introducing dependencies on third-party services (e.g. adding support for importing projects).
-1. Changes to features that can cause data corruption or cause data loss (e.g. features processing repository data or user uploaded content).
+WARNING:
+All newly-introduced feature flags should be [disabled by default](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flags-in-gitlab-development).
-Situations where you might consider not using a feature flag:
+NOTE:
+This document is the subject of continued work as part of an epic to [improve internal usage of Feature Flags](https://gitlab.com/groups/gitlab-org/-/epics/3551). Raise any suggestions as new issues and attach them to the epic.
-1. Adding a new API endpoint
-1. Introducing new features in low traffic areas (e.g. adding a new export functionality in the admin area/group settings/project settings)
-1. Non-invasive frontend changes (e.g. changing the color of a button, or moving a UI element in a low traffic area)
+## Feature flags in GitLab development
-In all cases, those working on the changes should ask themselves:
+The following highlights should be considered when deciding if feature flags
+should be leveraged:
-> Why do I need to add a feature flag? If I don't add one, what options do I have to control the impact on application reliability, and user experience?
+- By default, the feature flags should be **off**.
+- Feature flags should remain in the codebase for as short period as possible
+ to reduce the need for feature flag accounting.
+- The person operating with feature flags is responsible for clearly communicating
+ the status of a feature behind the feature flag with responsible stakeholders. The
+ issue description should be updated with the feature flag name and whether it is
+ defaulted on or off as soon it is evident that a feature flag is needed.
+- Merge requests that make changes hidden behind a feature flag, or remove an
+ existing feature flag because a feature is deemed stable must have the
+ ~"feature flag" label assigned.
+- When development of a feature will be spread across multiple merge
+ requests, you can use the following workflow:
-For perspective on why we limit our use of feature flags please see
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Feature flags only when needed](https://www.youtube.com/watch?v=DQaGqyolOd8).
+ 1. [Create a new feature flag](#create-a-new-feature-flag)
+ which is **off** by default, in the first merge request which uses the flag.
+ Flags [should not be added separately](#risk-of-a-broken-master-main-branch).
+ 1. Submit incremental changes via one or more merge requests, ensuring that any
+ new code added can only be reached if the feature flag is **on**.
+ You can keep the feature flag enabled on your local GDK during development.
+ 1. When the feature is ready to be tested, enable the feature flag for
+ a specific project and ensure that there are no issues with the implementation.
+ 1. When the feature is ready to be announced, create a merge request that adds
+ documentation about the feature, including [documentation for the feature flag itself](../documentation/feature_flags.md),
+ and a changelog entry. In the same merge request either flip the feature flag to
+ be **on by default** or remove it entirely in order to enable the new behavior.
-In case you are uncertain if a feature flag is necessary, simply ask about this in an early merge request, and those reviewing the changes will likely provide you with an answer.
+One might be tempted to think that feature flags will delay the release of a
+feature by at least one month (= one release). This is not the case. A feature
+flag does not have to stick around for a specific amount of time
+(e.g. at least one release), instead they should stick around until the feature
+is deemed stable. Stable means it works on GitLab.com without causing any
+problems, such as outages.
-When using a feature flag for UI elements, make sure to _also_ use a feature
-flag for the underlying backend code, if there is any. This ensures there is
-absolutely no way to use the feature until it is enabled.
+## Risk of a broken master (main) branch
-## How to use Feature Flags
+Feature flags **must** be used in the MR that introduces them. Not doing so causes a
+[broken master](https://about.gitlab.com/handbook/engineering/workflow/#broken-master) scenario due
+to the `rspec:feature-flags` job that only runs on the `master` branch.
-Feature flags can be used to gradually deploy changes, regardless of whether
-they are new features or performance improvements. By using feature flags,
-you can determine the impact of GitLab-directed changes, while still being able
-to disable those changes without having to revert an entire release.
+## Types of feature flags
-For an overview about starting with feature flags in GitLab development,
-use this [training template](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/.gitlab/issue_templates/feature-flag-training.md).
+Choose a feature flag type that matches the expected usage.
-Before using feature flags for GitLab development, review the following development guides:
+### `development` type
-1. [Process for using features flags](process.md): When you should use
- feature flags in the development of GitLab, what's the cost of using them,
- and how to include them in a release.
-1. [Developing with feature flags](development.md): Learn about the types of
- feature flags, their definition and validation, how to create them, frontend and
- backend details, and other information.
-1. [Documenting features deployed behind feature flags](../documentation/feature_flags.md):
- How to document features deployed behind feature flags, and how to update the
- documentation for features' flags when their states change.
-1. [Controlling feature flags](controls.md): Learn the process for deploying
- a new feature, enabling it on GitLab.com, communicating the change,
- logging, and cleaning up.
+`development` feature flags are short-lived feature flags,
+used so that unfinished code can be deployed in production.
-User guides:
+A `development` feature flag should have a rollout issue,
+ideally created using the [Feature Flag Roll Out template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md).
-1. [How GitLab administrators can enable and disable features behind flags](../../administration/feature_flags.md):
- An explanation for GitLab administrators about how they can
- enable or disable GitLab features behind feature flags.
-1. [What "features deployed behind flags" means to the GitLab user](../../user/feature_flags.md):
- An explanation for GitLab users regarding how certain features
- might not be available to them until they are enabled.
+This is the default type used when calling `Feature.enabled?`.
+
+### `ops` type
+
+`ops` feature flags are long-lived feature flags that control operational aspects
+of GitLab product behavior. For example, feature flags that disable features that might
+have a performance impact, like special Sidekiq worker behavior.
+
+`ops` feature flags likely do not have rollout issues, as it is hard to
+predict when they are enabled or disabled.
+
+To use `ops` feature flags, you must append `type: :ops` to `Feature.enabled?`
+invocations:
+
+```ruby
+# Check if feature flag is enabled
+Feature.enabled?(:my_ops_flag, project, type: :ops)
+
+# Check if feature flag is disabled
+Feature.disabled?(:my_ops_flag, project, type: :ops)
+
+# Push feature flag to Frontend
+push_frontend_feature_flag(:my_ops_flag, project, type: :ops)
+```
+
+### `experiment` type
+
+`experiment` feature flags are used for A/B testing on GitLab.com.
+
+An `experiment` feature flag should conform to the same standards as a `development` feature flag,
+although the interface has some differences. An experiment feature flag should have a rollout issue,
+ideally created using the [Experiment Tracking template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/experiment_tracking_template.md). More information can be found in the [experiment guide](../experiment_guide/index.md).
+
+## Feature flag definition and validation
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229161) in GitLab 13.3.
+
+During development (`RAILS_ENV=development`) or testing (`RAILS_ENV=test`) all feature flag usage is being strictly validated.
+
+This process is meant to ensure consistent feature flag usage in the codebase. All feature flags **must**:
+
+- Be known. Only use feature flags that are explicitly defined.
+- Not be defined twice. They have to be defined either in FOSS or EE, but not both.
+- Use a valid and consistent `type:` across all invocations.
+- Use the same `default_enabled:` across all invocations.
+- Have an owner.
+
+All feature flags known to GitLab are self-documented in YAML files stored in:
+
+- [`config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/feature_flags)
+- [`ee/config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/feature_flags)
+
+Each feature flag is defined in a separate YAML file consisting of a number of fields:
+
+| Field | Required | Description |
+|---------------------|----------|----------------------------------------------------------------|
+| `name` | yes | Name of the feature flag. |
+| `type` | yes | Type of feature flag. |
+| `default_enabled` | yes | The default state of the feature flag that is strictly validated, with `default_enabled:` passed as an argument. |
+| `introduced_by_url` | no | The URL to the Merge Request that introduced the feature flag. |
+| `rollout_issue_url` | no | The URL to the Issue covering the feature flag rollout. |
+| `group` | no | The [group](https://about.gitlab.com/handbook/product/categories/#devops-stages) that owns the feature flag. |
+
+NOTE:
+All validations are skipped when running in `RAILS_ENV=production`.
+
+## Create a new feature flag
+
+The GitLab codebase provides [`bin/feature-flag`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/bin/feature-flag),
+a dedicated tool to create new feature flag definitions.
+The tool asks various questions about the new feature flag, then creates
+a YAML definition in `config/feature_flags` or `ee/config/feature_flags`.
+
+Only feature flags that have a YAML definition file can be used when running the development or testing environments.
+
+```shell
+$ bin/feature-flag my_feature_flag
+>> Specify the group introducing the feature flag, like `group::apm`:
+?> group::memory
+
+>> URL of the MR introducing the feature flag (enter to skip):
+?> https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
+
+>> Open this URL and fill in the rest of the details:
+https://gitlab.com/gitlab-org/gitlab/-/issues/new?issue%5Btitle%5D=%5BFeature+flag%5D+Rollout+of+%60test-flag%60&issuable_template=Feature+Flag+Roll+Out
+
+>> URL of the rollout issue (enter to skip):
+?> https://gitlab.com/gitlab-org/gitlab/-/issues/232533
+create config/feature_flags/development/my_feature_flag.yml
+---
+name: my_feature_flag
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/232533
+group: group::memory
+type: development
+default_enabled: false
+```
+
+NOTE:
+To create a feature flag that is only used in EE, add the `--ee` flag: `bin/feature-flag --ee`
+
+## Delete a feature flag
+
+See [cleaning up feature flags](controls.md#cleaning-up) for more information about
+deleting feature flags.
+
+## Develop with a feature flag
+
+There are two main ways of using Feature Flags in the GitLab codebase:
+
+- [Backend code (Rails)](#backend)
+- [Frontend code (VueJS)](#frontend)
+
+### Backend
+
+The feature flag interface is defined in [`lib/feature.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/feature.rb).
+This interface provides a set of methods to check if the feature flag is enabled or disabled:
+
+```ruby
+if Feature.enabled?(:my_feature_flag, project)
+ # execute code if feature flag is enabled
+else
+ # execute code if feature flag is disabled
+end
+
+if Feature.disabled?(:my_feature_flag, project)
+ # execute code if feature flag is disabled
+end
+```
+
+In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
+in the merge request. Use `default_enabled: true` when checking the feature flag state:
+
+```ruby
+if Feature.enabled?(:feature_flag, project, default_enabled: true)
+ # execute code if feature flag is enabled
+else
+ # execute code if feature flag is disabled
+end
+
+if Feature.disabled?(:my_feature_flag, project, default_enabled: true)
+ # execute code if feature flag is disabled
+end
+```
+
+If not specified, `default_enabled` is `false`.
+
+To force reading the `default_enabled` value from the relative YAML definition file, use
+`default_enabled: :yaml`:
+
+```ruby
+if Feature.enabled?(:feature_flag, project, default_enabled: :yaml)
+ # execute code if feature flag is enabled
+end
+```
+
+```ruby
+if Feature.disabled?(:feature_flag, project, default_enabled: :yaml)
+ # execute code if feature flag is disabled
+end
+```
+
+This allows to use the same feature flag check across various parts of the codebase and
+maintain the status of `default_enabled` in the YAML definition file which is the SSOT.
+
+If `default_enabled: :yaml` is used, a YAML definition is expected or an error is raised
+in development or test environment, while returning `false` on production.
+
+If not specified, the default feature flag type for `Feature.enabled?` and `Feature.disabled?`
+is `type: development`. For all other feature flag types, you must specify the `type:`:
+
+```ruby
+if Feature.enabled?(:feature_flag, project, type: :ops)
+ # execute code if ops feature flag is enabled
+else
+ # execute code if ops feature flag is disabled
+end
+
+if Feature.disabled?(:my_feature_flag, project, type: :ops)
+ # execute code if feature flag is disabled
+end
+```
+
+WARNING:
+Don't use feature flags at application load time. For example, using the `Feature` class in
+`config/initializers/*` or at the class level could cause an unexpected error. This error occurs
+because a database that a feature flag adapter might depend on doesn't exist at load time
+(especially for fresh installations). Checking for the database's existence at the caller isn't
+recommended, as some adapters don't require a database at all (for example, the HTTP adapter). The
+feature flag setup check must be abstracted in the `Feature` namespace. This approach also requires
+application reload when the feature flag changes. You must therefore ask SREs to reload the
+Web/API/Sidekiq fleet on production, which takes time to fully rollout/rollback the changes. For
+these reasons, use environment variables (for example, `ENV['YOUR_FEATURE_NAME']`) or `gitlab.yml`
+instead.
+
+Here's an example of a pattern that you should avoid:
+
+```ruby
+class MyClass
+ if Feature.enabled?(:...)
+ new_process
+ else
+ legacy_process
+ end
+end
+```
+
+### Frontend
+
+Use the `push_frontend_feature_flag` method for frontend code, which is
+available to all controllers that inherit from `ApplicationController`. You can use
+this method to expose the state of a feature flag, for example:
+
+```ruby
+before_action do
+ # Prefer to scope it per project or user e.g.
+ push_frontend_feature_flag(:vim_bindings, project)
+end
+
+def index
+ # ...
+end
+
+def edit
+ # ...
+end
+```
+
+You can then check the state of the feature flag in JavaScript as follows:
+
+```javascript
+if ( gon.features.vimBindings ) {
+ // ...
+}
+```
+
+The name of the feature flag in JavaScript is always camelCase,
+so checking for `gon.features.vim_bindings` would not work.
+
+See the [Vue guide](../fe_guide/vue.md#accessing-feature-flags) for details about
+how to access feature flags in a Vue component.
+
+In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
+in the merge request. Use `default_enabled: true` when checking the feature flag state:
+
+```ruby
+before_action do
+ # Prefer to scope it per project or user e.g.
+ push_frontend_feature_flag(:vim_bindings, project, default_enabled: true)
+end
+```
+
+If not specified, the default feature flag type for `push_frontend_feature_flag`
+is `type: development`. For all other feature flag types, you must specify the `type:`:
+
+```ruby
+before_action do
+ push_frontend_feature_flag(:vim_bindings, project, type: :ops)
+end
+```
+
+### Feature actors
+
+**It is strongly advised to use actors with feature flags.** Actors provide a simple
+way to enable a feature flag only for a given project, group or user. This makes debugging
+easier, as you can filter logs and errors for example, based on actors. This also makes it possible
+to enable the feature on the `gitlab-org` or `gitlab-com` groups first, while the rest of
+the users aren't impacted.
+
+Actors also provide an easy way to do a percentage rollout of a feature in a sticky way.
+If a 1% rollout enabled a feature for a specific actor, that actor will continue to have the feature enabled at
+10%, 50%, and 100%.
+
+GitLab currently supports the following models as feature flag actors:
+
+- `User`
+- `Project`
+- `Group`
+
+The actor is a second parameter of the `Feature.enabled?` call. The
+same actor type must be used consistently for all invocations of `Feature.enabled?`.
+
+```ruby
+Feature.enabled?(:feature_flag, project)
+Feature.enabled?(:feature_flag, group)
+Feature.enabled?(:feature_flag, user)
+```
+
+#### Selectively disable by actor
+
+By default you cannot selectively disable a feature flag by actor.
+
+```shell
+# This will not work how you would expect.
+/chatops run feature set some_feature true
+/chatops run feature set --project=gitlab-org/gitlab some_feature false
+```
+
+However, if you add two feature flags, you can write your conditional statement in such a way that the equivalent selective disable is possible.
+
+```ruby
+Feature.enabled?(:a_feature, project) && Feature.disabled?(:a_feature_override, project)
+```
+
+```shell
+# This will enable a feature flag globally, except for gitlab-org/gitlab
+/chatops run feature set a_feature true
+/chatops run feature set --project=gitlab-org/gitlab a_feature_override true
+```
+
+### Enable additional objects as actors
+
+To use feature gates based on actors, the model needs to respond to
+`flipper_id`. For example, to enable for the Foo model:
+
+```ruby
+class Foo < ActiveRecord::Base
+ include FeatureGate
+end
+```
+
+Only models that `include FeatureGate` or expose `flipper_id` method can be
+used as an actor for `Feature.enabled?`.
+
+### Feature flags for licensed features
+
+You can't use a feature flag with the same name as a licensed feature name, because
+it would cause a naming collision. This was [widely discussed and removed](https://gitlab.com/gitlab-org/gitlab/-/issues/259611)
+because it is confusing.
+
+To check for licensed features, add a dedicated feature flag under a different name
+and check it explicitly, for example:
+
+```ruby
+Feature.enabled?(:licensed_feature_feature_flag, project) &&
+ project.feature_available?(:licensed_feature)
+```
+
+### Feature groups
+
+Feature groups must be defined statically in `lib/feature.rb` (in the
+`.register_feature_groups` method), but their implementation can obviously be
+dynamic (querying the DB, for example).
+
+Once defined in `lib/feature.rb`, you can to activate a
+feature for a given feature group via the [`feature_group` parameter of the features API](../../api/features.md#set-or-create-a-feature)
+
+### Enabling a feature flag locally (in development)
+
+In the rails console (`rails c`), enter the following command to enable a feature flag:
+
+```ruby
+Feature.enable(:feature_flag_name)
+```
+
+Similarly, the following command disables a feature flag:
+
+```ruby
+Feature.disable(:feature_flag_name)
+```
+
+You can also enable a feature flag for a given gate:
+
+```ruby
+Feature.enable(:feature_flag_name, Project.find_by_full_path("root/my-project"))
+```
+
+### Removing a feature flag locally (in development)
+
+When manually enabling or disabling a feature flag from the Rails console, its default value gets overwritten.
+This can cause confusion when changing the flag's `default_enabled` attribute.
+
+To reset the feature flag to the default status, you can remove it in the rails console (`rails c`)
+as follows:
+
+```ruby
+Feature.remove(:feature_flag_name)
+```
+
+## Feature flags in tests
+
+Introducing a feature flag into the codebase creates an additional code path that should be tested.
+It is strongly advised to test all code affected by a feature flag, both when **enabled** and **disabled**
+to ensure the feature works properly.
+
+When using the testing environment, all feature flags are enabled by default.
+
+WARNING:
+This does not apply to end-to-end (QA) tests, which [do not disable feature flags by default](#end-to-end-qa-tests). There is a different [process for using feature flags in end-to-end tests](../testing_guide/end_to_end/feature_flags.md).
+
+To disable a feature flag in a test, use the `stub_feature_flags`
+helper. For example, to globally disable the `ci_live_trace` feature
+flag in a test:
+
+```ruby
+stub_feature_flags(ci_live_trace: false)
+
+Feature.enabled?(:ci_live_trace) # => false
+```
+
+If you wish to set up a test where a feature flag is enabled only
+for some actors and not others, you can specify this in options
+passed to the helper. For example, to enable the `ci_live_trace`
+feature flag for a specific project:
+
+```ruby
+project1, project2 = build_list(:project, 2)
+
+# Feature will only be enabled for project1
+stub_feature_flags(ci_live_trace: project1)
+
+Feature.enabled?(:ci_live_trace) # => false
+Feature.enabled?(:ci_live_trace, project1) # => true
+Feature.enabled?(:ci_live_trace, project2) # => false
+```
+
+The behavior of FlipperGate is as follows:
+
+1. You can enable an override for a specified actor to be enabled.
+1. You can disable (remove) an override for a specified actor,
+ falling back to the default state.
+1. There's no way to model that you explicitly disabled a specified actor.
+
+```ruby
+Feature.enable(:my_feature)
+Feature.disable(:my_feature, project1)
+Feature.enabled?(:my_feature) # => true
+Feature.enabled?(:my_feature, project1) # => true
+
+Feature.disable(:my_feature2)
+Feature.enable(:my_feature2, project1)
+Feature.enabled?(:my_feature2) # => false
+Feature.enabled?(:my_feature2, project1) # => true
+```
+
+### `have_pushed_frontend_feature_flags`
+
+Use `have_pushed_frontend_feature_flags` to test if [`push_frontend_feature_flag`](#frontend)
+has added the feature flag to the HTML.
+
+For example,
+
+```ruby
+stub_feature_flags(value_stream_analytics_path_navigation: false)
+
+visit group_analytics_cycle_analytics_path(group)
+
+expect(page).to have_pushed_frontend_feature_flags(valueStreamAnalyticsPathNavigation: false)
+```
+
+### `stub_feature_flags` vs `Feature.enable*`
+
+It is preferred to use `stub_feature_flags` to enable feature flags
+in the testing environment. This method provides a simple and well described
+interface for simple use cases.
+
+However, in some cases more complex behavior needs to be tested,
+like percentage rollouts of feature flags. This can be done using
+`.enable_percentage_of_time` or `.enable_percentage_of_actors`:
+
+```ruby
+# Good: feature needs to be explicitly disabled, as it is enabled by default if not defined
+stub_feature_flags(my_feature: false)
+stub_feature_flags(my_feature: true)
+stub_feature_flags(my_feature: project)
+stub_feature_flags(my_feature: [project, project2])
+
+# Bad
+Feature.enable(:my_feature_2)
+
+# Good: enable my_feature for 50% of time
+Feature.enable_percentage_of_time(:my_feature_3, 50)
+
+# Good: enable my_feature for 50% of actors/gates/things
+Feature.enable_percentage_of_actors(:my_feature_4, 50)
+```
+
+Each feature flag that has a defined state is persisted
+during test execution time:
+
+```ruby
+Feature.persisted_names.include?('my_feature') => true
+Feature.persisted_names.include?('my_feature_2') => true
+Feature.persisted_names.include?('my_feature_3') => true
+Feature.persisted_names.include?('my_feature_4') => true
+```
+
+### Stubbing actor
+
+When you want to enable a feature flag for a specific actor only,
+you can stub its representation. A gate that is passed
+as an argument to `Feature.enabled?` and `Feature.disabled?` must be an object
+that includes `FeatureGate`.
+
+In specs you can use the `stub_feature_flag_gate` method that allows you to
+quickly create a custom actor:
+
+```ruby
+gate = stub_feature_flag_gate('CustomActor')
+
+stub_feature_flags(ci_live_trace: gate)
+
+Feature.enabled?(:ci_live_trace) # => false
+Feature.enabled?(:ci_live_trace, gate) # => true
+```
+
+You can also disable a feature flag for a specific actor:
+
+```ruby
+gate = stub_feature_flag_gate('CustomActor')
+
+stub_feature_flags(ci_live_trace: false, thing: gate)
+```
+
+### Controlling feature flags engine in tests
+
+Our Flipper engine in the test environment works in a memory mode `Flipper::Adapters::Memory`.
+`production` and `development` modes use `Flipper::Adapters::ActiveRecord`.
+
+You can control whether the `Flipper::Adapters::Memory` or `ActiveRecord` mode is being used.
+
+#### `stub_feature_flags: true` (default and preferred)
+
+In this mode Flipper is configured to use `Flipper::Adapters::Memory` and mark all feature
+flags to be on-by-default and persisted on a first use. This overwrites the `default_enabled:`
+of `Feature.enabled?` and `Feature.disabled?` returning always `true` unless feature flag
+is persisted.
+
+Make sure behavior under feature flag doesn't go untested in some non-specific contexts.
+
+### `stub_feature_flags: false`
+
+This disables a memory-stubbed flipper, and uses `Flipper::Adapters::ActiveRecord`
+a mode that is used by `production` and `development`.
+
+You should use this mode only when you really want to tests aspects of Flipper
+with how it interacts with `ActiveRecord`.
+
+### End-to-end (QA) tests
+
+Toggling feature flags works differently in end-to-end (QA) tests. The end-to-end test framework does not have direct access to
+Rails or the database, so it can't use Flipper. Instead, it uses [the public API](../../api/features.md#set-or-create-a-feature). Each end-to-end test can [enable or disable a feature flag during the test](../testing_guide/end_to_end/feature_flags.md). Alternatively, you can enable or disable a feature flag before one or more tests when you [run them from your GitLab repository's `qa` directory](https://gitlab.com/gitlab-org/gitlab/tree/master/qa#running-tests-with-a-feature-flag-enabled-or-disabled), or if you [run the tests via GitLab QA](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#running-tests-with-a-feature-flag-enabled).
+
+[As noted above, feature flags are not enabled by default in end-to-end tests.](#feature-flags-in-tests)
+This means that end-to-end tests will run with feature flags in the default state implemented in the source
+code, or with the feature flag in its current state on the GitLab instance under test, unless the
+test is written to enable/disable a feature flag explicitly.
+
+When a feature flag is changed on Staging or on GitLab.com, a Slack message will be posted to the `#qa-staging` or `#qa-production` channels to inform
+the pipeline triage DRI so that they can more easily determine if any failures are related to a feature flag change. However, if you are working on a change you can
+help to avoid unexpected failures by [confirming that the end-to-end tests pass with a feature flag enabled.](../testing_guide/end_to_end/feature_flags.md#confirming-that-end-to-end-tests-pass-with-a-feature-flag-enabled)
diff --git a/doc/development/feature_flags/process.md b/doc/development/feature_flags/process.md
index 65a6d01e0a2..247dafe9f0b 100644
--- a/doc/development/feature_flags/process.md
+++ b/doc/development/feature_flags/process.md
@@ -1,177 +1,8 @@
---
-type: reference, dev
-stage: none
-group: Development
-info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
+redirect_to: 'https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/'
---
-# Feature flags process
+This document was moved to [another location](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/).
-## Feature flags for user applications
-
-This document only covers feature flags used in the development of GitLab
-itself. Feature flags in deployed user applications can be found at
-[Feature Flags feature documentation](../../operations/feature_flags.md).
-
-## Feature flags in GitLab development
-
-The following highlights should be considered when deciding if feature flags
-should be leveraged:
-
-- By default, the feature flags should be **off**.
-- Feature flags should remain in the codebase for as short period as possible
- to reduce the need for feature flag accounting.
-- The person operating with feature flags is responsible for clearly communicating
- the status of a feature behind the feature flag with responsible stakeholders. The
- issue description should be updated with the feature flag name and whether it is
- defaulted on or off as soon it is evident that a feature flag is needed.
-- Merge requests that make changes hidden behind a feature flag, or remove an
- existing feature flag because a feature is deemed stable must have the
- ~"feature flag" label assigned.
-- When development of a feature will be spread across multiple merge
- requests, you can use the following workflow:
-
- 1. [Create a new feature flag](development.md#create-a-new-feature-flag)
- which is **off** by default, in the first merge request which uses the flag.
- Flags [should not be added separately](development.md#risk-of-a-broken-master-main-branch).
- 1. Submit incremental changes via one or more merge requests, ensuring that any
- new code added can only be reached if the feature flag is **on**.
- You can keep the feature flag enabled on your local GDK during development.
- 1. When the feature is ready to be tested, enable the feature flag for
- a specific project and ensure that there are no issues with the implementation.
- 1. When the feature is ready to be announced, create a merge request that adds
- documentation about the feature, including [documentation for the feature flag itself](../documentation/feature_flags.md),
- and a changelog entry. In the same merge request either flip the feature flag to
- be **on by default** or remove it entirely in order to enable the new behavior.
-
-One might be tempted to think that feature flags will delay the release of a
-feature by at least one month (= one release). This is not the case. A feature
-flag does not have to stick around for a specific amount of time
-(e.g. at least one release), instead they should stick around until the feature
-is deemed stable. Stable means it works on GitLab.com without causing any
-problems, such as outages.
-
-Please also read the [development guide for feature flags](development.md).
-
-### Including a feature behind feature flag in the final release
-
-In order to build a final release and present the feature for self-managed
-users, the feature flag should be at least defaulted to **on**. If the feature
-is deemed stable and there is confidence that removing the feature flag is safe,
-consider removing the feature flag altogether. It's _strongly_ recommended that
-the feature flag is [enabled **globally** on **production**](controls.md#enabling-a-feature-for-gitlabcom) for **at least one day**
-before making this decision. Unexpected bugs are sometimes discovered during this period.
-
-The process for enabling features that are disabled by default can take 5-6 days
-from when the merge request is first reviewed to when the change is deployed to
-GitLab.com. However, it is recommended to allow 10-14 days for this activity to
-account for unforeseen problems.
-
-Feature flags must be [documented according to their state (enabled/disabled)](../documentation/feature_flags.md),
-and when the state changes, docs **must** be updated accordingly.
-
-NOTE:
-Take into consideration that such action can make the feature available on
-GitLab.com shortly after the change to the feature flag is merged.
-
-Changing the default state or removing the feature flag has to be done before
-the 22nd of the month, _at least_ 3-4 working days before, in order for the change
-to be included in the final self-managed release.
-
-In addition to this, the feature behind feature flag should:
-
-- Run in all GitLab.com environments for a sufficient period of time. This time
- period depends on the feature behind the feature flag, but as a general rule of
- thumb 2-4 working days should be sufficient to gather enough feedback.
-- The feature should be exposed to all users within the GitLab.com plan during
- the above mentioned period of time. Exposing the feature to a smaller percentage
- or only a group of users might not expose a sufficient amount of information to aid in
- making a decision on feature stability.
-
-While rare, release managers may decide to reject picking or revert a change in
-a stable branch, even when feature flags are used. This might be necessary if
-the changes are deemed problematic, too invasive, or there simply isn't enough
-time to properly measure how the changes behave on GitLab.com.
-
-### The cost of feature flags
-
-When reading the above, one might be tempted to think this procedure is going to
-add a lot of work. Fortunately, this is not the case, and we'll show why. For
-this example we'll specify the cost of the work to do as a number, ranging from
-0 to infinity. The greater the number, the more expensive the work is. The cost
-does _not_ translate to time, it's just a way of measuring complexity of one
-change relative to another.
-
-Let's say we are building a new feature, and we have determined that the cost of
-this is 10. We have also determined that the cost of adding a feature flag check
-in a variety of places is 1. If we do not use feature flags, and our feature
-works as intended, our total cost is 10. This however is the best case scenario.
-Optimizing for the best case scenario is guaranteed to lead to trouble, whereas
-optimizing for the worst case scenario is almost always better.
-
-To illustrate this, let's say our feature causes an outage, and there's no
-immediate way to resolve it. This means we'd have to take the following steps to
-resolve the outage:
-
-1. Revert the release.
-1. Perform any cleanups that might be necessary, depending on the changes that
- were made.
-1. Revert the commit, ensuring the "master" branch remains stable. This is
- especially necessary if solving the problem can take days or even weeks.
-1. Pick the revert commit into the appropriate stable branches, ensuring we
- don't block any future releases until the problem is resolved.
-
-As history has shown, these steps are time consuming, complex, often involve
-many developers, and worst of all: our users will have a bad experience using
-GitLab.com until the problem is resolved.
-
-Now let's say that all of this has an associated cost of 10. This means that in
-the worst case scenario, which we should optimize for, our total cost is now 20.
-
-If we had used a feature flag, things would have been very different. We don't
-need to revert a release, and because feature flags are disabled by default we
-don't need to revert and pick any Git commits. In fact, all we have to do is
-disable the feature, and in the worst case, perform cleanup. Let's say that
-the cost of this is 2. In this case, our best case cost is 11: 10 to build the
-feature, and 1 to add the feature flag. The worst case cost is now 13:
-
-- 10 to build the feature.
-- 1 to add the feature flag.
-- 2 to disable and clean up.
-
-Here we can see that in the best case scenario the work necessary is only a tiny
-bit more compared to not using a feature flag. Meanwhile, the process of
-reverting our changes has been made significantly and reliably cheaper.
-
-In other words, feature flags do not slow down the development process. Instead,
-they speed up the process as managing incidents now becomes _much_ easier. Once
-continuous deployments are easier to perform, the time to iterate on a feature
-is reduced even further, as you no longer need to wait weeks before your changes
-are available on GitLab.com.
-
-### The benefits of feature flags
-
-It may seem like feature flags are configuration, which goes against our [convention-over-configuration](https://about.gitlab.com/handbook/product/product-principles/#convention-over-configuration)
-principle. However, configuration is by definition something that is user-manageable.
-Feature flags are not intended to be user-editable. Instead, they are intended as a tool for Engineers
-and Site Reliability Engineers to use to de-risk their changes. Feature flags are the shim that gets us
-to Continuous Delivery with our monorepo and without having to deploy the entire codebase on every change.
-Feature flags are created to ensure that we can safely rollout our work on our terms.
-If we use Feature Flags as a configuration, we are doing it wrong and are indeed in violation of our
-principles. If something needs to be configured, we should intentionally make it configuration from the
-first moment.
-
-Some of the benefits of using development-type feature flags are:
-
-1. It enables Continuous Delivery for GitLab.com.
-1. It significantly reduces Mean-Time-To-Recovery.
-1. It helps engineers to monitor and reduce the impact of their changes gradually, at any scale,
- allowing us to be more metrics-driven and execute good DevOps practices, [shifting some responsibility "left"](https://devops.com/why-its-time-for-site-reliability-engineering-to-shift-left/).
-1. Controlled feature rollout timing: without feature flags, we would need to wait until a specific
- deployment was complete (which at GitLab could be at any time).
-1. Increased psychological safety: when a feature flag is used, an engineer has the confidence that if anything goes wrong they can quickly disable the code and minimize the impact of a change that might be risky.
-1. Improved throughput: when a change is less risky because a flag exists, theoretical tests about
- scalability can potentially become unnecessary or less important. This allows an engineer to
- potentially test a feature on a small project, monitor the impact, and proceed. The alternative might
- be to build complex benchmarks locally, or on staging, or on another GitLab deployment, which has a
- large impact on the time it can take to build and release a feature.
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 08adb7faeb2..36b9064bbc4 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -10,8 +10,8 @@ We have implemented standard features that depend on configuration files in the
When implementing new features, please refer to these existing features to avoid conflicts:
- [Custom Dashboards](../operations/metrics/dashboards/index.md#add-a-new-dashboard-to-your-project): `.gitlab/dashboards/`.
-- [Issue Templates](../user/project/description_templates.md#creating-issue-templates): `.gitlab/issue_templates/`.
-- [Merge Request Templates](../user/project/description_templates.md#creating-merge-request-templates): `.gitlab/merge_request_templates/`.
+- [Issue Templates](../user/project/description_templates.md#create-an-issue-template): `.gitlab/issue_templates/`.
+- [Merge Request Templates](../user/project/description_templates.md#create-a-merge-request-template): `.gitlab/merge_request_templates/`.
- [GitLab Kubernetes Agents](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/configuration_repository.md#layout): `.gitlab/agents/`.
- [CODEOWNERS](../user/project/code_owners.md#how-to-set-up-code-owners): `.gitlab/CODEOWNERS`.
- [Route Maps](../ci/review_apps/#route-maps): `.gitlab/route-map.yml`.
diff --git a/doc/development/gemfile.md b/doc/development/gemfile.md
index 0be772db12e..f50e19bc383 100644
--- a/doc/development/gemfile.md
+++ b/doc/development/gemfile.md
@@ -31,3 +31,58 @@ You should also update npm packages that follow the current version of Rails:
- `@rails/ujs`
- `@rails/actioncable`
+
+## Upgrading dependencies because of vulnerabilities
+
+When upgrading dependencies because of a vulnerability, we
+should pin the minimal version of the gem in which the vulnerability
+was fixed in our Gemfile to avoid accidentally downgrading.
+
+For example, consider that the gem `license_finder` has `thor` as its
+dependency. `thor` was found vulnerable until its version `1.1.1`,
+which includes the vulnerability fix.
+
+In the Gemfile, make sure to pin `thor` to `1.1.1`. The direct
+dependency `license_finder` should already have the version specified.
+
+```ruby
+gem 'license_finder', '~> 6.0'
+# Dependency of license_finder with fix for vulnerability
+# _link to initial security issue that will become public in time_
+gem 'thor', '>= 1.1.1'
+```
+
+Here we're using the operator `>=` (greater than or equal to) rather
+than `~>` ([pessimistic
+operator](https://thoughtbot.com/blog/rubys-pessimistic-operator))
+making it possible to upgrade `license_finder` or any other gem to a
+version that depends on `thor 1.2`.
+
+Simlarly, if `license_finder` had a vulnerability fixed in 6.0.1, we
+should add:
+
+```ruby
+gem 'license_finder', '~> 6.0', '>= 6.0.1'
+```
+
+This way, other dependencies rather than `license_finder` can
+still depend on a newer version of `thor`, such as `6.0.2`, but would
+not be able to depend on the vulnerable version `6.0.0`.
+
+A downgrade like that could happen if we introduced a new dependency
+that also relied on thor but had its version pinned to a vulnerable
+one. These changes are easy to miss in the `Gemfile.lock`. Pinning the
+version would result in a conflict that would need to be solved.
+
+To avoid upgrading indirect dependencies, we can use [`bundle update
+--conservative`](https://bundler.io/man/bundle-update.1.html#OPTIONS).
+
+When submitting a merge request including a dependency update,
+include a link to the Gem diff between the 2 versions in the merge request
+description. You can find this link on `rubygems.org` under
+**Review Changes**. When you click it, RubyGems generates a comparison
+between the versions on `diffend.io`. For example, this is the gem
+diff for [`thor` 1.0.0 vs
+1.0.1](https://my.diffend.io/gems/thor/1.0.0/1.0.1). Use the
+links directly generated from RubyGems, since the links from GitLab or other code-hosting
+platforms might not reflect the code that's actually published.
diff --git a/doc/development/geo/framework.md b/doc/development/geo/framework.md
index e615fbc87a9..055b9ce4ad6 100644
--- a/doc/development/geo/framework.md
+++ b/doc/development/geo/framework.md
@@ -289,7 +289,7 @@ For example, to add support for files referenced by a `Widget` model with a
t.binary :verification_checksum
t.binary :verification_checksum_mismatched
t.string :verification_failure, limit: 255
- t.text :last_sync_failure
+ t.string :last_sync_failure, limit: 255
t.index :widget_id, name: :index_widget_registry_on_widget_id, unique: true
t.index :retry_at
@@ -303,8 +303,6 @@ For example, to add support for files referenced by a `Widget` model with a
end
end
end
-
- add_text_limit :widget_registry, :last_sync_failure, 255
end
def down
@@ -319,10 +317,7 @@ For example, to add support for files referenced by a `Widget` model with a
# frozen_string_literal: true
class Geo::WidgetRegistry < Geo::BaseRegistry
- include Geo::ReplicableRegistry
- # TODO: Include VerificationState in VerifiableRegistry
- # https://gitlab.com/gitlab-org/gitlab/-/issues/298811
- include ::Gitlab::Geo::VerificationState
+ include ::Geo::ReplicableRegistry
include ::Geo::VerifiableRegistry
MODEL_CLASS = ::Widget
@@ -943,7 +938,7 @@ For example, to add support for files referenced by a `Gizmos` model with a
t.bigint :gizmo_id, null: false
t.integer :state, default: 0, null: false, limit: 2
t.integer :retry_count, default: 0, limit: 2
- t.text :last_sync_failure
+ t.string :last_sync_failure, limit: 255
t.boolean :force_to_redownload
t.boolean :missing_on_primary
@@ -951,8 +946,6 @@ For example, to add support for files referenced by a `Gizmos` model with a
t.index :retry_at
t.index :state
end
-
- add_text_limit :gizmo_registry, :last_sync_failure, 255
end
def down
diff --git a/doc/development/git_object_deduplication.md b/doc/development/git_object_deduplication.md
index 00993cc2932..d9ff88aef60 100644
--- a/doc/development/git_object_deduplication.md
+++ b/doc/development/git_object_deduplication.md
@@ -1,7 +1,8 @@
---
-stage: none
-group: unassigned
+stage: Create
+group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
---
# How Git object deduplication works in GitLab
diff --git a/doc/development/go_guide/index.md b/doc/development/go_guide/index.md
index f352db918ed..745ec50bdcd 100644
--- a/doc/development/go_guide/index.md
+++ b/doc/development/go_guide/index.md
@@ -91,7 +91,7 @@ projects:
- Avoid global variables, even in packages. By doing so you introduce side
effects if the package is included multiple times.
- Use `goimports` before committing.
- [`goimports`](https://godoc.org/golang.org/x/tools/cmd/goimports)
+ [`goimports`](https://pkg.go.dev/golang.org/x/tools/cmd/goimports)
is a tool that automatically formats Go source code using
[`Gofmt`](https://golang.org/cmd/gofmt/), in addition to formatting import lines,
adding missing ones and removing unreferenced ones.
@@ -202,9 +202,9 @@ code readability and test output.
### Better output in tests
When comparing expected and actual values in tests, use
-[`testify/require.Equal`](https://godoc.org/github.com/stretchr/testify/require#Equal),
-[`testify/require.EqualError`](https://godoc.org/github.com/stretchr/testify/require#EqualError),
-[`testify/require.EqualValues`](https://godoc.org/github.com/stretchr/testify/require#EqualValues),
+[`testify/require.Equal`](https://pkg.go.dev/github.com/stretchr/testify/require#Equal),
+[`testify/require.EqualError`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualError),
+[`testify/require.EqualValues`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualValues),
and others to improve readability when comparing structs, errors,
large portions of text, or JSON documents:
@@ -363,12 +363,12 @@ There are a few guidelines one should follow when using the
[Logrus](https://github.com/sirupsen/logrus) package:
- When printing an error use
- [WithError](https://godoc.org/github.com/sirupsen/logrus#WithError). For
+ [WithError](https://pkg.go.dev/github.com/sirupsen/logrus#WithError). For
example, `logrus.WithError(err).Error("Failed to do something")`.
- Since we use [structured logging](#structured-json-logging) we can log
fields in the context of that code path, such as the URI of the request using
- [`WithField`](https://godoc.org/github.com/sirupsen/logrus#WithField) or
- [`WithFields`](https://godoc.org/github.com/sirupsen/logrus#WithFields). For
+ [`WithField`](https://pkg.go.dev/github.com/sirupsen/logrus#WithField) or
+ [`WithFields`](https://pkg.go.dev/github.com/sirupsen/logrus#WithFields). For
example, `logrus.WithField("file", "/app/go").Info("Opening dir")`. If you
have to log multiple keys, always use `WithFields` instead of calling
`WithField` more than once.
@@ -488,7 +488,7 @@ The following are some style guidelines that are specific to the Secure Team.
### Code style and format
Use `goimports -local gitlab.com/gitlab-org` before committing.
-[`goimports`](https://godoc.org/golang.org/x/tools/cmd/goimports)
+[`goimports`](https://pkg.go.dev/golang.org/x/tools/cmd/goimports)
is a tool that automatically formats Go source code using
[`Gofmt`](https://golang.org/cmd/gofmt/), in addition to formatting import lines,
adding missing ones and removing unreferenced ones.
diff --git a/doc/development/graphql_guide/graphql_pro.md b/doc/development/graphql_guide/graphql_pro.md
index 6f62d86af40..ca20d66dd87 100644
--- a/doc/development/graphql_guide/graphql_pro.md
+++ b/doc/development/graphql_guide/graphql_pro.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GraphQL Pro
-GraphQL has become a key technology in GitLab and is implemented using the
+GraphQL has become a key technology in GitLab and is implemented using the
[GraphQL Ruby gem](https://graphql-ruby.org). As such, we've purchased a subscription to
[GraphQL Pro](https://graphql.pro).
@@ -15,7 +15,7 @@ The main purpose is for support. Per the website:
> As a GraphQL::Pro customer, you get direct access to the GraphQL Ruby gem
> creator and maintainer. Get prioritized support for issues and requests.
-Note that we **cannot** use the Pro version directly in our product, since we are
+Note that we **cannot** use the Pro version directly in our product, since we are
an Open Core product - we can not require customers to purchase the Pro version, nor can we ship it.
Details on the billing account and gem licensing can be found in the Engineering 1Password vault.
diff --git a/doc/development/graphql_guide/index.md b/doc/development/graphql_guide/index.md
index fd6d8992f94..4ecb34835aa 100644
--- a/doc/development/graphql_guide/index.md
+++ b/doc/development/graphql_guide/index.md
@@ -17,6 +17,6 @@ feedback, and suggestions.
- [GraphQL API documentation style guide](../documentation/graphql_styleguide.md): documentation
style guide for GraphQL.
- [GraphQL API](../../api/graphql/index.md): user documentation for the GitLab GraphQL API.
-- [GraphQL BatchLoader](batchloader.md): development documentation on the batchloader.
+- [GraphQL BatchLoader](batchloader.md): development documentation on the BatchLoader.
- [GraphQL pagination](pagination.md): development documentation on pagination.
- [GraphQL Pro](graphql_pro.md): information on our GraphQL Pro subscription.
diff --git a/doc/development/i18n/translation.md b/doc/development/i18n/translation.md
index 25dc854d2a3..7fb49521106 100644
--- a/doc/development/i18n/translation.md
+++ b/doc/development/i18n/translation.md
@@ -22,9 +22,17 @@ You may create a new account or use any of their supported sign in services.
GitLab is being translated into many languages.
-1. Select the language you would like to contribute translations to by clicking the flag
+1. Find the language that you want to contribute to, in our
+ [GitLab Crowdin project](https://crowdin.com/project/gitlab-ee).
+ - If the language that you're looking for is available, proceed
+ to the next step.
+ - If the language you are looking for is not available,
+ [open an issue](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&utf8=✓&state=all&label_name[]=Category%3AInternationalization). Notify our Crowdin
+ administrators by including `@gitlab-org/manage/import` in your issue.
+ in the issue.
+ - After the issue/Merge Request is complete, restart this procedure.
1. Next, you can view list of files and folders.
- Click `gitlab.pot` to open the translation editor.
+ Select `gitlab.pot` to open the translation editor.
### Translation Editor
diff --git a/doc/development/image_scaling.md b/doc/development/image_scaling.md
index d447b6baf57..79687b66711 100644
--- a/doc/development/image_scaling.md
+++ b/doc/development/image_scaling.md
@@ -73,7 +73,7 @@ we simply follow the path we take to serve any ordinary upload.
### Workhorse
Assuming Rails decided the request to be valid, Workhorse will take over. Upon receiving the `send-scaled-image`
-instruction through the Rails response, a [special response injecter](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go)
+instruction through the Rails response, a [special response injector](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go)
will be invoked that knows how to rescale images. The only inputs it requires are the location of the image
(a path if the image resides in block storage, or a URL to remote storage otherwise) and the desired width.
Workhorse will handle the location transparently so Rails does not need to be concerned with where the image
diff --git a/doc/development/integrations/jenkins.md b/doc/development/integrations/jenkins.md
index 16aba023fab..f54abfd17fd 100644
--- a/doc/development/integrations/jenkins.md
+++ b/doc/development/integrations/jenkins.md
@@ -8,6 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This is a step by step guide on how to set up [Jenkins](https://www.jenkins.io/) on your local machine and connect to it from your GitLab instance. GitLab triggers webhooks on Jenkins, and Jenkins connects to GitLab using the API. By running both applications on the same machine, we can make sure they are able to access each other.
+For configuring an existing Jenkins integration, read [Jenkins CI service](../../integration/jenkins.md).
+
## Install Jenkins
Install Jenkins and start the service using Homebrew.
@@ -39,62 +41,20 @@ Jenkins uses the GitLab API and needs an access token.
## Configure Jenkins
-Configure your GitLab API connection in Jenkins.
-
-1. Make sure the GitLab plugin is installed on Jenkins. You can manage plugins in **Manage Jenkins > Manage Plugins**.
-1. Set up the GitLab connection:
- 1. Go to **Manage Jenkins > Configure System**.
- 1. Find the **GitLab** section and check the **Enable authentication for '/project' end-point** checkbox.
-1. To add your credentials, click **Add** then choose **Jenkins Credential Provider**.
-1. Choose **GitLab API token** as the type of token.
-1. Paste your GitLab access token and click **Add**.
-1. Choose your credentials from the dropdown menu.
-1. Add your GitLab host URL. Normally `http://localhost:3000/`.
-1. Click **Save Settings**.
-
-For more details, see [GitLab documentation about Jenkins CI](../../integration/jenkins.md).
+To configure your GitLab API connection in Jenkins, read
+[Configure the Jenkins server](../../integration/jenkins.md#configure-the-jenkins-server).
## Configure Jenkins Project
-Set up the Jenkins project to run your build on. A **Freestyle** project is the easiest
-option because the Jenkins plugin updates the build status on GitLab. In a **Pipeline** project, updating the status on GitLab needs to be configured in a script.
-
-1. On your Jenkins instance, go to **New Item**.
-1. Pick a name, choose **Freestyle** or **Pipeline** and click **ok**.
-1. Choose your GitLab connection from the dropdown.
-1. Check the **Build when a change is pushed to GitLab** checkbox.
-1. Check the following checkboxes:
-
- - **Accepted Merge Request Events**
- - **Closed Merge Request Events**
-
-1. If you created a **Freestyle** project, choose **Publish build status to GitLab** in the **Post-build Actions** section.
-
- If you created a **Pipeline** project, updating the status on GitLab has to be done by the pipeline script. Add GitLab update steps as in this example:
-
- ```groovy
- pipeline {
- agent any
-
- stages {
- stage('gitlab') {
- steps {
- echo 'Notify GitLab'
- updateGitlabCommitStatus name: 'build', state: 'pending'
- updateGitlabCommitStatus name: 'build', state: 'success'
- }
- }
- }
- }
- ```
+To set up the Jenkins project you intend to run your build on, read
+[Configure the Jenkins project](../../integration/jenkins.md#configure-the-jenkins-project).
## Configure your GitLab project
-To activate the Jenkins service:
+You can configure your integration between Jenkins and GitLab:
-1. Go to your project's page, then **Settings > Integrations > Jenkins CI**.
-1. Check the **Active** checkbox and the triggers for **Push** and **Merge request**.
-1. Fill in your Jenkins host, project name, username and password and click **Test settings and save changes**.
+- With the [recommended approach for Jenkins integration](../../integration/jenkins.md#recommended-jenkins-integration).
+- [Using a webhook](../../integration/jenkins.md#webhook-integration).
## Test your setup
diff --git a/doc/development/integrations/jira_connect.md b/doc/development/integrations/jira_connect.md
index bfe523ee390..860fd88612f 100644
--- a/doc/development/integrations/jira_connect.md
+++ b/doc/development/integrations/jira_connect.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Set up a development environment
+# Set up a development environment **(FREE)**
The following are required to install and test the app:
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 1d5aced5869..fda75dad119 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -89,7 +89,7 @@ it's declared under the `reports:sast` key in the job definition, not because of
### Policies
Certain GitLab workflows, such as [AutoDevOps](../../topics/autodevops/customize.md#disable-jobs),
-define variables to indicate that given scans should be disabled. You can check for this by looking
+define CI/CD variables to indicate that given scans should be disabled. You can check for this by looking
for variables such as `DEPENDENCY_SCANNING_DISABLED`, `CONTAINER_SCANNING_DISABLED`,
`SAST_DISABLED`, and `DAST_DISABLED`. If appropriate based on the scanner type, you should then
disable running the custom scanner.
@@ -97,7 +97,7 @@ disable running the custom scanner.
GitLab also defines a `CI_PROJECT_REPOSITORY_LANGUAGES` variable, which provides the list of
languages in the repository. Depending on this value, your scanner may or may not do something different.
Language detection currently relies on the [`linguist`](https://github.com/github/linguist) Ruby gem.
-See [GitLab CI/CD predefined variables](../../ci/variables/predefined_variables.md).
+See the [predefined CI/CD variables](../../ci/variables/predefined_variables.md).
#### Policy checking example
@@ -170,23 +170,23 @@ It also generates text output on the standard output and standard error streams,
### Variables
-All CI variables are passed to the scanner as environment variables.
-The scanned project is described by the [predefined CI variables](../../ci/variables/README.md).
+All CI/CD variables are passed to the scanner as environment variables.
+The scanned project is described by the [predefined CI/CD variables](../../ci/variables/README.md).
#### SAST and Dependency Scanning
-SAST and Dependency Scanning scanners must scan the files in the project directory, given by the `CI_PROJECT_DIR` variable.
+SAST and Dependency Scanning scanners must scan the files in the project directory, given by the `CI_PROJECT_DIR` CI/CD variable.
#### Container Scanning
In order to be consistent with the official Container Scanning for GitLab,
scanners must scan the Docker image whose name and tag are given by
`CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG`, respectively. If the `DOCKER_IMAGE`
-variable is provided, then the `CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG` variables
+CI/CD variable is provided, then the `CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG` variables
are ignored, and the image specified in the `DOCKER_IMAGE` variable is scanned instead.
If not provided, `CI_APPLICATION_REPOSITORY` should default to
-`$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG`, which is a combination of predefined CI variables.
+`$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG`, which is a combination of predefined CI/CD variables.
`CI_APPLICATION_TAG` should default to `CI_COMMIT_SHA`.
The scanner should sign in the Docker registry
@@ -197,13 +197,13 @@ If these are not defined, then the scanner should use
#### Configuration files
While scanners may use `CI_PROJECT_DIR` to load specific configuration files,
-it is recommended to expose configuration as environment variables, not files.
+it is recommended to expose configuration as CI/CD variables, not files.
### Output file
-Like any artifact uploaded to the GitLab CI/CD,
+Like any artifact uploaded to GitLab CI/CD,
the Secure report generated by the scanner must be written in the project directory,
-given by the `CI_PROJECT_DIR` environment variable.
+given by the `CI_PROJECT_DIR` CI/CD variable.
It is recommended to name the output file after the type of scanning, and to use `gl-` as a prefix.
Since all Secure reports are JSON files, it is recommended to use `.json` as a file extension.
@@ -242,7 +242,7 @@ Also, we recommend prefixing error messages with `[ERRO]`, warnings with `[WARN]
#### Logging level
The scanner should filter out a log message if its log level is lower than the
-one set in the `SECURE_LOG_LEVEL` variable. For instance, `info` and `warn`
+one set in the `SECURE_LOG_LEVEL` CI/CD variable. For instance, `info` and `warn`
messages should be skipped when `SECURE_LOG_LEVEL` is set to `error`. Accepted
values are as follows, listed from highest to lowest:
@@ -263,14 +263,14 @@ and what `bundle audit` writes to the standard output.
If the command line fails, then it should be logged with the `error` log level;
this makes it possible to debug the problem without having to change the log level to `debug` and rerun the scanning job.
-#### common logutil package
+#### common `logutil` package
If you are using [go](https://golang.org/) and
[common](https://gitlab.com/gitlab-org/security-products/analyzers/common),
-then it is suggested that you use [logrus](https://github.com/Sirupsen/logrus)
-and [common's logutil package](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil)
-to configure the formatter for [logrus](https://github.com/Sirupsen/logrus).
-See the [logutil README.md](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil/README.md)
+then it is suggested that you use [Logrus](https://github.com/Sirupsen/logrus)
+and [common's `logutil` package](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil)
+to configure the formatter for [Logrus](https://github.com/Sirupsen/logrus).
+See the [`logutil` README](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil/README.md)
## Report
@@ -548,7 +548,7 @@ of the available SAST Analyzers and what data is currently available.
The `remediations` field of the report is an array of remediation objects.
Each remediation describes a patch that can be applied to
-[automatically fix](../../user/application_security/#automatic-remediation-for-vulnerabilities)
+[automatically fix](../../user/application_security/#apply-an-automatic-remediation-for-a-vulnerability)
a set of vulnerabilities.
Here is an example of a report that contains remediations.
diff --git a/doc/development/integrations/secure_partner_integration.md b/doc/development/integrations/secure_partner_integration.md
index 364e18ad015..17bce13583c 100644
--- a/doc/development/integrations/secure_partner_integration.md
+++ b/doc/development/integrations/secure_partner_integration.md
@@ -13,7 +13,7 @@ guidelines so you can build an integration that fits with the workflow GitLab
users are already familiar with.
This page also provides resources for the technical work associated
-with [onboarding as a partner](https://about.gitlab.com/partners/integrate/).
+with [onboarding as a partner](https://about.gitlab.com/partners/technology-partners/integrate/).
The steps below are a high-level view of what needs to be done to complete an
integration as well as linking to more detailed resources for how to do so.
@@ -101,7 +101,7 @@ and complete an integration with the Secure stage.
- Users can interact with the findings from your artifact within their workflow. They can dismiss the findings or accept them and create a backlog issue.
- To automatically create issues without user interaction, use the [issue API](../../api/issues.md).
1. Optional: Provide auto-remediation steps:
- - If you specified `remediations` in your artifact, it is proposed through our [automatic remediation](../../user/application_security/index.md#automatic-remediation-for-vulnerabilities)
+ - If you specified `remediations` in your artifact, it is proposed through our [automatic remediation](../../user/application_security/index.md#apply-an-automatic-remediation-for-a-vulnerability)
interface.
1. Demo the integration to GitLab:
- After you have tested and are ready to demo your integration please
diff --git a/doc/development/internal_api.md b/doc/development/internal_api.md
index dce0877b1b7..7c4f869d1a7 100644
--- a/doc/development/internal_api.md
+++ b/doc/development/internal_api.md
@@ -35,12 +35,12 @@ This is called by [Gitaly](https://gitlab.com/gitlab-org/gitaly) and
[GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell) to check access to a
repository.
-When called from GitLab Shell no changes are passed and the internal
-API replies with the information needed to pass the request on to
-Gitaly.
+- **When called from GitLab Shell**: No changes are passed, and the internal
+ API replies with the information needed to pass the request on to Gitaly.
+- **When called from Gitaly in a `pre-receive` hook**: The changes are passed
+ and validated to determine if the push is allowed.
-When called from Gitaly in a `pre-receive` hook the changes are passed
-and those are validated to determine if the push is allowed.
+Calls are limited to 50 seconds each.
```plaintext
POST /internal/allowed
@@ -470,7 +470,7 @@ curl --request POST --header "Gitlab-Kas-Api-Request: <JWT token>" --header "A
## Subscriptions
-The subscriptions endpoint is used by `[customers.gitlab.com](https://gitlab.com/gitlab-org/customers-gitlab-com)` (CustomersDot)
+The subscriptions endpoint is used by [CustomersDot](https://gitlab.com/gitlab-org/customers-gitlab-com) (`customers.gitlab.com`)
in order to apply subscriptions including trials, and add-on purchases, for personal namespaces or top-level groups within GitLab.com.
### Creating a subscription
@@ -488,7 +488,7 @@ POST /namespaces/:id/gitlab_subscription
| `plan_code` | string | no | Subscription tier code |
| `seats` | integer | no | Number of seats in subscription |
| `max_seats_used` | integer | no | Highest number of active users in the last month |
-| `auto_renew` | boolean | no | Whether subscription will auto renew on end date |
+| `auto_renew` | boolean | no | Whether subscription auto-renews on end date |
| `trial` | boolean | no | Whether subscription is a trial |
| `trial_starts_on` | date | no | Start date of trial |
| `trial_ends_on` | date | no | End date of trial |
@@ -539,7 +539,7 @@ PUT /namespaces/:id/gitlab_subscription
| `plan_code` | string | no | Subscription tier code |
| `seats` | integer | no | Number of seats in subscription |
| `max_seats_used` | integer | no | Highest number of active users in the last month |
-| `auto_renew` | boolean | no | Whether subscription will auto renew on end date |
+| `auto_renew` | boolean | no | Whether subscription auto-renews on end date |
| `trial` | boolean | no | Whether subscription is a trial |
| `trial_starts_on` | date | no | Start date of trial. Required if trial is true. |
| `trial_ends_on` | date | no | End date of trial |
diff --git a/doc/development/licensed_feature_availability.md b/doc/development/licensed_feature_availability.md
index 377e31f6ab7..a9fc0414297 100644
--- a/doc/development/licensed_feature_availability.md
+++ b/doc/development/licensed_feature_availability.md
@@ -4,7 +4,7 @@ group: License
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Licensed feature availability **(STARTER)**
+# Licensed feature availability
As of GitLab 9.4, we've been supporting a simplified version of licensed
feature availability checks via `ee/app/models/license.rb`, both for
@@ -17,9 +17,9 @@ feature such as [Related issues](../user/project/issues/related_issues.md) or
[Service Desk](../user/project/service_desk.md),
it should be restricted on namespace scope.
-1. Add the feature symbol on `EES_FEATURES`, `EEP_FEATURES` or `EEU_FEATURES` constants in
- `ee/app/models/license.rb`. Note on `ee/app/models/ee/namespace.rb` that _Bronze_ GitLab.com
- features maps to on-premise _EES_, _Silver_ to _EEP_ and _Gold_ to _EEU_.
+1. Add the feature symbol on `EES_FEATURES`, `EEP_FEATURES`, or `EEU_FEATURES` constants in
+ `ee/app/models/license.rb`. Note that the prefix `EES` signifies Starter, `EEP` signifies
+ Premium, and `EEU` signifies Ultimate.
1. Check using:
```ruby
@@ -35,7 +35,7 @@ the instance license.
1. Add the feature symbol on `EES_FEATURES`, `EEP_FEATURES` or `EEU_FEATURES` constants in
`ee/app/models/license.rb`.
-1. Add the same feature symbol to `GLOBAL_FEATURES`
+1. Add the same feature symbol to `GLOBAL_FEATURES`.
1. Check using:
```ruby
diff --git a/doc/development/maintenance_mode.md b/doc/development/maintenance_mode.md
index 6b5a6045bb9..f05a731a331 100644
--- a/doc/development/maintenance_mode.md
+++ b/doc/development/maintenance_mode.md
@@ -13,7 +13,7 @@ GitLab Maintenance Mode **only** blocks writes from HTTP and SSH requests at the
- [the read-only database method](https://gitlab.com/gitlab-org/gitlab/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/database.rb#L13), which toggles special behavior when we are not allowed to write to the database. [Search the codebase for `Gitlab::Database.read_only?`.](https://gitlab.com/search?utf8=%E2%9C%93&search=Gitlab%3A%3ADatabase.read_only%3F&group_id=9970&project_id=278964&scope=blobs&search_code=false&snippets=false&repository_ref=)
- [the read-only middleware](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/middleware/read_only/controller.rb), where HTTP requests that cause database writes are blocked, unless explicitly allowed.
-- [Git push access via SSH is denied](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/git_access.rb#L13) by returning 401 when `gitlab-shell` POSTs to `/internal/allowed` to [check if access is allowed](internal_api.md#git-authentication).
+- [Git push access via SSH is denied](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/git_access.rb#L13) by returning 401 when `gitlab-shell` POSTs to [`/internal/allowed`](internal_api.md) to [check if access is allowed](internal_api.md#git-authentication).
- [Container registry authentication service](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/app/services/ee/auth/container_registry_authentication_service.rb#L12), where updates to the container registry are blocked.
The database itself is not in read-only mode (except in a Geo secondary site) and can be written by sources other than the ones blocked.
diff --git a/doc/development/merge_request_performance_guidelines.md b/doc/development/merge_request_performance_guidelines.md
index 8d5b2db828e..50362269c1b 100644
--- a/doc/development/merge_request_performance_guidelines.md
+++ b/doc/development/merge_request_performance_guidelines.md
@@ -459,7 +459,7 @@ Performance deficiencies should be addressed right away after we merge initial
changes.
Read more about when and how feature flags should be used in
-[Feature flags in GitLab development](feature_flags/process.md#feature-flags-in-gitlab-development).
+[Feature flags in GitLab development](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle#feature-flags-in-gitlab-development).
## Storage
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index e1205346585..fcecc556052 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -374,7 +374,7 @@ standard Rails migration helper methods. Calling more than one migration
helper is not a problem if they're executed on the same table.
Using the `with_lock_retries` helper method is advised when a database
-migration involves one of the [high-traffic tables](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L3).
+migration involves one of the [high-traffic tables](#high-traffic-tables).
Example changes:
@@ -605,9 +605,10 @@ When adding a foreign-key constraint to an existing column in a non-empty table,
we have to employ `add_concurrent_foreign_key` and `add_concurrent_index`
instead of `add_reference`.
-For an empty table (such as a fresh one), it is recommended to use
-`add_reference` in a single-transaction migration, combining it with other
-operations that don't require `disable_ddl_transaction!`.
+If you have a new or empty table that doesn't reference a
+[high-traffic table](#high-traffic-tables),
+we recommend that you use `add_reference` in a single-transaction migration. You can
+combine it with other operations that don't require `disable_ddl_transaction!`.
You can read more about adding [foreign key constraints to an existing column](database/add_foreign_key_to_existing_column.md).
@@ -708,11 +709,8 @@ Dropping a database table is uncommon, and the `drop_table` method
provided by Rails is generally considered safe. Before dropping the table,
please consider the following:
-If your table has foreign keys on a high-traffic table (like `projects`), then
-the `DROP TABLE` statement might fail with **statement timeout** error. Determining
-what tables are high traffic can be difficult. Self-managed instances might
-use different features of GitLab with different usage patterns, thus making
-assumptions based on GitLab.com is not enough.
+If your table has foreign keys on a [high-traffic table](#high-traffic-tables) (like `projects`), then
+the `DROP TABLE` statement is likely to stall concurrent traffic until it fails with **statement timeout** error.
Table **has no records** (feature was never in use) and **no foreign
keys**:
@@ -1027,3 +1025,20 @@ D, [2020-07-06T00:37:12.653459 #130101] DEBUG -- : AddAndSeedMyColumn::User Up
D, [2020-07-06T00:37:12.653648 #130101] DEBUG -- : ↳ config/initializers/config_initializers_active_record_locking.rb:13:in `_update_row'
== 20200705232821 AddAndSeedMyColumn: migrated (0.1706s) =====================
```
+
+## High traffic tables
+
+Here's a list of current [high-traffic tables](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml).
+
+Determining what tables are high-traffic can be difficult. Self-managed instances might use
+different features of GitLab with different usage patterns, thus making assumptions based
+on GitLab.com not enough.
+
+To identify a high-traffic table for GitLab.com the following measures are considered.
+Note that the metrics linked here are GitLab-internal only:
+
+- [Read operations](https://thanos.gitlab.net/graph?g0.range_input=2h&g0.max_source_resolution=0s&g0.expr=topk(500%2C%20sum%20by%20(relname)%20(rate(pg_stat_user_tables_seq_tup_read%7Benvironment%3D%22gprd%22%7D%5B12h%5D)%20%2B%20rate(pg_stat_user_tables_idx_scan%7Benvironment%3D%22gprd%22%7D%5B12h%5D)%20%2B%20rate(pg_stat_user_tables_idx_tup_fetch%7Benvironment%3D%22gprd%22%7D%5B12h%5D)))&g0.tab=1)
+- [Number of records](https://thanos.gitlab.net/graph?g0.range_input=2h&g0.max_source_resolution=0s&g0.expr=topk(500%2C%20sum%20by%20(relname)%20(rate(pg_stat_user_tables_n_live_tup%7Benvironment%3D%22gprd%22%7D%5B12h%5D)))&g0.tab=1)
+- [Size](https://thanos.gitlab.net/graph?g0.range_input=2h&g0.max_source_resolution=0s&g0.expr=topk(500%2C%20sum%20by%20(relname)%20(rate(pg_total_relation_size_bytes%7Benvironment%3D%22gprd%22%7D%5B12h%5D)))&g0.tab=1) is greater than 10 GB
+
+Any table which has some high read operation compared to current [high-traffic tables](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L4) might be a good candidate.
diff --git a/doc/development/multi_version_compatibility.md b/doc/development/multi_version_compatibility.md
index 25f4b3b5699..ff831bfa348 100644
--- a/doc/development/multi_version_compatibility.md
+++ b/doc/development/multi_version_compatibility.md
@@ -207,7 +207,7 @@ variable `CI_NODE_TOTAL` being an integer failed. This was caused because after
1. Old code: Runners requested a job from an API node that is running the previous version.
1. As a result, the [new code](https://gitlab.com/gitlab-org/gitlab/blob/42b82a9a3ac5a96f9152aad6cbc583c42b9fb082/app/models/concerns/ci/contextable.rb#L104)
was not run on the API server. The runner's request failed because the
-older API server tried return the `CI_NODE_TOTAL` CI variable, but
+older API server tried return the `CI_NODE_TOTAL` CI/CD variable, but
instead of sending an integer value (e.g. 9), it sent a serialized
`Hash` value (`{:number=>9, :total=>9}`).
diff --git a/doc/development/namespaces_storage_statistics.md b/doc/development/namespaces_storage_statistics.md
index 373b1e38dfc..587e1091e77 100644
--- a/doc/development/namespaces_storage_statistics.md
+++ b/doc/development/namespaces_storage_statistics.md
@@ -140,7 +140,7 @@ Even though this approach would make aggregating much easier, it has some major
- We'd have to migrate **all namespaces** by adding and filling a new column. Because of the size of the table, dealing with time/cost would be significant. The background migration would take approximately `153h`, see <https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/29772>.
- Background migration has to be shipped one release before, delaying the functionality by another milestone.
-### Attempt E (final): Update the namespace storage statistics in async way
+### Attempt E (final): Update the namespace storage statistics asynchronously
This approach consists of continuing to use the incremental statistics updates we already have,
but we refresh them through Sidekiq jobs and in different transactions:
@@ -149,7 +149,7 @@ but we refresh them through Sidekiq jobs and in different transactions:
1. Whenever the statistics of a project changes, insert a row into `namespace_aggregation_schedules`
- We don't insert a new row if there's already one related to the root namespace.
- Keeping in mind the length of the transaction that involves updating `project_statistics`(<https://gitlab.com/gitlab-org/gitlab/-/issues/29070>), the insertion should be done in a different transaction and through a Sidekiq Job.
-1. After inserting the row, we schedule another worker to be executed async at two different moments:
+1. After inserting the row, we schedule another worker to be executed asynchronously at two different moments:
- One enqueued for immediate execution and another one scheduled in `1.5h` hours.
- We only schedule the jobs, if we can obtain a `1.5h` lease on Redis on a key based on the root namespace ID.
- If we can't obtain the lease, it indicates there's another aggregation already in progress, or scheduled in no more than `1.5h`.
@@ -161,7 +161,7 @@ but we refresh them through Sidekiq jobs and in different transactions:
This implementation has the following benefits:
-- All the updates are done async, so we're not increasing the length of the transactions for `project_statistics`.
+- All the updates are done asynchronously, so we're not increasing the length of the transactions for `project_statistics`.
- We're doing the update in a single SQL query.
- It is compatible with PostgreSQL and MySQL.
- No background migration required.
diff --git a/doc/development/new_fe_guide/development/components.md b/doc/development/new_fe_guide/development/components.md
index 1d56419028e..ec714c9c26f 100644
--- a/doc/development/new_fe_guide/development/components.md
+++ b/doc/development/new_fe_guide/development/components.md
@@ -19,7 +19,7 @@ D3 is very popular across many projects outside of GitLab:
- [The New York Times](https://archive.nytimes.com/www.nytimes.com/interactive/2012/02/13/us/politics/2013-budget-proposal-graphic.html)
- [plot.ly](https://plotly.com/)
-- [Droptask](https://www.ayoa.com/previously-droptask/)
+- [Ayoa](https://www.ayoa.com/previously-droptask/)
Within GitLab, D3 has been used for the following notable features
diff --git a/doc/development/new_fe_guide/tips.md b/doc/development/new_fe_guide/tips.md
index d38e261b99f..c60d70b3b16 100644
--- a/doc/development/new_fe_guide/tips.md
+++ b/doc/development/new_fe_guide/tips.md
@@ -16,18 +16,18 @@ yarn clean
## Creating feature flags in development
-The process for creating a feature flag is the same as [enabling a feature flag in development](../feature_flags/development.md#enabling-a-feature-flag-locally-in-development).
+The process for creating a feature flag is the same as [enabling a feature flag in development](../feature_flags/index.md#enabling-a-feature-flag-locally-in-development).
Your feature flag can now be:
-- [Made available to the frontend](../feature_flags/development.md#frontend) via the `gon`
-- Queried in [tests](../feature_flags/development.md#feature-flags-in-tests)
+- [Made available to the frontend](../feature_flags/index.md#frontend) via the `gon`
+- Queried in [tests](../feature_flags/index.md#feature-flags-in-tests)
- Queried in HAML templates and Ruby files via the `Feature.enabled?(:my_shiny_new_feature_flag)` method
### More on feature flags
- [Deleting a feature flag](../../api/features.md#delete-a-feature)
-- [Manage feature flags](../feature_flags/process.md)
+- [Manage feature flags](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle)
- [Feature flags API](../../api/features.md)
## Running tests locally
diff --git a/doc/development/packages.md b/doc/development/packages.md
index 2476c876b77..e8c326da974 100644
--- a/doc/development/packages.md
+++ b/doc/development/packages.md
@@ -6,20 +6,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Packages
-This document guides you through adding another [package management system](../administration/packages/index.md) support to GitLab.
+This document guides you through adding support to GitLab for a new a [package management system](../administration/packages/index.md).
-See already supported package types in [Packages documentation](../administration/packages/index.md)
+See the already supported formats in the [Packages & Registries documentation](../user/packages/index.md)
-Since GitLab packages' UI is pretty generic, it is possible to add basic new
-package system support with solely backend changes. This guide is superficial and does
-not cover the way the code should be written. However, you can find a good example
-by looking at the following merge requests:
+It is possible to add a new format with only backend changes.
+This guide is superficial and does not cover the way the code should be written.
+However, you can find a good example by looking at the following merge requests:
-- [npm registry support](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8673).
-- [Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607).
-- [Composer repository for PHP dependencies](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22415).
-- [Terraform modules registry](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834).
-- [Instance-level endpoint for Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8757).
+- [npm registry support](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8673)
+- [Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607)
+- [Instance-level API for Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8757)
+- [NuGet group-level API](https://gitlab.com/gitlab-org/gitlab/-/issues/36423)
## General information
@@ -60,26 +58,13 @@ project are visible. Alternatively, a group-level endpoint may be used to allow
within a given group. Lastly, an instance-level endpoint can be used to allow visibility to all packages within an
entire GitLab instance.
-Using group and project level endpoints allows for more flexibility in package naming, however, more remotes
-have to be managed. Using instance level endpoints requires [stricter naming conventions](#naming-conventions).
+As an MVC, we recommend beginning with a project-level endpoint. A typical iteration plan for remote hierarchies is to go from:
-The current state of existing package registries availability is:
+- Publish and install in a project
+- Install from a group
+- Publish and install in an Instance (this is for Self-Managed customers)
-| Repository Type | Project Level | Group Level | Instance Level |
-|------------------|---------------|-------------|----------------|
-| Maven | Yes | Yes | Yes |
-| Conan | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/11679) | Yes |
-| npm | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/36853) | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/36853) |
-| NuGet | Yes | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/36425) |
-| PyPI | Yes | No | No |
-| Go | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/213900) | No - [open-issue](https://gitlab.com/gitlab-org/gitlab/-/issues/213902) |
-| Composer | Yes | Yes | No |
-| Generic | Yes | No | No |
-
-NOTE:
-npm is currently a hybrid of the instance level and group level.
-It is using the top-level group or namespace as the defining portion of the name
-(for example, `@my-group-name/my-package-name`).
+Using instance-level endpoints requires [stricter naming conventions](#naming-conventions).
NOTE:
Composer package naming scope is Instance Level.
@@ -116,8 +101,8 @@ Packages can be configured to use object storage, therefore your code must suppo
The way new package systems are integrated in GitLab is using an [MVC](https://about.gitlab.com/handbook/values/#minimum-viable-change-mvc). Therefore, the first iteration should support the bare minimum user actions:
-- Authentication
-- Uploading a package
+- Authentication with a GitLab job, personal access, project access, or deploy token
+- Uploading a package and displaying basic metadata in the user interface
- Pulling a package
- Required actions
@@ -137,7 +122,7 @@ There are usually 2 phases for the MVC:
When implementing a new package manager, it is tempting to create one large merge request containing all of the
necessary endpoints and services necessary to support basic usage. Instead, put the
-API endpoints behind a [feature flag](feature_flags/development.md) and
+API endpoints behind a [feature flag](feature_flags/index.md) and
submit each endpoint or behavior (download, upload, etc) in a different merge request to shorten the review
process.
@@ -242,6 +227,17 @@ create the package record. Workhorse provides a variety of file metadata such as
For testing purposes, you may want to [enable object storage](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/object_storage.md)
in your local development environment.
+#### File size limits
+
+Files uploaded to the GitLab Package Registry are [limited by format](../administration/instance_limits.md#package-registry-limits).
+On GitLab.com, these are typically set to 5GB to help prevent timeout issues and abuse.
+
+When a new package type is added to the `Packages::Package` model, a size limit must be added
+similar to [this example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52639/diffs#382f879fb09b0212e3cedd99e6c46e2083867216),
+or the [related test](https://gitlab.com/gitlab-org/gitlab/-/blob/fe4ba43766781371cebfacd78364a1de762917cd/spec/models/packages/package_spec.rb#L761)
+must be updated if file size limits do not apply. The only reason a size limit does not apply is if
+the package format does not upload and store package files.
+
#### Rate Limits on GitLab.com
Package manager clients can make rapid requests that exceed the
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 3b4525dc8ee..e93dc26e4fc 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -256,7 +256,7 @@ The following configuration options can be configured:
- `STACKPROF_MODE`: See [sampling modes](https://github.com/tmm1/stackprof#sampling).
Defaults to `cpu`.
- `STACKPROF_INTERVAL`: Sampling interval. Unit semantics depend on `STACKPROF_MODE`.
- For `object` mode this is a per-event interval (every `n`th event is sampled)
+ For `object` mode this is a per-event interval (every `nth` event is sampled)
and defaults to `1000`.
For other modes such as `cpu` this is a frequency and defaults to `10000` μs (100hz).
- `STACKPROF_FILE_PREFIX`: File path prefix where profiles are stored. Defaults
@@ -293,7 +293,7 @@ worker processes), selecting the latter.
For Sidekiq, the signal can be sent to the `sidekiq-cluster` process via `pkill
-USR2 bin/sidekiq-cluster`, which forwards the signal to all Sidekiq
-children. Alternatively, you can also select a specific pid of interest.
+children. Alternatively, you can also select a specific PID of interest.
Production profiles can be especially noisy. It can be helpful to visualize them
as a [flame graph](https://github.com/brendangregg/FlameGraph). This can be done
@@ -306,7 +306,7 @@ bundle exec stackprof --stackcollapse /tmp/stackprof.55769.c6c3906452.profile |
## RSpec profiling
The GitLab development environment also includes the
-[rspec_profiling](https://github.com/foraker/rspec_profiling) gem, which is used
+[`rspec_profiling`](https://github.com/foraker/rspec_profiling) gem, which is used
to collect data on spec execution times. This is useful for analyzing the
performance of the test suite itself, or seeing how the performance of a spec
may have changed over time.
@@ -347,13 +347,112 @@ example, you can find which tests take longest to run or which execute the most
queries. This can be handy for optimizing our tests or identifying performance
issues in our code.
-## Memory profiling
+## Memory optimization
-We can use two approaches, often in combination, to track down memory issues:
+We can use a set of different techniques, often in combination, to track down memory issues:
- Leaving the code intact and wrapping a profiler around it.
+- Use memory allocation counters for requests and services.
- Monitor memory usage of the process while disabling/enabling different parts of the code we suspect could be problematic.
+### Memory allocations
+
+Ruby shipped with GitLab includes a special patch to allow [tracing memory allocations](https://gitlab.com/gitlab-org/gitlab/-/issues/296530).
+This patch is available by default for
+[Omnibus](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/4948),
+[CNG](https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/591),
+[GitLab CI](https://gitlab.com/gitlab-org/gitlab-build-images/-/merge_requests/355),
+[GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit/-/merge_requests/149)
+and can additionally be enabled for [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/advanced.md#apply-custom-patches-for-ruby).
+
+This patch provides a set of 3 metrics that makes it easier to understand efficiency of memory usage for a given codepath:
+
+- `mem_objects`: the number of objects allocated.
+- `mem_bytes`: the number of bytes allocated by malloc.
+- `mem_mallocs`: the number of malloc allocations.
+
+The number of objects and bytes allocated impact how often GC cycles happen.
+Fewer objects allocations result in a significantly more responsive application.
+
+It is advised that web server requests do not allocate more than `100k mem_objects`
+and `100M mem_bytes`. You can view the current usage on [GitLab.com](https://log.gprd.gitlab.net/goto/3a9678bb595e3f89a0c7b5c61bcc47b9).
+
+#### Checking memory pressure of own code
+
+There are two ways of measuring your own code:
+
+1. Review `api_json.log`, `development_json.log`, `sidekiq.log` that includes memory allocation counters.
+1. Use `Gitlab::Memory::Instrumentation.with_memory_allocations` for a given codeblock and log it.
+1. Use [Measuring module](service_measurement.md)
+
+```json
+{"time":"2021-02-15T11:20:40.821Z","severity":"INFO","duration_s":0.27412,"db_duration_s":0.05755,"view_duration_s":0.21657,"status":201,"method":"POST","path":"/api/v4/projects/user/1","mem_objects":86705,"mem_bytes":4277179,"mem_mallocs":22693,"correlation_id":"...}
+```
+
+#### Different types of allocations
+
+The `mem_*` values represent different aspects of how objects and memory are allocated in Ruby:
+
+- The following example will create around of `1000` of `mem_objects` since strings
+ can be frozen, and while the underlying string object remains the same, we still need to allocate 1000 references to this string:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ 1_000.times { '0123456789' }
+ end
+
+ => {:mem_objects=>1001, :mem_bytes=>0, :mem_mallocs=>0}
+ ```
+
+- The following example will create around of `1000` of `mem_objects`, as strings are created dynamically.
+ Each of them will not allocate additional memory, as they fit into Ruby slot of 40 bytes:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ s = '0'
+ 1_000.times { s * 23 }
+ end
+
+ => {:mem_objects=>1002, :mem_bytes=>0, :mem_mallocs=>0}
+ ```
+
+- The following example will create around of `1000` of `mem_objects`, as strings are created dynamically.
+ Each of them will allocate additional memory as strings are larger than Ruby slot of 40 bytes:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ s = '0'
+ 1_000.times { s * 24 }
+ end
+
+ => {:mem_objects=>1002, :mem_bytes=>32000, :mem_mallocs=>1000}
+ ```
+
+- The following example will allocate over 40kB of data, and perform only a single memory allocation.
+ The existing object will be reallocated/resized on subsequent iterations:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ str = ''
+ append = '0123456789012345678901234567890123456789' # 40 bytes
+ 1_000.times { str.concat(append) }
+ end
+ => {:mem_objects=>3, :mem_bytes=>49152, :mem_mallocs=>1}
+ ```
+
+- The following example will create over 1k of objects, perform over 1k of allocations, each time mutating the object.
+ This does result in copying a lot of data and perform a lot of memory allocations
+ (as represented by `mem_bytes` counter) indicating very inefficient method of appending string:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ str = ''
+ append = '0123456789012345678901234567890123456789' # 40 bytes
+ 1_000.times { str += append }
+ end
+ => {:mem_objects=>1003, :mem_bytes=>21968752, :mem_mallocs=>1000}
+ ```
+
### Using Memory Profiler
We can use `memory_profiler` for profiling.
@@ -409,7 +508,7 @@ Fragmented Ruby heap snapshot could look like this:
![Ruby heap fragmentation](img/memory_ruby_heap_fragmentation.png)
-Memory fragmentation could be reduced by tuning GC parameters as described in [this post by Nate Berkopec](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles.
+Memory fragmentation could be reduced by tuning GC parameters [as described in this post](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles.
## Importance of Changes
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index 4d931899da6..aa3f2e6791a 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -19,7 +19,7 @@ as much as possible.
## Overview
-Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/README.md#workflowrules)
+Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/README.md#workflow)
feature of the GitLab CI/CD.
Pipelines are always created for the following scenarios:
@@ -29,7 +29,7 @@ Pipelines are always created for the following scenarios:
- Tags.
- Stable, `auto-deploy`, and security branches.
-Pipeline creation is also affected by the following CI variables:
+Pipeline creation is also affected by the following CI/CD variables:
- If `$FORCE_GITLAB_CI` is set, pipelines are created.
- If `$GITLAB_INTERNAL` is not set, pipelines are not created.
@@ -414,10 +414,10 @@ The `rspec fail-fast` is a no-op if there are more than 10 test files related to
Merge Request. This prevents `rspec fail-fast` duration from exceeding the average
`rspec` job duration and defeating its purpose.
-This number can be overridden by setting a CI variable named `RSPEC_FAIL_FAST_TEST_FILE_COUNT_THRESHOLD`.
+This number can be overridden by setting a CI/CD variable named `RSPEC_FAIL_FAST_TEST_FILE_COUNT_THRESHOLD`.
NOTE:
-This experiment is only enabled when the CI variable `RSPEC_FAIL_FAST_ENABLED=true` is set.
+This experiment is only enabled when the CI/CD variable `RSPEC_FAIL_FAST_ENABLED=true` is set.
#### Determining related test files in a Merge Request
@@ -426,7 +426,7 @@ We are using a custom mapping between source file to test files, maintained in t
### PostgreSQL versions testing
-Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.md),
+Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.html),
our test suite is currently running against PG11, since GitLab.com still runs on PG11.
We do run our test suite against PG12 on nightly scheduled pipelines as well as upon specific
@@ -531,8 +531,7 @@ several reasons:
The pre-clone step works by using the `CI_PRE_CLONE_SCRIPT` variable
[defined by GitLab.com shared runners](../user/gitlab_com/index.md#pre-clone-script).
-The `CI_PRE_CLONE_SCRIPT` is currently defined as a project CI/CD
-variable:
+The `CI_PRE_CLONE_SCRIPT` is currently defined as a project CI/CD variable:
```shell
echo "Downloading archived master..."
@@ -638,7 +637,7 @@ Some of the jobs are using images from Docker Hub, where we also use
`${GITLAB_DEPENDENCY_PROXY}` as a prefix to the image path, so that we pull
images from our [Dependency Proxy](../user/packages/dependency_proxy/index.md).
-`${GITLAB_DEPENDENCY_PROXY}` is a group variable defined in
+`${GITLAB_DEPENDENCY_PROXY}` is a group CI/CD variable defined in
[`gitlab-org`](https://gitlab.com/gitlab-org) as
`${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/`. This means when we use an image
defined as:
@@ -653,7 +652,7 @@ Docker Hub unless `${GITLAB_DEPENDENCY_PROXY}` is also defined there.
### Default variables
-In addition to the [predefined variables](../ci/variables/predefined_variables.md),
+In addition to the [predefined CI/CD variables](../ci/variables/predefined_variables.md),
each pipeline includes default variables defined in
[`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab-ci.yml).
@@ -674,12 +673,12 @@ that are scoped to a single [configuration keyword](../ci/yaml/README.md#job-key
| `.qa-cache` | Allows a job to use a default `cache` definition suitable for QA tasks. |
| `.yarn-cache` | Allows a job to use a default `cache` definition suitable for frontend jobs that do a `yarn install`. |
| `.assets-compile-cache` | Allows a job to use a default `cache` definition suitable for frontend jobs that compile assets. |
-| `.use-pg11` | Allows a job to use the `postgres:11.6` and `redis:4.0-alpine` services. |
-| `.use-pg11-ee` | Same as `.use-pg11` but also use the `docker.elastic.co/elasticsearch/elasticsearch:7.9.2` services. |
-| `.use-pg12` | Allows a job to use the `postgres:12` and `redis:4.0-alpine` services. |
-| `.use-pg12-ee` | Same as `.use-pg12` but also use the `docker.elastic.co/elasticsearch/elasticsearch:7.9.2` services. |
+| `.use-pg11` | Allows a job to run the `postgres` 11 and `redis` services (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific versions of the services). |
+| `.use-pg11-ee` | Same as `.use-pg11` but also use an `elasticsearch` service (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific version of the service). |
+| `.use-pg12` | Allows a job to use the `postgres` 12 and `redis` services (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific versions of the services). |
+| `.use-pg12-ee` | Same as `.use-pg12` but also use an `elasticsearch` service (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific version of the service). |
| `.use-kaniko` | Allows a job to use the `kaniko` tool to build Docker images. |
-| `.as-if-foss` | Simulate the FOSS project by setting the `FOSS_ONLY='1'` environment variable. |
+| `.as-if-foss` | Simulate the FOSS project by setting the `FOSS_ONLY='1'` CI/CD variable. |
| `.use-docker-in-docker` | Allows a job to use Docker in Docker. |
### `rules`, `if:` conditions and `changes:` patterns
@@ -704,13 +703,13 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `if-not-canonical-namespace` | Matches if the project isn't in the canonical (`gitlab-org/`) or security (`gitlab-org/security`) namespace. | Use to create a job for forks (by using `when: on_success|manual`), or **not** create a job for forks (by using `when: never`). |
| `if-not-ee` | Matches if the project isn't EE (i.e. project name isn't `gitlab` or `gitlab-ee`). | Use to create a job only in the FOSS project (by using `when: on_success|manual`), or **not** create a job if the project is EE (by using `when: never`). |
| `if-not-foss` | Matches if the project isn't FOSS (i.e. project name isn't `gitlab-foss`, `gitlab-ce`, or `gitlabhq`). | Use to create a job only in the EE project (by using `when: on_success|manual`), or **not** create a job if the project is FOSS (by using `when: never`). |
-| `if-default-refs` | Matches if the pipeline is for `master`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
-| `if-master-refs` | Matches if the current branch is `master`. | |
-| `if-master-push` | Matches if the current branch is `master` and pipeline source is `push`. | |
-| `if-master-schedule-2-hourly` | Matches if the current branch is `master` and pipeline runs on a 2-hourly schedule. | |
-| `if-master-schedule-nightly` | Matches if the current branch is `master` and pipeline runs on a nightly schedule. | |
+| `if-default-refs` | Matches if the pipeline is for `master`, `main`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
+| `if-master-refs` | Matches if the current branch is `master` or `main`. | |
+| `if-master-push` | Matches if the current branch is `master` or `main` and pipeline source is `push`. | |
+| `if-master-schedule-2-hourly` | Matches if the current branch is `master` or `main` and pipeline runs on a 2-hourly schedule. | |
+| `if-master-schedule-nightly` | Matches if the current branch is `master` or `main` and pipeline runs on a nightly schedule. | |
| `if-auto-deploy-branches` | Matches if the current branch is an auto-deploy one. | |
-| `if-master-or-tag` | Matches if the pipeline is for the `master` branch or for a tag. | |
+| `if-master-or-tag` | Matches if the pipeline is for the `master` or `main` branch or for a tag. | |
| `if-merge-request` | Matches if the pipeline is for a merge request. | |
| `if-merge-request-title-as-if-foss` | Matches if the pipeline is for a merge request and the MR title includes "RUN AS-IF-FOSS". | |
| `if-merge-request-title-update-caches` | Matches if the pipeline is for a merge request and the MR title includes "UPDATE CACHE". | |
@@ -719,14 +718,14 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `if-security-schedule` | Matches if the pipeline is for a security scheduled pipeline. | |
| `if-nightly-master-schedule` | Matches if the pipeline is for a `master` scheduled pipeline with `$NIGHTLY` set. | |
| `if-dot-com-gitlab-org-schedule` | Limits jobs creation to scheduled pipelines for the `gitlab-org` group on GitLab.com. | |
-| `if-dot-com-gitlab-org-master` | Limits jobs creation to the `master` branch for the `gitlab-org` group on GitLab.com. | |
+| `if-dot-com-gitlab-org-master` | Limits jobs creation to the `master` or `main` branch for the `gitlab-org` group on GitLab.com. | |
| `if-dot-com-gitlab-org-merge-request` | Limits jobs creation to merge requests for the `gitlab-org` group on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-tag` | Limits job creation to tags for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-merge-request` | Limit jobs creation to merge requests for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-tag` | Limit jobs creation to tags for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-ee-schedule` | Limits jobs to scheduled pipelines for the `gitlab-org/gitlab` project on GitLab.com. | |
| `if-cache-credentials-schedule` | Limits jobs to scheduled pipelines with the `$CI_REPO_CACHE_CREDENTIALS` variable set. | |
-| `if-rspec-fail-fast-disabled` | Limits jobs to pipelines with `$RSPEC_FAIL_FAST_ENABLED` variable not set to `"true"`. | |
+| `if-rspec-fail-fast-disabled` | Limits jobs to pipelines with `$RSPEC_FAIL_FAST_ENABLED` CI/CD variable not set to `"true"`. | |
| `if-rspec-fail-fast-skipped` | Matches if the pipeline is for a merge request and the MR title includes "SKIP RSPEC FAIL-FAST". | |
| `if-security-pipeline-merge-result` | Matches if the pipeline is for a security merge request triggered by `@gitlab-release-tools-bot`. | |
diff --git a/doc/development/product_analytics/usage_ping.md b/doc/development/product_analytics/usage_ping.md
index 79075157ce4..43acf5b7e3f 100644
--- a/doc/development/product_analytics/usage_ping.md
+++ b/doc/development/product_analytics/usage_ping.md
@@ -1,8 +1,8 @@
---
-redirect_to: '../usage_ping.md'
+redirect_to: '../usage_ping/index.md'
---
-This document was moved to [another location](../usage_ping.md).
+This document was moved to [another location](../usage_ping/index.md).
<!-- This redirect file can be deleted after April 1, 2021. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/prometheus.md b/doc/development/prometheus.md
deleted file mode 100644
index 62f30871f54..00000000000
--- a/doc/development/prometheus.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: '../user/project/integrations/prometheus.md'
----
-
-This document was moved to [another location](../user/project/integrations/prometheus.md).
-
-<!-- This redirect file can be deleted after February 1, 2021. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/query_performance.md b/doc/development/query_performance.md
index 3cb1b10c417..87e26cf42df 100644
--- a/doc/development/query_performance.md
+++ b/doc/development/query_performance.md
@@ -21,11 +21,11 @@ When you are optimizing your SQL queries, there are two dimensions to pay attent
| Queries in a migration | `100ms` | This is different than the total [migration time](database_review.md#timing-guidelines-for-migrations). |
| Concurrent operations in a migration | `5min` | Concurrent operations do not block the database, but they block the GitLab update. This includes operations such as `add_concurrent_index` and `add_concurrent_foreign_key`. |
| Background migrations | `1s` | |
-| Usage Ping | `1s` | See the [usage ping docs](usage_ping.md#developing-and-testing-usage-ping) for more details. |
+| Usage Ping | `1s` | See the [usage ping docs](usage_ping/index.md#developing-and-testing-usage-ping) for more details. |
- When analyzing your query's performance, pay attention to if the time you are seeing is on a [cold or warm cache](#cold-and-warm-cache). These guidelines apply for both cache types.
- When working with batched queries, change the range and batch size to see how it effects the query timing and caching.
-- If an existing query is already underperforming, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance.
+- If an existing query is not performing well, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance.
## Cold and warm cache
diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md
index 13bb39a4a6c..98b386497df 100644
--- a/doc/development/rake_tasks.md
+++ b/doc/development/rake_tasks.md
@@ -340,3 +340,7 @@ bundle exec rake gitlab:graphql:schema:dump
```
This uses GraphQL Ruby's built-in Rake tasks to generate files in both [IDL](https://www.prisma.io/blog/graphql-sdl-schema-definition-language-6755bcb9ce51) and JSON formats.
+
+### Update documentation and schema definitions
+
+The following command combines the intent of [Update GraphQL documentation and schema definitions](#update-graphql-documentation-and-schema-definitions) and [Update machine-readable schema files](#update-machine-readable-schema-files):
diff --git a/doc/development/redis.md b/doc/development/redis.md
index 9f90c5ee760..c7111db0cdc 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -120,14 +120,13 @@ This shows commands that have taken a long time and may be a performance
concern.
The
-[fluent-plugin-redis-slowlog](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog)
-project is responsible for taking the slowlog entries from Redis and
-passing to fluentd (and ultimately Elasticsearch).
+[`fluent-plugin-redis-slowlog`](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog)
+project is responsible for taking the `slowlog` entries from Redis and
+passing to Fluentd (and ultimately Elasticsearch).
## Analyzing the entire keyspace
-The [Redis Keyspace
-Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer)
+The [Redis Keyspace Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer)
project contains tools for dumping the full key list and memory usage of a Redis
instance, and then analyzing those lists while eliminating potentially sensitive
data from the results. It can be used to find the most frequent key patterns, or
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index 41a7defbc26..e9c95a14236 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -195,7 +195,7 @@ Go's [`regexp`](https://golang.org/pkg/regexp/) package uses `re2` and isn't vul
- [Rubular](https://rubular.com/) is a nice online tool to fiddle with Ruby Regexps.
- [Runaway Regular Expressions](https://www.regular-expressions.info/catastrophic.html)
- [The impact of regular expression denial of service (ReDoS) in practice: an empirical study at the ecosystem scale](https://people.cs.vt.edu/~davisjam/downloads/publications/DavisCoghlanServantLee-EcosystemREDOS-ESECFSE18.pdf). This research paper discusses approaches to automatically detect ReDoS vulnerabilities.
-- [Freezing the web: A study of redos vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities.
+- [Freezing the web: A study of ReDoS vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities.
## Server Side Request Forgery (SSRF)
diff --git a/doc/development/service_measurement.md b/doc/development/service_measurement.md
index 91fb8248db4..895ac540838 100644
--- a/doc/development/service_measurement.md
+++ b/doc/development/service_measurement.md
@@ -75,7 +75,7 @@ To actually use it, you need to enable measuring for the desired service by enab
### Enabling measurement using feature flags
In the following example, the `:gitlab_service_measuring_projects_import_service`
-[feature flag](feature_flags/development.md#enabling-a-feature-flag-locally-in-development) is used to enable the measuring feature
+[feature flag](feature_flags/index.md#enabling-a-feature-flag-locally-in-development) is used to enable the measuring feature
for `Projects::ImportService`.
From ChatOps:
diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md
index ce00934b35c..cff199c8b1d 100644
--- a/doc/development/sidekiq_style_guide.md
+++ b/doc/development/sidekiq_style_guide.md
@@ -588,7 +588,7 @@ the `.with_route` scope defined on all `Routable`s.
### Cron workers
-The context is automatically cleared for workers in the Cronjob queue
+The context is automatically cleared for workers in the cronjob queue
(`include CronjobQueue`), even when scheduling them from
requests. We do this to avoid incorrect metadata when other jobs are
scheduled from the cron worker.
diff --git a/doc/development/snowplow.md b/doc/development/snowplow.md
index a56e85ba50d..f5689068654 100644
--- a/doc/development/snowplow.md
+++ b/doc/development/snowplow.md
@@ -11,7 +11,7 @@ This guide provides an overview of how Snowplow works, and implementation detail
For more information about Product Intelligence, see:
- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Usage Ping Guide](usage_ping.md)
+- [Usage Ping Guide](usage_ping/index.md)
More useful links:
@@ -358,6 +358,7 @@ There are several tools for developing and testing Snowplow Event
1. For frontend events, in the MR description section, add a screenshot of the event's relevant section using the [Snowplow Analytics Debugger](https://chrome.google.com/webstore/detail/snowplow-analytics-debugg/jbnlcgeengmijcghameodeaenefieedm) Chrome browser extension.
1. For backend events, please use Snowplow Micro and add the output of the Snowplow Micro good events `GET http://localhost:9090/micro/good`.
+1. Include a member of the Product Intelligence team as a reviewer of your MR. Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR to request a review.
### Snowplow Analytics Debugger Chrome Extension
@@ -484,9 +485,9 @@ For GitLab.com, we're setting up a [QA and Testing environment](https://gitlab.c
### `gitlab_standard`
-We are currently working towards including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details.
+We are including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details.
-The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
+The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
| Field Name | Required | Type | Description |
|----------------|---------------------|-----------------------|---------------------------------------------------------------------------------------------|
diff --git a/doc/development/sql.md b/doc/development/sql.md
index f68ca44efa8..8726c1331e8 100644
--- a/doc/development/sql.md
+++ b/doc/development/sql.md
@@ -12,13 +12,13 @@ either using ActiveRecord/Arel or raw SQL queries.
## Using LIKE Statements
The most common way to search for data is using the `LIKE` statement. For
-example, to get all issues with a title starting with "WIP:" you'd write the
+example, to get all issues with a title starting with "Draft:" you'd write the
following query:
```sql
SELECT *
FROM issues
-WHERE title LIKE 'WIP:%';
+WHERE title LIKE 'Draft:%';
```
On PostgreSQL the `LIKE` statement is case-sensitive. To perform a case-insensitive
@@ -28,13 +28,13 @@ To handle this automatically you should use `LIKE` queries using Arel instead
of raw SQL fragments, as Arel automatically uses `ILIKE` on PostgreSQL.
```ruby
-Issue.where('title LIKE ?', 'WIP:%')
+Issue.where('title LIKE ?', 'Draft:%')
```
You'd write this instead:
```ruby
-Issue.where(Issue.arel_table[:title].matches('WIP:%'))
+Issue.where(Issue.arel_table[:title].matches('Draft:%'))
```
Here `matches` generates the correct `LIKE` / `ILIKE` statement depending on the
@@ -45,7 +45,7 @@ If you need to chain multiple `OR` conditions you can also do this using Arel:
```ruby
table = Issue.arel_table
-Issue.where(table[:title].matches('WIP:%').or(table[:foo].matches('WIP:%')))
+Issue.where(table[:title].matches('Draft:%').or(table[:foo].matches('Draft:%')))
```
On PostgreSQL, this produces:
@@ -53,7 +53,7 @@ On PostgreSQL, this produces:
```sql
SELECT *
FROM issues
-WHERE (title ILIKE 'WIP:%' OR foo ILIKE 'WIP:%')
+WHERE (title ILIKE 'Draft:%' OR foo ILIKE 'Draft:%')
```
## LIKE & Indexes
@@ -64,7 +64,7 @@ the start. For example, this will not use any indexes:
```sql
SELECT *
FROM issues
-WHERE title ILIKE '%WIP:%';
+WHERE title ILIKE '%Draft:%';
```
Because the value for `ILIKE` starts with a wildcard the database is not able to
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index 79ff46ae352..ee8401e08d4 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -168,7 +168,7 @@ can be used:
```ruby
RSpec.describe API::Search, factory_default: :keep do
- let_it_be(:namespace) { create_default(:namespace) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
```
Then every project we create uses this `namespace`, without us having to pass
@@ -176,13 +176,17 @@ it as `namespace: namespace`. In order to make it work along with `let_it_be`, `
must be explicitly specified. That keeps the default factory for every example in a suite instead of
recreating it for each example.
+Objects created inside a `factory_default: :keep`, and using
+`create_default` inside a `let_it_be` should be frozen to prevent accidental reliance
+between test examples.
+
Maybe we don't need to create 208 different projects - we
can create one and reuse it. In addition, we can see that only about 1/3 of the
projects we create are ones we ask for (76/208). There is benefit in setting
a default value for projects as well:
```ruby
- let_it_be(:project) { create_default(:project) }
+ let_it_be(:project) { create_default(:project).freeze }
```
In this case, the `total time` and `top-level time` numbers match more closely:
@@ -541,7 +545,7 @@ end
### Feature flags in tests
-This section was moved to [developing with feature flags](../feature_flags/development.md).
+This section was moved to [developing with feature flags](../feature_flags/index.md).
### Pristine test environments
@@ -796,10 +800,11 @@ end
```
WARNING:
-Only use simple values as input in the `where` block. Using procs, stateful
+Only use simple values as input in the `where` block. Using
+<!-- vale gitlab.Spelling = NO --> procs, stateful
objects, FactoryBot-created objects, and similar items can lead to
[unexpected results](https://github.com/tomykaira/rspec-parameterized/issues/8).
-
+<!-- vale gitlab.Spelling = YES -->
### Prometheus tests
Prometheus metrics may be preserved from one test run to another. To ensure that metrics are
@@ -981,6 +986,7 @@ GitLab uses [factory_bot](https://github.com/thoughtbot/factory_bot) as a test f
See [issue #262624](https://gitlab.com/gitlab-org/gitlab/-/issues/262624) for further context.
- Factories don't have to be limited to `ActiveRecord` objects.
[See example](https://gitlab.com/gitlab-org/gitlab-foss/commit/0b8cefd3b2385a21cfed779bd659978c0402766d).
+- Factories and their traits should produce valid objects that are [verified by specs](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/factories_spec.rb).
### Fixtures
diff --git a/doc/development/testing_guide/end_to_end/best_practices.md b/doc/development/testing_guide/end_to_end/best_practices.md
index a5a2d2a1113..2b4212a0172 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -309,10 +309,10 @@ This action can also unintentionally click other elements, altering the test sta
# Clicking another element to blur an input
def add_issue_to_epic(issue_url)
find_element(:issue_actions_split_button).find('button', text: 'Add an issue').click
- fill_element :add_issue_input, issue_url
+ fill_element(:add_issue_input, issue_url)
# Clicking the title blurs the input
- click_element :title
- click_element :add_issue_button
+ click_element(:title)
+ click_element(:add_issue_button)
end
# Using native mouse click events in the case of a mask/overlay
diff --git a/doc/development/testing_guide/end_to_end/dynamic_element_validation.md b/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
index 1e7f528f6ff..6c504e6fa28 100644
--- a/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
+++ b/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
@@ -39,7 +39,7 @@ appear on the webpage, or the test to navigate away from the page entirely.
Dynamic element validation is instituted when using
```ruby
-click_element :my_element, Some::Page
+click_element(:my_element, Some::Page)
```
### Required Elements
@@ -79,7 +79,7 @@ class MyPage < Page::Base
end
def open_layer
- click_element :my_element, Layer::MyLayer
+ click_element(:my_element, Layer::MyLayer)
end
end
@@ -109,7 +109,7 @@ Given the [source](#examples) ...
```ruby
def open_layer
- click_element :my_element, Layer::MyLayer
+ click_element(:my_element, Layer::MyLayer)
end
```
diff --git a/doc/development/testing_guide/end_to_end/environment_selection.md b/doc/development/testing_guide/end_to_end/environment_selection.md
index 7e34b6c265d..bcdf0e104dd 100644
--- a/doc/development/testing_guide/end_to_end/environment_selection.md
+++ b/doc/development/testing_guide/end_to_end/environment_selection.md
@@ -58,7 +58,7 @@ end
If the test has a `before` or `after`, you must add the `only` metadata
to the outer `RSpec.describe`.
-If you want to run an `only: { :pipeline }` tagged test on your local GDK make sure either the `CI_PROJECT_NAME` environment variable is unset, or that the `CI_PROJECT_NAME` environment variable matches the specified pipeline in the `only: { :pipeline }` tag, or just delete the `only: { :pipeline }` tag.
+If you want to run an `only: { :pipeline }` tagged test on your local GDK make sure either the `CI_PROJECT_NAME` CI/CD variable is unset, or that the `CI_PROJECT_NAME` variable matches the specified pipeline in the `only: { :pipeline }` tag, or just delete the `only: { :pipeline }` tag.
## Quarantining a test for a specific environment
diff --git a/doc/development/testing_guide/end_to_end/feature_flags.md b/doc/development/testing_guide/end_to_end/feature_flags.md
index 1bc33b79c7c..e3719393d41 100644
--- a/doc/development/testing_guide/end_to_end/feature_flags.md
+++ b/doc/development/testing_guide/end_to_end/feature_flags.md
@@ -18,8 +18,8 @@ Please be sure to include the tag `:requires_admin` so that the test can be skip
where admin access is not available.
WARNING:
-You are strongly advised to [enable feature flags only for a group, project, user](../../feature_flags/development.md#feature-actors),
-or [feature group](../../feature_flags/development.md#feature-groups). This makes it possible to
+You are strongly advised to [enable feature flags only for a group, project, user](../../feature_flags/index.md#feature-actors),
+or [feature group](../../feature_flags/index.md#feature-groups). This makes it possible to
test a feature in a shared environment without affecting other users.
For example, the code below would enable a feature flag named `:feature_flag_name` for the project
diff --git a/doc/development/testing_guide/end_to_end/page_objects.md b/doc/development/testing_guide/end_to_end/page_objects.md
index d9309f74e0e..b124ac430f6 100644
--- a/doc/development/testing_guide/end_to_end/page_objects.md
+++ b/doc/development/testing_guide/end_to_end/page_objects.md
@@ -201,7 +201,7 @@ We can select on that specific issue by matching on the Rails model.
```ruby
class Page::Project::Issues::Index < Page::Base
def has_issue?(issue)
- has_element? :issue, issue_title: issue
+ has_element?(:issue, issue_title: issue)
end
end
```
diff --git a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
index b6293ec41b8..ea48a3aa8b8 100644
--- a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
+++ b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
@@ -151,7 +151,7 @@ To run the Monitor tests locally, against the GDK, please follow the preparation
1. The test setup deploys the app in a Kubernetes cluster, using the Auto DevOps deployment strategy.
To enable Auto DevOps in GDK, follow the [associated setup](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/auto_devops/index.md#setup) instructions. If you have problems, review the [troubleshooting guide](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/auto_devops/tips_and_troubleshooting.md) or reach out to the `#gdk` channel in the internal GitLab Slack.
1. Do [secure your GitLab instance](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/auto_devops/index.md#secure-your-gitlab-instance) since it is now publicly accessible on `https://[YOUR-PORT].qa-tunnel.gitlab.info`.
-1. Install the Kubernetes command line tool known as `kubectl`. Use the [official installation instructions](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+1. Install the Kubernetes command line tool known as `kubectl`. Use the [official installation instructions](https://kubernetes.io/docs/tasks/tools/).
You might see NGINX issues when you run `gdk start` or `gdk restart`. In that case, run `sft login` to revalidate your credentials and regain access the QA Tunnel.
diff --git a/doc/development/testing_guide/end_to_end/style_guide.md b/doc/development/testing_guide/end_to_end/style_guide.md
index ac4d26df794..f9c13d5dd67 100644
--- a/doc/development/testing_guide/end_to_end/style_guide.md
+++ b/doc/development/testing_guide/end_to_end/style_guide.md
@@ -19,7 +19,7 @@ E.g.:
```ruby
def click_ci_cd_pipelines
within_sidebar do
- click_element :link_pipelines
+ click_element(:link_pipelines)
end
end
```
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 73fce3a38d7..9facca10142 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -126,7 +126,7 @@ It does not make sense to test our `getFahrenheit` function because underneath i
Let's take a short look into Vue land. Vue is a critical part of the GitLab JavaScript codebase. When writing specs for Vue components, a common gotcha is to actually end up testing Vue provided functionality, because it appears to be the easiest thing to test. Here's an example taken from our codebase.
```javascript
-// Component
+// Component script
{
computed: {
hasMetricTypes() {
@@ -135,27 +135,46 @@ Let's take a short look into Vue land. Vue is a critical part of the GitLab Java
}
```
-and here's the corresponding spec
+```html
+<!-- Component template -->
+<template>
+ <gl-dropdown v-if="hasMetricTypes">
+ <!-- Dropdown content -->
+ </gl-dropdown>
+</template>
+```
+
+Testing the `hasMetricTypes` computed prop would seem like a given here. But to test if the computed property is returning the length of `metricTypes`, is testing the Vue library itself. There is no value in this, besides it adding to the test suite. It's better to test a component in the way the user interacts with it: checking the rendered template.
```javascript
- describe('computed', () => {
- describe('hasMetricTypes', () => {
- it('returns true if metricTypes exist', () => {
- factory({ metricTypes });
- expect(wrapper.vm.hasMetricTypes).toBe(2);
- });
-
- it('returns true if no metricTypes exist', () => {
- factory();
- expect(wrapper.vm.hasMetricTypes).toBe(0);
- });
+// Bad
+describe('computed', () => {
+ describe('hasMetricTypes', () => {
+ it('returns true if metricTypes exist', () => {
+ factory({ metricTypes });
+ expect(wrapper.vm.hasMetricTypes).toBe(2);
+ });
+
+ it('returns true if no metricTypes exist', () => {
+ factory();
+ expect(wrapper.vm.hasMetricTypes).toBe(0);
});
+ });
});
-```
-Testing the `hasMetricTypes` computed prop would seem like a given, but to test if the computed property is returning the length of `metricTypes`, is testing the Vue library itself. There is no value in this, besides it adding to the test suite. Better is to test it in the way the user interacts with it. Probably through the template.
+// Good
+it('displays a dropdown if metricTypes exist', () => {
+ factory({ metricTypes });
+ expect(wrapper.findComponent(GlDropdown).exists()).toBe(true);
+});
+
+it('does not display a dropdown if no metricTypes exist', () => {
+ factory();
+ expect(wrapper.findComponent(GlDropdown).exists()).toBe(false);
+});
+```
-Keep an eye out for these kinds of tests, as they just make updating logic more fragile and tedious than it needs to be. This is also true for other libraries.
+Keep an eye out for these kinds of tests, as they just make updating logic more fragile and tedious than it needs to be. This is also true for other libraries. A rule of thumb here is: if you are checking a `wrapper.vm` property, you should probably stop and rethink the test to check the rendered template instead.
Some more examples can be found in the [Frontend unit tests section](testing_levels.md#frontend-unit-tests)
@@ -193,7 +212,7 @@ When it comes to querying DOM elements in your tests, it is best to uniquely and
the element.
Preferentially, this is done by targeting what the user actually sees using [DOM Testing Library](https://testing-library.com/docs/dom-testing-library/intro/).
-When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/dom-testing-library/api-queries/#byrole)
+When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/queries/byrole/)
as these enforce accessibility best practices as well. The examples below demonstrate the order of preference.
When writing Vue component unit tests, it can be wise to query children by component, so that the unit test can focus on comprehensive value coverage
@@ -539,21 +558,6 @@ When looking at this initially you'd suspect that the component is setup before
This is however not entirely true as the `destroy` method does not remove everything which has been mutated on the `wrapper` object. For functional components, destroy only removes the rendered DOM elements from the document.
-In order to ensure that a clean wrapper object and DOM are being used in each test, the breakdown of the component should rather be performed as follows:
-
-```javascript
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-```
-
-<!-- vale gitlab.Spelling = NO -->
-
-See also the [Vue Test Utils documentation on `destroy`](https://vue-test-utils.vuejs.org/api/wrapper/#destroy).
-
-<!-- vale gitlab.Spelling = YES -->
-
### Jest best practices
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34209) in GitLab 13.2.
@@ -687,7 +691,7 @@ Similarly, if you really need to use the real `Date` class, then you can import
```javascript
import { useRealDate } from 'helpers/fake_date';
-// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.).
+// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.).
describe('with real date', () => {
useRealDate();
});
@@ -1034,7 +1038,7 @@ describe "Admin::AbuseReports", :js do
end
```
-### Jest test timeout due to async imports
+### Jest test timeout due to asynchronous imports
If a module asynchronously imports some other modules at runtime, these modules must be
transpiled by the Jest loaders at runtime. It's possible that this can cause [Jest to timeout](https://gitlab.com/gitlab-org/gitlab/-/issues/280809).
@@ -1183,6 +1187,95 @@ You can download any older version of Firefox from the releases FTP server, <htt
1. Open up a terminal and run `/Applications/Firefox_Old.app/Contents/MacOS/firefox-bin -profilemanager` to create a new profile specific to that Firefox version.
1. Once the profile has been created, quit the app, and run it again like normal. You now have a working older Firefox version.
+## Snapshots
+
+By now you've probably heard of [Jest snapshot tests](https://jestjs.io/docs/en/snapshot-testing) and why they are useful for various reasons.
+To use them within GitLab, there are a few guidelines that should be highlighted:
+
+- Treat snapshots as code
+- Don't think of a snapshot file as a Blackbox
+- Care for the output of the snapshot, otherwise, it's not providing any real value. This will usually involve reading the generated snapshot file as you would read any other piece of code
+
+Think of a snapshot test as a simple way to store a raw `String` representation of what you've put into the item being tested. This can be used to evaluate changes in a component, a store, a complex piece of generated output, etc. You can see more in the list below for some recommended `Do's and Don'ts`.
+While snapshot tests can be a very powerful tool. They are meant to supplement, not to replace unit tests.
+
+Jest provides a great set of docs on [best practices](https://jestjs.io/docs/en/snapshot-testing#best-practices) that we should keep in mind when creating snapshots.
+
+### How does a snapshot work?
+
+A snapshot is purely a stringified version of what you ask to be tested on the lefthand side of the function call. This means any kind of changes you make to the formatting of the string has an impact on the outcome. This process is done by leveraging serializers for an automatic transform step. For Vue this is already taken care of by leveraging the `vue-jest` package, which offers the proper serializer.
+
+Should the outcome of your spec be different from what is in the generated snapshot file, you'll be notified about it by a failing test in your test suite.
+
+Find all the details in Jests official documentation [https://jestjs.io/docs/en/snapshot-testing](https://jestjs.io/docs/en/snapshot-testing)
+
+### How to take a snapshot
+
+```javascript
+it('makes the name look pretty', () => {
+ expect(prettifyName('Homer Simpson')).toMatchSnapshot()
+})
+```
+
+When this test runs the first time a fresh `.snap` file will be created. It will look something like this:
+
+```txt
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`makes the name look pretty`] = `
+Sir Homer Simpson the Third
+`
+```
+
+Now, every time you call this test, the new snapshot will be evaluated against the previously created version. This should highlight the fact that it's important to understand the content of your snapshot file and treat it with care. Snapshots will lose their value if the output of the snapshot is too big or complex to read, this means keeping snapshots isolated to human-readable items that can be either evaluated in a merge request review or are guaranteed to never change.
+The same can be done for `wrappers` or `elements`
+
+```javascript
+it('renders the component correctly', () => {
+ expect(wrapper).toMatchSnapshot()
+ expect(wrapper.element).toMatchSnapshot();
+})
+```
+
+The above test will create two snapshots, what's important is to decide which of the snapshots provide more value for the codebase safety i.e. if one of these snapshots changes, does that highlight a possible un-wanted break in the codebase? This can help catch unexpected changes if something in an underlying dependency changes without our knowledge.
+
+### Pros and Cons
+
+**Pros**
+
+- Speed up the creation of unit tests
+- Easy to maintain
+- Provides a good safety net to protect against accidental breakage of important HTML structures
+
+**Cons**
+
+- Is not a catch-all solution that replaces the work of integration or unit tests
+- No meaningful assertions or expectations within snapshots
+- When carelessly used with [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui) it can create fragility in tests when the underlying library changes the HTML of a component we are testing
+
+A good guideline to follow: the more complex the component you may want to steer away from just snapshot testing. But that's not to say you can't still snapshot test and test your component as normal.
+
+### When to use
+
+**Use snapshots when**
+
+- to capture a components rendered output
+- to fully or partially match templates
+- to match readable data structures
+- to verify correctly composed native HTML elements
+- as a safety net for critical structures so others don't break it by accident
+- Template heavy component
+- Not a lot of logic in the component
+- Composed of native HTML elements
+
+### When not to use
+
+**Don't use snapshots when**
+
+- To capture large data structures just to have something
+- To just have some kind of test written
+- To capture highly volatile ui elements without stubbing them (Think of GitLab UI version updates)
+
---
[Return to Testing documentation](index.md)
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index f1c74f990cb..c4194be23a4 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -109,10 +109,10 @@ subgraph "CNG-mirror pipeline"
### Auto-stopping of Review Apps
Review Apps are automatically stopped 2 days after the last deployment thanks to
-the [Environment auto-stop](../../ci/environments/index.md#environments-auto-stop) feature.
+the [Environment auto-stop](../../ci/environments/index.md#stop-an-environment-after-a-certain-time-period) feature.
If you need your Review App to stay up for a longer time, you can
-[pin its environment](../../ci/environments/index.md#auto-stop-example) or retry the
+[pin its environment](../../ci/environments/index.md#override-a-deployments-scheduled-stop-time) or retry the
`review-deploy` job to update the "latest deployed at" time.
The `review-cleanup` job that automatically runs in scheduled
diff --git a/doc/development/transient/prevention-patterns.md b/doc/development/transient/prevention-patterns.md
index 4c1e4d373e7..2bfd188fd43 100644
--- a/doc/development/transient/prevention-patterns.md
+++ b/doc/development/transient/prevention-patterns.md
@@ -10,7 +10,7 @@ This page will cover architectural patterns and tips for developers to follow to
## Common root causes
-We've noticed a few root causes that come up frequently when addressing transient bugs.
+We've noticed a few root causes that come up frequently when addressing transient bugs.
- Needs better state management in the backend or frontend.
- Frontend code needs improvements.
diff --git a/doc/development/usage_ping.md b/doc/development/usage_ping.md
index 3618d18b1bb..b8f08caaebd 100644
--- a/doc/development/usage_ping.md
+++ b/doc/development/usage_ping.md
@@ -1,1188 +1,7 @@
---
-stage: Growth
-group: Product Intelligence
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'usage_ping/index.md'
---
-# Usage Ping Guide
-
-> Introduced in GitLab Ultimate 11.2, more statistics.
-
-This guide describes Usage Ping's purpose and how it's implemented.
-
-For more information about Product Intelligence, see:
-
-- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Snowplow Guide](snowplow.md)
-
-More useful links:
-
-- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
-- [Data Analysis Process](https://about.gitlab.com/handbook/business-ops/data-team/#data-analysis-process/)
-- [Data for Product Managers](https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/)
-- [Data Infrastructure](https://about.gitlab.com/handbook/business-ops/data-team/platform/infrastructure/)
-
-## What is Usage Ping?
-
-- GitLab sends a weekly payload containing usage data to GitLab Inc. Usage Ping provides high-level data to help our product, support, and sales teams. It does not send any project names, usernames, or any other specific data. The information from the usage ping is not anonymous, it is linked to the hostname of the instance. Sending usage ping is optional, and any instance can disable analytics.
-- The usage data is primarily composed of row counts for different tables in the instance’s database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features within the product. In addition to counts, other facts
- that help us classify and understand GitLab installations are collected.
-- Usage ping is important to GitLab as we use it to calculate our Stage Monthly Active Users (SMAU) which helps us measure the success of our stages and features.
-- While usage ping is enabled, GitLab gathers data from the other instances and can show usage statistics of your instance to your users.
-
-### Why should we enable Usage Ping?
-
-- The main purpose of Usage Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions.
-- As a benefit of having the usage ping active, GitLab lets you analyze the users’ activities over time of your GitLab installation.
-- As a benefit of having the usage ping active, GitLab provides you with The DevOps Report,which gives you an overview of your entire instance’s adoption of Concurrent DevOps from planning to monitoring.
-- You get better, more proactive support. (assuming that our TAMs and support organization used the data to deliver more value)
-- You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization?
-- You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
-- Usage Ping is enabled by default. To disable it, see [Disable Usage Ping](#disable-usage-ping).
-
-### Limitations
-
-- Usage Ping does not track frontend events things like page views, link clicks, or user sessions, and only focuses on aggregated backend events.
-- Because of these limitations we recommend instrumenting your products with Snowplow for more detailed analytics on GitLab.com and use Usage Ping to track aggregated backend events on self-managed.
-
-## Usage Ping payload
-
-You can view the exact JSON payload sent to GitLab Inc. in the administration panel. To view the payload:
-
-1. Navigate to **Admin Area > Settings > Metrics and profiling**.
-1. Expand the **Usage statistics** section.
-1. Click the **Preview payload** button.
-
-For an example payload, see [Example Usage Ping payload](#example-usage-ping-payload).
-
-## Disable Usage Ping
-
-To disable Usage Ping in the GitLab UI, go to the **Settings** page of your administration panel and uncheck the **Usage Ping** checkbox.
-
-To disable Usage Ping and prevent it from being configured in the future through the administration panel, Omnibus installs can set the following in [`gitlab.rb`](https://docs.gitlab.com/omnibus/settings/configuration.html#configuration-options):
-
-```ruby
-gitlab_rails['usage_ping_enabled'] = false
-```
-
-Source installations can set the following in `gitlab.yml`:
-
-```yaml
-production: &base
- # ...
- gitlab:
- # ...
- usage_ping_enabled: false
-```
-
-## Usage Ping request flow
-
-The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
-
-```mermaid
-sequenceDiagram
- participant GitLab Instance
- participant Versions Application
- participant Licenses Application
- participant Salesforce
- participant S3 Bucket
- participant Snowflake DW
- participant Sisense Dashboards
- GitLab Instance->>Versions Application: Send Usage Ping
- loop Process usage data
- Versions Application->>Versions Application: Parse usage data
- Versions Application->>Versions Application: Write to database
- Versions Application->>Versions Application: Update license ping time
- end
- loop Process data for Salesforce
- Versions Application-xLicenses Application: Request Zuora subscription id
- Licenses Application-xVersions Application: Zuora subscription id
- Versions Application-xSalesforce: Request Zuora account id by Zuora subscription id
- Salesforce-xVersions Application: Zuora account id
- Versions Application-xSalesforce: Usage data for the Zuora account
- end
- Versions Application->>S3 Bucket: Export Versions database
- S3 Bucket->>Snowflake DW: Import data
- Snowflake DW->>Snowflake DW: Transform data using dbt
- Snowflake DW->>Sisense Dashboards: Data available for querying
- Versions Application->>GitLab Instance: DevOps Report (Conversational Development Index)
-```
-
-## How Usage Ping works
-
-1. The Usage Ping [cron job](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/gitlab_usage_ping_worker.rb#L30) is set in Sidekiq to run weekly.
-1. When the cron job runs, it calls [`Gitlab::UsageData.to_json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L22).
-1. `Gitlab::UsageData.to_json` [cascades down](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L22) to ~400+ other counter method calls.
-1. The response of all methods calls are [merged together](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L14) into a single JSON payload in `Gitlab::UsageData.to_json`.
-1. The JSON payload is then [posted to the Versions application]( https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L20)
- If a firewall exception is needed, the required URL depends on several things. If
- the hostname is `version.gitlab.com`, the protocol is `TCP`, and the port number is `443`,
- the required URL is <https://version.gitlab.com/>.
-
-## Usage Ping Metric Life cycle
-
-### 1. New metrics addition
-
-Please follow the [Implementing Usage Ping](#implementing-usage-ping) guide.
-
-### 2. Existing metric change
-
-Because we do not control when customers update their self-managed instances of GitLab,
-we **STRONGLY DISCOURAGE** changes to the logic used to calculate any metric.
-Any such changes lead to inconsistent reports from multiple GitLab instances.
-If there is a problem with an existing metric, it's best to deprecate the existing metric,
-and use it, side by side, with the desired new metric.
-
-Example:
-Consider following change. Before GitLab 12.6, the `example_metric` was implemented as:
-
-```ruby
-{
- ...
- example_metric: distinct_count(Project, :creator_id)
-}
-```
-
-For GitLab 12.6, the metric was changed to filter out archived projects:
-
-```ruby
-{
- ...
- example_metric: distinct_count(Project.non_archived, :creator_id)
-}
-```
-
-In this scenario all instances running up to GitLab 12.5 continue to report `example_metric`,
-including all archived projects, while all instances running GitLab 12.6 and higher filters
-out such projects. As Usage Ping data is collected from all reporting instances, the
-resulting dataset includes mixed data, which distorts any following business analysis.
-
-The correct approach is to add a new metric for GitLab 12.6 release with updated logic:
-
-```ruby
-{
- ...
- example_metric_without_archived: distinct_count(Project.non_archived, :creator_id)
-}
-```
-
-and update existing business analysis artefacts to use `example_metric_without_archived` instead of `example_metric`
-
-### 3. Metrics deprecation and removal
-
-The process for deprecating and removing metrics is currently under development. For
-more information, see the following [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/284637).
-
-## Implementing Usage Ping
-
-Usage Ping consists of two kinds of data, counters and observations. Counters track how often a certain event
-happened over time, such as how many CI pipelines have run. They are monotonic and always trend up.
-Observations are facts collected from one or more GitLab instances and can carry arbitrary data. There are no
-general guidelines around how to collect those, due to the individual nature of that data.
-
-There are several types of counters which are all found in `usage_data.rb`:
-
-- **Ordinary Batch Counters:** Simple count of a given ActiveRecord_Relation
-- **Distinct Batch Counters:** Distinct count of a given ActiveRecord_Relation in a given column
-- **Sum Batch Counters:** Sum the values of a given ActiveRecord_Relation in a given column
-- **Alternative Counters:** Used for settings and configurations
-- **Redis Counters:** Used for in-memory counts.
-
-NOTE:
-Only use the provided counter methods. Each counter method contains a built in fail safe to isolate each counter to avoid breaking the entire Usage Ping.
-
-### Why batch counting
-
-For large tables, PostgreSQL can take a long time to count rows due to MVCC [(Multi-version Concurrency Control)](https://en.wikipedia.org/wiki/Multiversion_concurrency_control). Batch counting is a counting method where a single large query is broken into multiple smaller queries. For example, instead of a single query querying 1,000,000 records, with batch counting, you can execute 100 queries of 10,000 records each. Batch counting is useful for avoiding database timeouts as each batch query is significantly shorter than one single long running query.
-
-For GitLab.com, there are extremely large tables with 15 second query timeouts, so we use batch counting to avoid encountering timeouts. Here are the sizes of some GitLab.com tables:
-
-| Table | Row counts in millions |
-|------------------------------|------------------------|
-| `merge_request_diff_commits` | 2280 |
-| `ci_build_trace_sections` | 1764 |
-| `merge_request_diff_files` | 1082 |
-| `events` | 514 |
-
-We have several batch counting methods available:
-
-- `Ordinary Batch Counters`
-- `Distinct Batch Counters`
-- `Sum Batch Counters`
-- `Estimated Batch Counters`
-
-Batch counting requires indexes on columns to calculate max, min, and range queries. In some cases,
-you may need to add a specialized index on the columns involved in a counter.
-
-### Ordinary Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Simple count of a given ActiveRecord_Relation, does a non-distinct batch count, smartly reduces batch_size and handles errors.
-
-Method: `count(relation, column = nil, batch: true, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the count
-- `column` the column to perform the count on, by default is the primary key
-- `batch`: default `true` to use batch counting
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-Examples:
-
-```ruby
-count(User.active)
-count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
-count(::Clusters::Cluster.aws_installed.enabled, :cluster_id, start: ::Clusters::Cluster.minimum(:id), finish: ::Clusters::Cluster.maximum(:id))
-```
-
-### Distinct Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Distinct count of a given ActiveRecord_Relation on given column, a distinct batch count, smartly reduces batch_size and handles errors.
-
-Method: `distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the count
-- `column` the column to perform the distinct count, by default is the primary key
-- `batch`: default `true` to use batch counting
-- `batch_size`: if none set it uses default value 10000 from `Gitlab::Database::BatchCounter`
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-WARNING:
-Counting over non-unique columns can lead to performance issues. Take a look at the [iterating tables in batches](iterating_tables_in_batches.md) guide for more details.
-
-Examples:
-
-```ruby
-distinct_count(::Project, :creator_id)
-distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
-distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
-```
-
-### Sum Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Sum the values of a given ActiveRecord_Relation on given column and handles errors.
-
-Method: `sum(relation, column, batch_size: nil, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the operation
-- `column` the column to sum on
-- `batch_size`: if none set it uses default value 1000 from `Gitlab::Database::BatchCounter`
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-Examples:
-
-```ruby
-sum(JiraImportState.finished, :imported_issues_count)
-```
-
-### Grouping & Batch Operations
-
-The `count`, `distinct_count`, and `sum` batch counters can accept an `ActiveRecord::Relation`
-object, which groups by a specified column. With a grouped relation, the methods do batch counting,
-handle errors, and returns a hash table of key-value pairs.
-
-Examples:
-
-```ruby
-count(Namespace.group(:type))
-# returns => {nil=>179, "Group"=>54}
-
-distinct_count(Project.group(:visibility_level), :creator_id)
-# returns => {0=>1, 10=>1, 20=>11}
-
-sum(Issue.group(:state_id), :weight))
-# returns => {1=>3542, 2=>6820}
-```
-
-### Estimated Batch Counters
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48233) in GitLab 13.7.
-
-Estimated batch counter functionality handles `ActiveRecord::StatementInvalid` errors
-when used through the provided `estimate_batch_distinct_count` method.
-Errors return a value of `-1`.
-
-WARNING:
-This functionality estimates a distinct count of a specific ActiveRecord_Relation in a given column,
-which uses the [HyperLogLog](http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf) algorithm.
-As the HyperLogLog algorithm is probabilistic, the **results always include error**.
-The highest encountered error rate is 4.9%.
-
-When correctly used, the `estimate_batch_distinct_count` method enables efficient counting over
-columns that contain non-unique values, which can not be assured by other counters.
-
-Method: [`estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
-
-The method includes the following arguments:
-
-- `relation`: The ActiveRecord_Relation to perform the count.
-- `column`: The column to perform the distinct count. The default is the primary key.
-- `batch_size`: The default is 10,000, from `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`.
-- `start`: The custom start of the batch count, to avoid complex minimum calculations.
-- `finish`: The custom end of the batch count to avoid complex maximum calculations.
-
-The method includes the following prerequisites:
-
-1. The supplied `relation` must include the primary key defined as the numeric column.
- For example: `id bigint NOT NULL`.
-1. The `estimate_batch_distinct_count` can handle a joined relation. To use its ability to
- count non-unique columns, the joined relation **must NOT** have a one-to-many relationship,
- such as `has_many :boards`.
-1. Both `start` and `finish` arguments should always represent primary key relationship values,
- even if the estimated count refers to another column, for example:
-
- ```ruby
- estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
- ```
-
-Examples:
-
-1. Simple execution of estimated batch counter, with only relation provided,
- returned value represents estimated number of unique values in `id` column
- (which is the primary key) of `Project` relation:
-
- ```ruby
- estimate_batch_distinct_count(::Project)
- ```
-
-1. Execution of estimated batch counter, where provided relation has applied
- additional filter (`.where(time_period)`), number of unique values estimated
- in custom column (`:author_id`), and parameters: `start` and `finish` together
- apply boundaries that defines range of provided relation to analyze:
-
- ```ruby
- estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
- ```
-
-1. Execution of estimated batch counter with joined relation (`joins(:cluster)`),
- for a custom column (`'clusters.user_id'`):
-
- ```ruby
- estimate_batch_distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
- ```
-
-When instrumenting metric with usage of estimated batch counter please add
-`_estimated` suffix to its name, for example:
-
-```ruby
- "counts": {
- "ci_builds_estimated": estimate_batch_distinct_count(Ci::Build),
- ...
-```
-
-### Redis Counters
-
-Handles `::Redis::CommandError` and `Gitlab::UsageDataCounters::BaseCounter::UnknownEvent`
-returns -1 when a block is sent or hash with all values -1 when a `counter(Gitlab::UsageDataCounters)` is sent
-different behavior due to 2 different implementations of Redis counter
-
-Method: `redis_usage_data(counter, &block)`
-
-Arguments:
-
-- `counter`: a counter from `Gitlab::UsageDataCounters`, that has `fallback_totals` method implemented
-- or a `block`: which is evaluated
-
-#### Ordinary Redis Counters
-
-Examples of implementation:
-
-- Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
-- Using Redis methods [`HINCRBY`](https://redis.io/commands/hincrby), [`HGETALL`](https://redis.io/commands/hgetall), and [`Gitlab::UsageCounters::PodLogs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_counters/pod_logs.rb)
-
-##### UsageData API Tracking
-
-<!-- There's nearly identical content in `##### Adding new events`. If you fix errors here, you may need to fix the same errors in the other location. -->
-
-1. Track event using `UsageData` API
-
- Increment event count using ordinary Redis counter, for given event name.
-
- Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
-
- API requests are protected by checking for a valid CSRF token.
-
- To be able to increment the values, the related feature `usage_data_<event_name>` should be enabled.
-
- ```plaintext
- POST /usage_data/increment_counter
- ```
-
- | Attribute | Type | Required | Description |
- | :-------- | :--- | :------- | :---------- |
- | `event` | string | yes | The event name it should be tracked |
-
- Response
-
- - `200` if event was tracked
- - `400 Bad request` if event parameter is missing
- - `401 Unauthorized` if user is not authenticated
- - `403 Forbidden` for invalid CSRF token provided
-
-1. Track events using JavaScript/Vue API helper which calls the API above
-
- Note that `usage_data_api` and `usage_data_#{event_name}` should be enabled to be able to track events
-
- ```javascript
- import api from '~/api';
-
- api.trackRedisCounterEvent('my_already_defined_event_name'),
- ```
-
-#### Redis HLL Counters
-
-WARNING:
-HyperLogLog (HLL) is a probabilistic algorithm and its **results always includes some small error**. According to [Redis documentation](https://redis.io/commands/pfcount), data from
-used HLL implementation is "approximated with a standard error of 0.81%".
-
-With `Gitlab::UsageDataCounters::HLLRedisCounter` we have available data structures used to count unique values.
-
-Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PFCOUNT](https://redis.io/commands/pfcount).
-
-##### Adding new events
-
-1. Define events in [`known_events`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/).
-
- Example event:
-
- ```yaml
- - name: i_compliance_credential_inventory
- category: compliance
- redis_slot: compliance
- expiry: 42 # 6 weeks
- aggregation: weekly
- ```
-
- Keys:
-
- - `name`: unique event name.
-
- Name format `<prefix>_<redis_slot>_name`.
-
- Use one of the following prefixes for the event's name:
-
- - `g_` for group, as an event which is tracked for group.
- - `p_` for project, as an event which is tracked for project.
- - `i_` for instance, as an event which is tracked for instance.
- - `a_` for events encompassing all `g_`, `p_`, `i_`.
- - `o_` for other.
-
- Consider including in the event's name the Redis slot to be able to count totals for a specific category.
-
- Example names: `i_compliance_credential_inventory`, `g_analytics_contribution`.
-
- - `category`: event category. Used for getting total counts for events in a category, for easier
- access to a group of events.
- - `redis_slot`: optional Redis slot; default value: event name. Used if needed to calculate totals
- for a group of metrics. Ensure keys are in the same slot. For example:
- `i_compliance_credential_inventory` with `redis_slot: 'compliance'` builds Redis key
- `i_{compliance}_credential_inventory-2020-34`. If `redis_slot` is not defined the Redis key will
- be `{i_compliance_credential_inventory}-2020-34`.
- - `expiry`: expiry time in days. Default: 29 days for daily aggregation and 6 weeks for weekly
- aggregation.
- - `aggregation`: may be set to a `:daily` or `:weekly` key. Defines how counting data is stored in Redis.
- Aggregation on a `daily` basis does not pull more fine grained data.
- - `feature_flag`: optional `default_enabled: :yaml`. If no feature flag is set then the tracking is enabled. For details, see our [GitLab internal Feature flags](feature_flags/) documentation. The feature flags are owned by the group adding the event tracking.
-
-Use one of the following methods to track events:
-
-1. Track event in controller using `RedisTracking` module with `track_redis_hll_event(*controller_actions, name:, if: nil)`.
-
- Arguments:
-
- - `controller_actions`: controller actions we want to track.
- - `name`: event name.
- - `if`: optional custom conditions, using the same format as with Rails callbacks.
-
- Example usage:
-
- ```ruby
- # controller
- class ProjectsController < Projects::ApplicationController
- include RedisTracking
-
- skip_before_action :authenticate_user!, only: :show
- track_redis_hll_event :index, :show, name: 'g_compliance_example_feature_visitors'
-
- def index
- render html: 'index'
- end
-
- def new
- render html: 'new'
- end
-
- def show
- render html: 'show'
- end
- end
- ```
-
-1. Track event in API using `increment_unique_values(event_name, values)` helper method.
-
- To be able to track the event, Usage Ping must be enabled and the event feature `usage_data_<event_name>` must be enabled.
-
- Arguments:
-
- - `event_name`: event name.
- - `values`: values counted, one value or array of values.
-
- Example usage:
-
- ```ruby
- get ':id/registry/repositories' do
- repositories = ContainerRepositoriesFinder.new(
- user: current_user, subject: user_group
- ).execute
-
- increment_unique_values('i_list_repositories', current_user.id)
-
- present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
- end
- ```
-
-1. Track event using `track_usage_event(event_name, values) in services and GraphQL
-
- Increment unique values count using Redis HLL, for given event name.
-
- Example:
-
- [Track usage event for incident created in service](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/services/issues/update_service.rb#L66)
-
- [Track usage event for incident created in GraphQL](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/graphql/mutations/alert_management/update_alert_status.rb#L16)
-
- ```ruby
- track_usage_event(:incident_management_incident_created, current_user.id)
- ```
-
-<!-- There's nearly identical content in `##### UsageData API Tracking`. If you find / fix errors here, you may need to fix errors in that section too. -->
-
-1. Track event using `UsageData` API
-
- Increment unique users count using Redis HLL, for given event name.
-
- Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
-
- API requests are protected by checking for a valid CSRF token.
-
- To increment the values, the related feature `usage_data_<event_name>` should be
- set to `default_enabled: true`. For more information, see
- [Feature flags in development of GitLab](feature_flags/index.md).
-
- ```plaintext
- POST /usage_data/increment_unique_users
- ```
-
- | Attribute | Type | Required | Description |
- | :-------- | :--- | :------- | :---------- |
- | `event` | string | yes | The event name it should be tracked |
-
- Response
-
- Return 200 if tracking failed for any reason.
-
- - `200` if event was tracked or any errors
- - `400 Bad request` if event parameter is missing
- - `401 Unauthorized` if user is not authenticated
- - `403 Forbidden` for invalid CSRF token provided
-
-1. Track events using JavaScript/Vue API helper which calls the API above
-
- Example usage for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/):
-
- Usage Data API is behind `usage_data_api` feature flag which, as of GitLab 13.7, is
- now set to `default_enabled: true`.
-
- Each event tracked using Usage Data API is behind a feature flag `usage_data_#{event_name}` which should be `default_enabled: true`
-
- ```javascript
- import api from '~/api';
-
- api.trackRedisHllUserEvent('my_already_defined_event_name'),
- ```
-
-1. Get event data using `Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names:, start_date:, end_date:, context: '')`.
-
- Arguments:
-
- - `event_names`: the list of event names.
- - `start_date`: start date of the period for which we want to get event data.
- - `end_date`: end date of the period for which we want to get event data.
- - `context`: context of the event. Allowed values are `default`, `free`, `bronze`, `silver`, `gold`, `starter`, `premium`, `ultimate`.
-
-1. Testing tracking and getting unique events
-
-Trigger events in rails console by using `track_event` method
-
- ```ruby
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: 1)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: [2, 3])
- ```
-
-Next, get the unique events for the current week.
-
- ```ruby
- # Get unique events for metric for current_week
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'g_compliance_audit_events',
- start_date: Date.current.beginning_of_week, end_date: Date.current.next_week)
- ```
-
-##### Recommendations
-
-We have the following recommendations for [Adding new events](#adding-new-events):
-
-- Event aggregation: weekly.
-- Key expiry time:
- - Daily: 29 days.
- - Weekly: 42 days.
-- When adding new metrics, use a [feature flag](../operations/feature_flags.md) to control the impact.
-- For feature flags triggered by another service, set `default_enabled: false`,
- - Events can be triggered using the `UsageData` API, which helps when there are > 10 events per change
-
-##### Enable/Disable Redis HLL tracking
-
-Events are tracked behind [feature flags](feature_flags/index.md) due to concerns for Redis performance and scalability.
-
-For a full list of events and corresponding feature flags see, [known_events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/) files.
-
-To enable or disable tracking for specific event within <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
-[enable or disable the corresponding feature](feature_flags/index.md).
-
-```shell
-/chatops run feature set <feature_name> true
-/chatops run feature set <feature_name> false
-```
-
-##### Known events are added automatically in usage data payload
-
-All events added in [`known_events/common.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml) are automatically added to usage data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L209).
-For each event we add metrics for the weekly and monthly time frames, and totals for each where applicable:
-
-- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#adding-new-events) events and data for the last complete week for weekly [aggregation](#adding-new-events) events.
-- `#{event_name}_monthly`: Data for 28 days for daily [aggregation](#adding-new-events) events and data for the last 4 complete weeks for weekly [aggregation](#adding-new-events) events.
-
-Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation and Redis slot.
-
-- `#{category}_total_unique_counts_weekly`: Total unique counts for events in the same category for the last 7 days or the last complete week, if events are in the same Redis slot and we have more than one metric.
-- `#{category}_total_unique_counts_monthly`: Total unique counts for events in same category for the last 28 days or the last 4 complete weeks, if events are in the same Redis slot and we have more than one metric.
-
-Example of `redis_hll_counters` data:
-
-```ruby
-{:redis_hll_counters=>
- {"compliance"=>
- {"g_compliance_dashboard_weekly"=>0,
- "g_compliance_dashboard_monthly"=>0,
- "g_compliance_audit_events_weekly"=>0,
- "g_compliance_audit_events_monthly"=>0,
- "compliance_total_unique_counts_weekly"=>0,
- "compliance_total_unique_counts_monthly"=>0},
- "analytics"=>
- {"g_analytics_contribution_weekly"=>0,
- "g_analytics_contribution_monthly"=>0,
- "g_analytics_insights_weekly"=>0,
- "g_analytics_insights_monthly"=>0,
- "analytics_total_unique_counts_weekly"=>0,
- "analytics_total_unique_counts_monthly"=>0},
- "ide_edit"=>
- {"g_edit_by_web_ide_weekly"=>0,
- "g_edit_by_web_ide_monthly"=>0,
- "g_edit_by_sfe_weekly"=>0,
- "g_edit_by_sfe_monthly"=>0,
- "ide_edit_total_unique_counts_weekly"=>0,
- "ide_edit_total_unique_counts_monthly"=>0},
- "search"=>
- {"i_search_total_weekly"=>0, "i_search_total_monthly"=>0, "i_search_advanced_weekly"=>0, "i_search_advanced_monthly"=>0, "i_search_paid_weekly"=>0, "i_search_paid_monthly"=>0, "search_total_unique_counts_weekly"=>0, "search_total_unique_counts_monthly"=>0},
- "source_code"=>{"wiki_action_weekly"=>0, "wiki_action_monthly"=>0}
- }
-```
-
-Example usage:
-
-```ruby
-# Redis Counters
-redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
-redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
-
-# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
-
-# Tracking events
-Gitlab::UsageDataCounters::HLLRedisCounter.track_event('expand_vulnerabilities', values: visitor_id)
-
-# Get unique events for metric
-redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'expand_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
-```
-
-### Alternative Counters
-
-Handles `StandardError` and fallbacks into -1 this way not all measures fail if we encounter one exception.
-Mainly used for settings and configurations.
-
-Method: `alt_usage_data(value = nil, fallback: -1, &block)`
-
-Arguments:
-
-- `value`: a simple static value in which case the value is simply returned.
-- or a `block`: which is evaluated
-- `fallback: -1`: the common value used for any metrics that are failing.
-
-Example of usage:
-
-```ruby
-alt_usage_data { Gitlab::VERSION }
-alt_usage_data { Gitlab::CurrentSettings.uuid }
-alt_usage_data(999)
-```
-
-### Prometheus Queries
-
-In those cases where operational metrics should be part of Usage Ping, a database or Redis query is unlikely
-to provide useful data. Instead, Prometheus might be more appropriate, since most GitLab architectural
-components publish metrics to it that can be queried back, aggregated, and included as usage data.
-
-NOTE:
-Prometheus as a data source for Usage Ping is currently only available for single-node Omnibus installations
-that are running the [bundled Prometheus](../administration/monitoring/prometheus/index.md) instance.
-
-To query Prometheus for metrics, a helper method is available to `yield` a fully configured
-`PrometheusClient`, given it is available as per the note above:
-
-```ruby
-with_prometheus_client do |client|
- response = client.query('<your query>')
- ...
-end
-```
-
-Please refer to [the `PrometheusClient` definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/prometheus_client.rb)
-for how to use its API to query for data.
-
-## Developing and testing Usage Ping
-
-### 1. Naming and placing the metrics
-
-Add the metric in one of the top level keys
-
-- `license`: for license related metrics.
-- `settings`: for settings related metrics.
-- `counts_weekly`: for counters that have data for the most recent 7 days.
-- `counts_monthly`: for counters that have data for the most recent 28 days.
-- `counts`: for counters that have data for all time.
-
-### 2. Use your Rails console to manually test counters
-
-```ruby
-# count
-Gitlab::UsageData.count(User.active)
-Gitlab::UsageData.count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
-
-# count distinct
-Gitlab::UsageData.distinct_count(::Project, :creator_id)
-Gitlab::UsageData.distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
-```
-
-### 3. Generate the SQL query
-
-Your Rails console returns the generated SQL queries.
-
-Example:
-
-```ruby
-pry(main)> Gitlab::UsageData.count(User.active)
- (2.6ms) SELECT "features"."key" FROM "features"
- (15.3ms) SELECT MIN("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
- (2.4ms) SELECT MAX("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
- (1.9ms) SELECT COUNT("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND "users"."id" BETWEEN 1 AND 100000
-```
-
-### 4. Optimize queries with #database-lab
-
-Paste the SQL query into `#database-lab` to see how the query performs at scale.
-
-- `#database-lab` is a Slack channel which uses a production-sized environment to test your queries.
-- GitLab.com’s production database has a 15 second timeout.
-- Any single query must stay below [1 second execution time](query_performance.md#timing-guidelines-for-queries) with cold caches.
-- Add a specialized index on columns involved to reduce the execution time.
-
-To have an understanding of the query's execution we add in the MR description the following information:
-
-- For counters that have a `time_period` test we add information for both cases:
- - `time_period = {}` for all time periods
- - `time_period = { created_at: 28.days.ago..Time.current }` for last 28 days period
-- Execution plan and query time before and after optimization
-- Query generated for the index and time
-- Migration output for up and down execution
-
-We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/). For more details, see the [database review guide](database_review.md#preparation-when-adding-or-modifying-queries).
-
-#### Optimization recommendations and examples
-
-- Use specialized indexes [example 1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26871), [example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26445).
-- Use defined `start` and `finish`, and simple queries, because these values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
-- Avoid joins and write the queries as simply as possible, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36316).
-- Set a custom `batch_size` for `distinct_count`, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38000).
-
-### 5. Add the metric definition
-
-When adding, changing, or updating metrics, please update the [Event Dictionary's **Usage Ping** table](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary).
-
-### 6. Add new metric to Versions Application
-
-Check if new metrics need to be added to the Versions Application. See `usage_data` [schema](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L147) and usage data [parameters accepted](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
-
-### 7. Add the feature label
-
-Add the `feature` label to the Merge Request for new Usage Ping metrics. These are user-facing changes and are part of expanding the Usage Ping feature.
-
-### 8. Add a changelog file
-
-Ensure you comply with the [Changelog entries guide](changelog.md).
-
-### 9. Ask for a Product Intelligence Review
-
-On GitLab.com, we have DangerBot setup to monitor Product Intelligence related files and DangerBot recommends a Product Intelligence review. Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR for a review.
-
-### 10. Verify your metric
-
-On GitLab.com, the Product Intelligence team regularly monitors Usage Ping. They may alert you that your metrics need further optimization to run quicker and with greater success. You may also use the [Usage Ping QA dashboard](https://app.periscopedata.com/app/gitlab/632033/Usage-Ping-QA) to check how well your metric performs. The dashboard allows filtering by GitLab version, by "Self-managed" & "SaaS" and shows you how many failures have occurred for each metric. Whenever you notice a high failure rate, you may re-optimize your metric.
-
-### Optional: Test Prometheus based Usage Ping
-
-If the data submitted includes metrics [queried from Prometheus](#prometheus-queries) that you would like to inspect and verify,
-then you need to ensure that a Prometheus server is running locally, and that furthermore the respective GitLab components
-are exporting metrics to it. If you do not need to test data coming from Prometheus, no further action
-is necessary, since Usage Ping should degrade gracefully in the absence of a running Prometheus server.
-
-There are currently three kinds of components that may export data to Prometheus, and which are included in Usage Ping:
-
-- [`node_exporter`](https://github.com/prometheus/node_exporter) - Exports node metrics from the host machine
-- [`gitlab-exporter`](https://gitlab.com/gitlab-org/gitlab-exporter) - Exports process metrics from various GitLab components
-- various GitLab services such as Sidekiq and the Rails server that export their own metrics
-
-#### Test with an Omnibus container
-
-This is the recommended approach to test Prometheus based Usage Ping.
-
-The easiest way to verify your changes is to build a new Omnibus image from your code branch by using CI, then download the image
-and run a local container instance:
-
-1. From your merge request, click on the `qa` stage, then trigger the `package-and-qa` job. This job triggers an Omnibus
-build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/-/pipelines).
-1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
-1. Open the job logs and locate the full container name including the version. It takes the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
-1. On your local machine, make sure you are signed in to the GitLab Docker registry. You can find the instructions for this in
-[Authenticate to the GitLab Container Registry](../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
-1. Once signed in, download the new image by using `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
-1. For more information about working with and running Omnibus GitLab containers in Docker, please refer to [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/README.html) in the Omnibus documentation.
-
-#### Test with GitLab development toolkits
-
-This is the less recommended approach, since it comes with a number of difficulties when emulating a real GitLab deployment.
-
-The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not currently set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
-like to do so, [Monitoring the GDK with Prometheus](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/prometheus/index.md#monitoring-the-gdk-with-prometheus) is a good start.
-
-The [GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit) has limited support for testing Prometheus based Usage Ping.
-By default, it already comes with a fully configured Prometheus service that is set up to scrape a number of components,
-but with the following limitations:
-
-- It does not currently run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
-- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it would normally report itself to not be associated
-with any of the other services that are running. That is not how node metrics are reported in a production setup, where `node_exporter`
-always runs as a process alongside other GitLab components on any given node. From Usage Ping's perspective none of the node data would therefore
-appear to be associated to any of the services running, since they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Usage Ping.
-
-## Aggregated metrics
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
-
-WARNING:
-This feature is intended solely for internal GitLab use.
-
-To add data for aggregated metrics into Usage Ping payload you should add corresponding definition in [`aggregated_metrics`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/). Each aggregate definition includes following parts:
-
-- name: unique name under which aggregate metric is added to Usage Ping payload
-- operator: operator that defines how aggregated metric data is counted. Available operators are:
- - `OR`: removes duplicates and counts all entries that triggered any of listed events
- - `AND`: removes duplicates and counts all elements that were observed triggering all of following events
-- events: list of events names (from [`known_events/`](#known-events-are-added-automatically-in-usage-data-payload)) to aggregate into metric. All events in this list must have the same `redis_slot` and `aggregation` attributes.
-- feature_flag: name of [development feature flag](feature_flags/development.md#development-type) that is checked before
-metrics aggregation is performed. Corresponding feature flag should have `default_enabled` attribute set to `false`.
-`feature_flag` attribute is **OPTIONAL** and can be omitted, when `feature_flag` is missing no feature flag is checked.
-
-Example aggregated metric entries:
-
-```yaml
-- name: product_analytics_test_metrics_union
- operator: OR
- events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
-- name: product_analytics_test_metrics_intersection_with_feautre_flag
- operator: AND
- events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
- feature_flag: example_aggregated_metric
-```
-
-Aggregated metrics are added under `aggregated_metrics` key in both `counts_weekly` and `counts_monthly` top level keys in Usage Ping payload.
-
-```ruby
-{
- :counts_monthly => {
- :deployments => 1003,
- :successful_deployments => 78,
- :failed_deployments => 275,
- :packages => 155,
- :personal_snippets => 2106,
- :project_snippets => 407,
- :promoted_issues => 719,
- :aggregated_metrics => {
- :product_analytics_test_metrics_union => 7,
- :product_analytics_test_metrics_intersection_with_feautre_flag => 2
- },
- :snippets => 2513
- }
-}
-```
-
-## Example Usage Ping payload
-
-The following is example content of the Usage Ping payload.
-
-```json
-{
- "uuid": "0000000-0000-0000-0000-000000000000",
- "hostname": "example.com",
- "version": "12.10.0-pre",
- "installation_type": "omnibus-gitlab",
- "active_user_count": 999,
- "recorded_at": "2020-04-17T07:43:54.162+00:00",
- "edition": "EEU",
- "license_md5": "00000000000000000000000000000000",
- "license_id": null,
- "historical_max_users": 999,
- "licensee": {
- "Name": "ABC, Inc.",
- "Email": "email@example.com",
- "Company": "ABC, Inc."
- },
- "license_user_count": 999,
- "license_starts_at": "2020-01-01",
- "license_expires_at": "2021-01-01",
- "license_plan": "ultimate",
- "license_add_ons": {
- },
- "license_trial": false,
- "counts": {
- "assignee_lists": 999,
- "boards": 999,
- "ci_builds": 999,
- ...
- },
- "container_registry_enabled": true,
- "dependency_proxy_enabled": false,
- "gitlab_shared_runners_enabled": true,
- "gravatar_enabled": true,
- "influxdb_metrics_enabled": true,
- "ldap_enabled": false,
- "mattermost_enabled": false,
- "omniauth_enabled": true,
- "prometheus_enabled": false,
- "prometheus_metrics_enabled": false,
- "reply_by_email_enabled": "incoming+%{key}@incoming.gitlab.com",
- "signup_enabled": true,
- "web_ide_clientside_preview_enabled": true,
- "ingress_modsecurity_enabled": true,
- "projects_with_expiration_policy_disabled": 999,
- "projects_with_expiration_policy_enabled": 999,
- ...
- "elasticsearch_enabled": true,
- "license_trial_ends_on": null,
- "geo_enabled": false,
- "git": {
- "version": {
- "major": 2,
- "minor": 26,
- "patch": 1
- }
- },
- "gitaly": {
- "version": "12.10.0-rc1-93-g40980d40",
- "servers": 56,
- "clusters": 14,
- "filesystems": [
- "EXT_2_3_4"
- ]
- },
- "gitlab_pages": {
- "enabled": true,
- "version": "1.17.0"
- },
- "container_registry_server": {
- "vendor": "gitlab",
- "version": "2.9.1-gitlab"
- },
- "database": {
- "adapter": "postgresql",
- "version": "9.6.15",
- "pg_system_id": 6842684531675334351
- },
- "analytics_unique_visits": {
- "g_analytics_contribution": 999,
- ...
- },
- "usage_activity_by_stage": {
- "configure": {
- "project_clusters_enabled": 999,
- ...
- },
- "create": {
- "merge_requests": 999,
- ...
- },
- "manage": {
- "events": 999,
- ...
- },
- "monitor": {
- "clusters": 999,
- ...
- },
- "package": {
- "projects_with_packages": 999
- },
- "plan": {
- "issues": 999,
- ...
- },
- "release": {
- "deployments": 999,
- ...
- },
- "secure": {
- "user_container_scanning_jobs": 999,
- ...
- },
- "verify": {
- "ci_builds": 999,
- ...
- }
- },
- "usage_activity_by_stage_monthly": {
- "configure": {
- "project_clusters_enabled": 999,
- ...
- },
- "create": {
- "merge_requests": 999,
- ...
- },
- "manage": {
- "events": 999,
- ...
- },
- "monitor": {
- "clusters": 999,
- ...
- },
- "package": {
- "projects_with_packages": 999
- },
- "plan": {
- "issues": 999,
- ...
- },
- "release": {
- "deployments": 999,
- ...
- },
- "secure": {
- "user_container_scanning_jobs": 999,
- ...
- },
- "verify": {
- "ci_builds": 999,
- ...
- }
- },
- "topology": {
- "duration_s": 0.013836685999194742,
- "application_requests_per_hour": 4224,
- "query_apdex_weekly_average": 0.996,
- "failures": [],
- "nodes": [
- {
- "node_memory_total_bytes": 33269903360,
- "node_memory_utilization": 0.35,
- "node_cpus": 16,
- "node_cpu_utilization": 0.2,
- "node_uname_info": {
- "machine": "x86_64",
- "sysname": "Linux",
- "release": "4.19.76-linuxkit"
- },
- "node_services": [
- {
- "name": "web",
- "process_count": 16,
- "process_memory_pss": 233349888,
- "process_memory_rss": 788220927,
- "process_memory_uss": 195295487,
- "server": "puma"
- },
- {
- "name": "sidekiq",
- "process_count": 1,
- "process_memory_pss": 734080000,
- "process_memory_rss": 750051328,
- "process_memory_uss": 731533312
- },
- ...
- ],
- ...
- },
- ...
- ]
- }
-}
-```
-
-## Notable changes
-
-In GitLab 13.5, `pg_system_id` was added to send the [PostgreSQL system identifier](https://www.2ndquadrant.com/en/blog/support-for-postgresqls-system-identifier-in-barman/).
-
-## Exporting Usage Ping SQL queries and definitions
-
-Two Rake tasks exist to export Usage Ping definitions.
-
-- The Rake tasks export the raw SQL queries for `count`, `distinct_count`, `sum`.
-- The Rake tasks export the Redis counter class or the line of the Redis block for `redis_usage_data`.
-- The Rake tasks calculate the `alt_usage_data` metrics.
-
-In the home directory of your local GitLab installation run the following Rake tasks for the YAML and JSON versions respectively:
-
-```shell
-# for YAML export
-bin/rake gitlab:usage_data:dump_sql_in_yaml
-
-# for JSON export
-bin/rake gitlab:usage_data:dump_sql_in_json
-
-# You may pipe the output into a file
-bin/rake gitlab:usage_data:dump_sql_in_yaml > ~/Desktop/usage-metrics-2020-09-02.yaml
-```
-
-## Generating and troubleshooting usage ping
-
-To get a usage ping, or to troubleshoot caching issues on your GitLab instance, please follow [instructions to generate usage ping](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping).
+This document was moved to [another location](usage_ping/index.md).
+<!-- This redirect file can be deleted after <2021-05-23>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md
index ca3e0f1aae6..c0e9aa82247 100644
--- a/doc/development/usage_ping/dictionary.md
+++ b/doc/development/usage_ping/dictionary.md
@@ -24,864 +24,17590 @@ bundle exec rake gitlab:usage_data:generate_metrics_dictionary
The Metrics Dictionary is based on the following metrics definition YAML files:
-- [`config/metrics`]('https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics')
+- [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics)
- [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics)
+
Each table includes a `milestone`, which corresponds to the GitLab version when the metric
was released.
-## `active_user_count`
+## Metrics Definitions
+
+### `active_user_count`
This is named the instance_user_count in the Versions application.
-| field | value |
-| --- | --- |
-| `key_path` | **`active_user_count`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ce, ee |
-| `tier` | free, premium, ultimate |
-| `skip_validation` | true |
-
-## `container_registry_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124829_active_user_count.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `analytics_unique_visits.analytics_unique_visits_for_any_target`
+
+Visits to any of the pages listed above per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.analytics_unique_visits_for_any_target_monthly`
+
+Visits to any of the pages listed above per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_contribution`
+
+Visits to /groups/:group/-/contribution_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_insights`
+
+Visits to /groups/:group/-/insights
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174838_g_analytics_insights.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_issues`
+
+Visits to /groups/:group/-/issues_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174840_g_analytics_issues.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_merge_request`
+
+Visits to /groups/:group/-/analytics/merge_request_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_productivity`
+
+Visits to /groups/:group/-/analytics/productivity_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_valuestream`
+
+Visits to /groups/:group/-/analytics/value_stream_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_cohorts`
+
+Visits to /-/instance_statistics/cohorts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_dev_ops_score`
+
+Visits to /-/instance_statistics/dev_ops_score
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_instance_statistics`
+
+Visit to /admin/instance_statistics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_code_reviews`
+
+Visits to /:group/:project/-/analytics/code_reviews
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_insights`
+
+Visits to /:group/:project/insights
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174852_p_analytics_insights.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_issues`
+
+Visits to /:group/:project/-/analytics/issues_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174854_p_analytics_issues.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_merge_request`
+
+Visits to /:group/:project/-/analytics/merge_request_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_pipelines`
+
+Visits to /:group/:project/pipelines/charts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_repo`
+
+Visits to /:group/:project/-/graphs/master/charts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174856_p_analytics_repo.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_valuestream`
+
+Visits to /:group/:project/-/value_stream_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.a_compliance_audit_events_api`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.compliance_unique_visits_for_any_target`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.compliance_unique_visits_for_any_target_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.g_compliance_audit_events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.g_compliance_dashboard`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.i_compliance_audit_events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.i_compliance_credential_inventory`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `container_registry_enabled`
Whether container registry is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`container_registry_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `counts.deployments`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124858_container_registry_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `container_registry_server.vendor`
+
+Identifies if a user is using an external container registry and what type
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181051_vendor.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `container_registry_server.version`
+
+Identifies the version of the external registry being used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216181053_version.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.alert_bot_incident_issues`
+
+Count of issues created by the alert bot automatically
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.all_searches`
+
+Total Searches for All Basic Search and Advanced Search in self-managed and SaaS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180413_all_searches.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs run by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.api_fuzzing_jobs`
+
+Count of API Fuzzing jobs run by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.assignee_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181100_assignee_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.auto_devops_disabled`
+
+Projects with Auto DevOps template disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.auto_devops_enabled`
+
+Projects with Auto DevOps template enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.boards`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181252_boards.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_builds`
+
+Unique builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175510_ci_builds.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_runners`
+
+Total configured Runners in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175520_ci_runners.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175521_ci_triggers.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175232_clusters.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_cilium`
+
+Total GitLab Managed clusters with GitLab Managed App:Cilium installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_crossplane`
+
+Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_elastic_stack`
+
+Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_jupyter`
+
+Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_runner`
+
+Total GitLab Managed clusters with GitLab Managed App:Runner installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175242_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175234_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175314_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.commit_comment`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182004_commit_comment.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.confidential_epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181205_confidential_epics.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.container_scanning_jobs`
+
+Count of Container Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175458_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.cycle_analytics_views`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dast_jobs`
+
+Count of DAST jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175612_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dast_on_demand_pipelines`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dependency_list_usages_total`
+
+Count to Dependency List page views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175211_dependency_list_usages_total.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.dependency_scanning_jobs`
+
+Count of Dependency Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175213_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.deploy_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181908_deploy_keys.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.deployments`
Total deployments count
-| field | value |
-| --- | --- |
-| `key_path` | **`counts.deployments`** |
-| `product_section` | ops |
-| `product_stage` | release |
-| `product_group` | `group::ops release` |
-| `value_type` | number |
-| `status` | data_available |
-| `milestone` | 8.12 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/735) |
-| `time_frame` | all |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `counts.geo_nodes`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210201124934_deployments.yml)
+
+Group: `group::ops release`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.design_management_designs_create`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180740_design_management_designs_create.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.design_management_designs_delete`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.design_management_designs_update`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180741_design_management_designs_update.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.environments`
+
+Total available and stopped environments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181914_environments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.epic_issues`
+
+Count of issues that are assigned to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181208_epic_issues.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181206_epics.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.epics_deepest_relationship_level`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181212_epics_deepest_relationship_level.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181912_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.feature_flags`
+
+Number of feature flag toggles
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181249_feature_flags.yml)
+
+Group: `group::progressive delivery`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.geo_event_log_max_id`
+
+Number of replication events on a Geo primary
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180405_geo_event_log_max_id.yml)
+
+Group: `group::geo`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.geo_node_usage.git_fetch_event_count_weekly`
+
+Number of Git fetch events from Prometheus on the Geo secondary
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210309194425_git_fetch_event_count_weekly.yml)
+
+Group: `group::geo`
+
+Status: `implemented`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.geo_nodes`
Total number of sites in a Geo deployment
-| field | value |
-| --- | --- |
-| `key_path` | **`counts.geo_nodes`** |
-| `product_section` | enablement |
-| `product_stage` | enablement |
-| `product_group` | `group::geo` |
-| `product_category` | disaster_recovery |
-| `value_type` | integer |
-| `status` | data_available |
-| `milestone` | 11.2 |
-| `time_frame` | all |
-| `data_source` | Database |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-
-## `counts.license_management_jobs`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210201124936_geo_nodes.yml)
+
+Group: `group::geo`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.grafana_integrated_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.group_clusters_enabled`
+
+Total GitLab Managed clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups`
+
+Total count of groups as of usage ping snapshot
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180750_groups.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_asana_active`
+
+Count of groups with active integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175625_groups_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_assembla_active`
+
+Count of groups with active integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175636_groups_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_bamboo_active`
+
+Count of groups with active integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_bugzilla_active`
+
+Count of groups with active integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_buildkite_active`
+
+Count of groups with active integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_campfire_active`
+
+Count of groups with active integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175721_groups_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_confluence_active`
+
+Count of groups with active integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175733_groups_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_custom_issue_tracker_active`
+
+Count of groups with active integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182549_groups_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_discord_active`
+
+Count of groups with active integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175755_groups_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_drone_ci_active`
+
+Count of groups with active integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_emails_on_push_active`
+
+Count of groups with active integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182616_groups_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_external_wiki_active`
+
+Count of groups with active integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_flowdock_active`
+
+Count of groups with active integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_github_active`
+
+Count of groups with active integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175850_groups_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_hangouts_chat_active`
+
+Count of groups with active integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_hipchat_active`
+
+Count of groups with active integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_asana_active`
+
+Count of active groups inheriting integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_assembla_active`
+
+Count of active groups inheriting integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_bamboo_active`
+
+Count of active groups inheriting integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_bugzilla_active`
+
+Count of active groups inheriting integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_buildkite_active`
+
+Count of active groups inheriting integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_campfire_active`
+
+Count of active groups inheriting integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_confluence_active`
+
+Count of active groups inheriting integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_custom_issue_tracker_active`
+
+Count of active groups inheriting integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_discord_active`
+
+Count of active groups inheriting integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_drone_ci_active`
+
+Count of active groups inheriting integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_emails_on_push_active`
+
+Count of active groups inheriting integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_external_wiki_active`
+
+Count of active groups inheriting integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_flowdock_active`
+
+Count of active groups inheriting integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_github_active`
+
+Count of active groups inheriting integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_hangouts_chat_active`
+
+Count of active groups inheriting integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_hipchat_active`
+
+Count of active groups inheriting integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_irker_active`
+
+Count of active groups inheriting integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_jenkins_active`
+
+Count of active groups inheriting integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_jira_active`
+
+Count of active groups inheriting integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mattermost_active`
+
+Count of active groups inheriting integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mattermost_slash_commands_active`
+
+Count of active groups inheriting integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_microsoft_teams_active`
+
+Count of active groups inheriting integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_packagist_active`
+
+Count of active groups inheriting integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pipelines_email_active`
+
+Count of active groups inheriting integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pivotaltracker_active`
+
+Count of active groups inheriting integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_prometheus_active`
+
+Count of active groups inheriting integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pushover_active`
+
+Count of active groups inheriting integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_redmine_active`
+
+Count of active groups inheriting integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_slack_active`
+
+Count of active groups inheriting integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_slack_slash_commands_active`
+
+Count of active groups inheriting integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_teamcity_active`
+
+Count of active groups inheriting integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_unify_circuit_active`
+
+Count of active groups inheriting integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_webex_teams_active`
+
+Count of active groups inheriting integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_youtrack_active`
+
+Count of active groups inheriting integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_irker_active`
+
+Count of groups with active integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175923_groups_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_jenkins_active`
+
+Count of groups with active integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_jira_active`
+
+Count of groups with active integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175945_groups_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mattermost_active`
+
+Count of groups with active integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mattermost_slash_commands_active`
+
+Count of groups with active integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_microsoft_teams_active`
+
+Count of groups with active integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_packagist_active`
+
+Count of groups with active integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180029_groups_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pipelines_email_active`
+
+Count of groups with active integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pivotaltracker_active`
+
+Count of groups with active integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_prometheus_active`
+
+Count of groups with active integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pushover_active`
+
+Count of groups with active integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180102_groups_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_redmine_active`
+
+Count of groups with active integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180113_groups_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_slack_active`
+
+Count of groups with active integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180124_groups_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_slack_slash_commands_active`
+
+Count of groups with active integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_teamcity_active`
+
+Count of groups with active integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_unify_circuit_active`
+
+Count of groups with active integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_webex_teams_active`
+
+Count of groups with active integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_youtrack_active`
+
+Count of groups with active integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_review_folder`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181916_in_review_folder.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.incident_issues`
+
+Count of incidents (issues where issue_type=incident)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180447_incident_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.incident_labeled_issues`
+
+Count of all issues with the label=incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_blocking`
+
+Whether or not ModSecurity is set to blocking mode
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_disabled`
+
+Whether or not ModSecurity is disabled within Ingress
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_logging`
+
+Whether or not ModSecurity is set to logging mode
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_not_installed`
+
+Whether or not ModSecurity has not been installed into the cluster
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_packets_anomalous`
+
+Cumulative count of packets identified as anomalous by ModSecurity since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_packets_processed`
+
+Cumulative count of packets processed by ModSecurity since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_statistics_unavailable`
+
+Whether or not ModSecurity statistics are unavailable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175441_ingress_modsecurity_statistics_unavailable.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instance_clusters_enabled`
+
+Total GitLab Managed clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_asana_active`
+
+Count of active instance-level integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175628_instances_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_assembla_active`
+
+Count of active instance-level integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175640_instances_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_bamboo_active`
+
+Count of active instance-level integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_bugzilla_active`
+
+Count of active instance-level integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_buildkite_active`
+
+Count of active instance-level integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_campfire_active`
+
+Count of active instance-level integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175725_instances_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_confluence_active`
+
+Count of active instance-level integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175736_instances_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_custom_issue_tracker_active`
+
+Count of active instance-level integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182553_instances_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_discord_active`
+
+Count of active instance-level integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175758_instances_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_drone_ci_active`
+
+Count of active instance-level integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_emails_on_push_active`
+
+Count of active instance-level integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182620_instances_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_external_wiki_active`
+
+Count of active instance-level integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_flowdock_active`
+
+Count of active instance-level integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_github_active`
+
+Count of active instance-level integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175853_instances_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_hangouts_chat_active`
+
+Count of active instance-level integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_hipchat_active`
+
+Count of active instance-level integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_irker_active`
+
+Count of active instance-level integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175926_instances_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_jenkins_active`
+
+Count of active instance-level integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_jira_active`
+
+Count of active instance-level integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175948_instances_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mattermost_active`
+
+Count of active instance-level integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mattermost_slash_commands_active`
+
+Count of active instance-level integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_microsoft_teams_active`
+
+Count of active instance-level integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_packagist_active`
+
+Count of active instance-level integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180032_instances_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pipelines_email_active`
+
+Count of active instance-level integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pivotaltracker_active`
+
+Count of active instance-level integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_prometheus_active`
+
+Count of active instance-level integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pushover_active`
+
+Count of active instance-level integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180105_instances_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_redmine_active`
+
+Count of active instance-level integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180116_instances_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_slack_active`
+
+Count of active instance-level integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180127_instances_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_slack_slash_commands_active`
+
+Count of active instance-level integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_teamcity_active`
+
+Count of active instance-level integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_unify_circuit_active`
+
+Count of active instance-level integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_webex_teams_active`
+
+Count of active instance-level integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_youtrack_active`
+
+Count of active instance-level integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues`
+
+Count of Issues created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181102_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_from_alerts`
+
+Count of issues created automatically on alerts from GitLab-Managed Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_from_gitlab_error_tracking_ui`
+
+Count of issues manually created from the GitLab UI on Sentry errors
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.issues_created_gitlab_alerts`
+
+Count of all issues created from GitLab alerts (bot and non-bot)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_manually_from_alerts`
+
+Count of issues created manually by non-bot users from GitLab alerts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_using_zoom_quick_actions`
+
+Count of issues where a user have added AND removed a zoom meeting using slash commands
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_associated_zoom_link`
+
+Count of issues where a user has linked a Zoom meeting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_embedded_grafana_charts_approx`
+
+Count of issues where a user has embedded a Grafana chart
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_health_status`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181210_issues_with_health_status.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.jira_imports_projects_count`
+
+Count of Projects that imported Issues from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.jira_imports_total_imported_count`
+
+Count of Issues imported from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.jira_imports_total_imported_issues_count`
+
+Count of Jira imports run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180752_keys.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.kubernetes_agent_gitops_sync`
+
+Count of GitOps Sync events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175328_kubernetes_agent_gitops_sync.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.kubernetes_agents`
+
+Count of Kubernetes agents
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175316_kubernetes_agents.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.kubernetes_agents_with_token`
+
+Count of Kubernetes agents with at least one token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.label_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181104_label_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.labels`
+
+Count of Labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181111_labels.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ldap_group_links`
+
+Number of groups that are synced via LDAP group sync `https://docs.gitlab.com/ee/user/group/index.html#manage-group-memberships-via-ldap`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174822_ldap_group_links.yml)
+
+Group: `group::access`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.ldap_keys`
+
+Number of keys synced as part of LDAP `https://docs.gitlab.com/ee/administration/auth/ldap/#ldap-sync-configuration-settings`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174824_ldap_keys.yml)
+
+Group: `group::access`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.ldap_users`
+
+Number of users that are linked to LDAP
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174826_ldap_users.yml)
+
+Group: `group::access`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.lfs_objects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181009_lfs_objects.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.license_management_jobs`
Name on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`counts.license_management_jobs`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | number |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `counts_monthly.deployments`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124854_license_management_jobs.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.licenses_list_views`
+
+Count to License List page views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210216175210_licenses_list_views.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.merge_request_comment`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175041_merge_request_comment.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.merge_request_create`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175043_merge_request_create.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.merge_requests`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175039_merge_requests.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.merged_merge_requests_using_approval_rules`
+
+Count of merge requests merged using approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml)
+
+Group: `group::compliance`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.milestone_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181106_milestone_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.milestones`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181108_milestones.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.navbar_searches`
+
+Total Searches using the navbar for All Basic Search and Advanced Search in self-managed and SaaS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180414_navbar_searches.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.network_policy_drops`
+
+Cumulative count of packets dropped by Cilium (Container Network Security) since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175448_network_policy_drops.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.network_policy_forwards`
+
+Cumulative count of packets forwarded by Cilium (Container Network Security) since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175446_network_policy_forwards.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.notes`
+
+Count of Notes across all objects that use them
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181113_notes.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_composer_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_composer_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_composer_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_conan_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_conan_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_conan_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_container_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_container_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_container_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_debian_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_debian_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_debian_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package_by_deploy_token`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package_by_guest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package_by_user`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_generic_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_generic_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_generic_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_golang_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_golang_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_golang_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_maven_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_maven_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_maven_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_npm_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_npm_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_npm_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_nuget_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_nuget_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_nuget_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package_by_deploy_token`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package_by_guest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package_by_user`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package_by_deploy_token`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package_by_guest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package_by_user`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pypi_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pypi_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pypi_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_rubygems_delete_package`
+
+Total count of RubyGems packages delete events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_rubygems_pull_package`
+
+Total count of pull RubyGems packages events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_rubygems_push_package`
+
+Total count of push RubyGems packages events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_tag_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_tag_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_tag_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.packages`
+
+Number of packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181012_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.pages_domains`
+
+Total GitLab Pages domains
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181946_pages_domains.yml)
+
+Group: `group::release management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.personal_snippets`
+
+Count of Personal Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180239_personal_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.pod_logs_usages_total`
+
+Count the total number of log views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml)
+
+Group: `group::apm`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.pool_repositories`
+
+Count of unique object pool repositories for fork deduplication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180410_pool_repositories.yml)
+
+Group: `group::gitaly`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.productivity_analytics_views`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.project_clusters_enabled`
+
+Total GitLab Managed clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.project_snippets`
+
+Count of Project Snippetss
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180241_project_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects`
+
+Count of Projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181254_projects.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_asana_active`
+
+Count of projects with active integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175623_projects_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_assembla_active`
+
+Count of projects with active integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175634_projects_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_bamboo_active`
+
+Count of projects with active integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_bugzilla_active`
+
+Count of projects with active integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_buildkite_active`
+
+Count of projects with active integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_campfire_active`
+
+Count of projects with active integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175719_projects_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_confluence_active`
+
+Count of projects with active integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175731_projects_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_creating_incidents`
+
+Counts of Projects that have created incidents
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_custom_issue_tracker_active`
+
+Count of projects with active integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182547_projects_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_discord_active`
+
+Count of projects with active integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175753_projects_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_drone_ci_active`
+
+Count of projects with active integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_emails_on_push_active`
+
+Count of projects with active integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182614_projects_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_external_wiki_active`
+
+Count of projects with active integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_flowdock_active`
+
+Count of projects with active integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_github_active`
+
+Count of projects with active integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175848_projects_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_hangouts_chat_active`
+
+Count of projects with active integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_hipchat_active`
+
+Count of projects with active integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_asana_active`
+
+Count of active projects inheriting integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_assembla_active`
+
+Count of active projects inheriting integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_bamboo_active`
+
+Count of active projects inheriting integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_bugzilla_active`
+
+Count of active projects inheriting integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_buildkite_active`
+
+Count of active projects inheriting integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_campfire_active`
+
+Count of active projects inheriting integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_confluence_active`
+
+Count of active projects inheriting integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_custom_issue_tracker_active`
+
+Count of active projects inheriting integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_discord_active`
+
+Count of active projects inheriting integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_drone_ci_active`
+
+Count of active projects inheriting integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_emails_on_push_active`
+
+Count of active projects inheriting integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_external_wiki_active`
+
+Count of active projects inheriting integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_flowdock_active`
+
+Count of active projects inheriting integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_github_active`
+
+Count of active projects inheriting integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_hangouts_chat_active`
+
+Count of active projects inheriting integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_hipchat_active`
+
+Count of active projects inheriting integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_irker_active`
+
+Count of active projects inheriting integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_jenkins_active`
+
+Count of active projects inheriting integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_jira_active`
+
+Count of active projects inheriting integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mattermost_active`
+
+Count of active projects inheriting integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mattermost_slash_commands_active`
+
+Count of active projects inheriting integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_microsoft_teams_active`
+
+Count of active projects inheriting integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_packagist_active`
+
+Count of active projects inheriting integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pipelines_email_active`
+
+Count of active projects inheriting integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pivotaltracker_active`
+
+Count of active projects inheriting integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_prometheus_active`
+
+Count of active projects inheriting integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pushover_active`
+
+Count of active projects inheriting integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_redmine_active`
+
+Count of active projects inheriting integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_slack_active`
+
+Count of active projects inheriting integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_slack_slash_commands_active`
+
+Count of active projects inheriting integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_teamcity_active`
+
+Count of active projects inheriting integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_unify_circuit_active`
+
+Count of active projects inheriting integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_webex_teams_active`
+
+Count of active projects inheriting integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_youtrack_active`
+
+Count of active projects inheriting integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_irker_active`
+
+Count of projects with active integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175921_projects_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jenkins_active`
+
+Count of projects with active integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_active`
+
+Count of projects with active integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175943_projects_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_cloud_active`
+
+Count of active integrations with Jira Cloud (Saas)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_dvcs_cloud_active`
+
+Count of active integrations with Jira Cloud (DVCS Connector)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_dvcs_server_active`
+
+Count of active integrations with Jira Software (DVCS connector)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_issuelist_active`
+
+Total Jira Issue feature enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180236_projects_jira_issuelist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_jira_server_active`
+
+Count of active integrations with Jira Software (server)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mattermost_active`
+
+Count of projects with active integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mattermost_slash_commands_active`
+
+Count of projects with active integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_microsoft_teams_active`
+
+Count of projects with active integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_packagist_active`
+
+Count of projects with active integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180027_projects_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pipelines_email_active`
+
+Count of projects with active integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pivotaltracker_active`
+
+Count of projects with active integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_prometheus_active`
+
+Count of projects with active integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pushover_active`
+
+Count of projects with active integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180100_projects_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_redmine_active`
+
+Count of projects with active integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180111_projects_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182212_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::continuous_integration`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_slack_active`
+
+Count of projects with active integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180122_projects_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_slack_slash_commands_active`
+
+Count of projects with active integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_teamcity_active`
+
+Count of projects with active integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_unify_circuit_active`
+
+Count of projects with active integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_webex_teams_active`
+
+Count of projects with active integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_alerts_created`
+
+Count of projects with alerts created in given time period
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_alerts_service_enabled`
+
+Count of projects that have enabled the Alerts service
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_enabled_alert_integrations`
+
+Count of projects with at least 1 enabled integration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_error_tracking_enabled`
+
+Count of projects that have enabled Error tracking via Sentry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_disabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_1`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_10`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_100`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_25`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_5`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_50`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_unset`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_unset`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_packages`
+
+Projects with package registry configured
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181011_projects_with_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml)
+
+Group: `group::apm`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_repositories_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_terraform_reports`
+
+Count of projects with Terraform MR reports
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_terraform_states`
+
+Count of projects with GitLab Managed Terraform State
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_youtrack_active`
+
+Count of projects with active integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.protected_branches`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182001_protected_branches.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.protected_branches_except_default`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.releases`
+
+Unique release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181918_releases.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.remote_mirrors`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182002_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.requirement_test_reports_ci`
+
+Count of requirement test reports created from CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175032_requirement_test_reports_ci.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.requirement_test_reports_manual`
+
+Count of requirement test reports created manually
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175030_requirement_test_reports_manual.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.requirements_created`
+
+Count of requirements created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175028_requirements_created.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.requirements_with_test_report`
+
+Count of requirements having a test report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175034_requirements_with_test_report.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.sast_jobs`
+
+Count of SAST CI jobs for the month. Job names ending in '-sast'
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182112_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.secret_detection_jobs`
+
+Count of 'secret-detection' CI jobs fro the month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.service_desk_enabled_projects`
+
+Count of service desk enabled projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.service_desk_issues`
+
+Count of service desk issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175026_service_desk_issues.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.snippet_comment`
+
+Count of comments on Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180253_snippet_comment.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippet_create`
+
+Count of newly created Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180255_snippet_create.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippet_update`
+
+Count of updates to existing Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180257_snippet_update.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippets`
+
+Count of all Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180306_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.source_code_pushes`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182006_source_code_pushes.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.static_site_editor_commits`
+
+Count of commits created via Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.static_site_editor_merge_requests`
+
+Count of merge requests created via Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.static_site_editor_views`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180259_static_site_editor_views.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.status_page_incident_publishes`
+
+Cumulative count of usages of publish operation
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.status_page_incident_unpublishes`
+
+Cumulative count of usages of unpublish operation
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.status_page_issues`
+
+Issues published to a Status Page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180507_status_page_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.status_page_projects`
+
+Projects with status page enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180506_status_page_projects.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181911_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.suggestions`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175037_suggestions.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.template_repositories`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182008_template_repositories.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_asana_active`
+
+Count of active service templates for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175627_templates_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_assembla_active`
+
+Count of active service templates for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175638_templates_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_bamboo_active`
+
+Count of active service templates for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_bugzilla_active`
+
+Count of active service templates for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_buildkite_active`
+
+Count of active service templates for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_campfire_active`
+
+Count of active service templates for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175723_templates_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_confluence_active`
+
+Count of active service templates for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175734_templates_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_custom_issue_tracker_active`
+
+Count of active service templates for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182551_templates_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_discord_active`
+
+Count of active service templates for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175756_templates_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_drone_ci_active`
+
+Count of active service templates for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_emails_on_push_active`
+
+Count of active service templates for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182618_templates_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_external_wiki_active`
+
+Count of active service templates for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_flowdock_active`
+
+Count of active service templates for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_github_active`
+
+Count of active service templates for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175851_templates_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_hangouts_chat_active`
+
+Count of active service templates for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_hipchat_active`
+
+Count of active service templates for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_irker_active`
+
+Count of active service templates for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175924_templates_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_jenkins_active`
+
+Count of active service templates for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_jira_active`
+
+Count of active service templates for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175946_templates_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mattermost_active`
+
+Count of active service templates for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mattermost_slash_commands_active`
+
+Count of active service templates for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_microsoft_teams_active`
+
+Count of active service templates for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_packagist_active`
+
+Count of active service templates for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180030_templates_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pipelines_email_active`
+
+Count of active service templates for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pivotaltracker_active`
+
+Count of active service templates for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_prometheus_active`
+
+Count of active service templates for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pushover_active`
+
+Count of active service templates for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180104_templates_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_redmine_active`
+
+Count of active service templates for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180115_templates_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_slack_active`
+
+Count of active service templates for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180126_templates_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_slack_slash_commands_active`
+
+Count of active service templates for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_teamcity_active`
+
+Count of active service templates for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_unify_circuit_active`
+
+Count of active service templates for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_webex_teams_active`
+
+Count of active service templates for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_youtrack_active`
+
+Count of active service templates for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.terraform_reports`
+
+Count of Terraform MR reports generated
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175324_terraform_reports.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.terraform_states`
+
+Count of GitLab Managed Terraform States used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175326_terraform_states.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.todos`
+
+Count of ToDos
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181256_todos.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.uploads`
+
+Count of Uploads via Notes and Descriptions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181109_uploads.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.user_preferences_group_overview_details`
+
+Count of users who set personal preference to see Details on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.user_preferences_group_overview_security_dashboard`
+
+Count of users who set personal preference to see Security Dashboard on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.user_preferences_user_gitpod_enabled`
+
+Count all users with their GitPod setting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_hooks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175621_web_hooks.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.web_ide_commits`
+
+Count of Commits made from Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180242_web_ide_commits.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_merge_requests`
+
+Count of Merge Requests created from Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_pipelines`
+
+Count of Pipeline tab views in Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_previews`
+
+Count of Live Preview tab views in Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180248_web_ide_previews.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_terminals`
+
+Count of Web Terminal Tab views in Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180250_web_ide_terminals.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_views`
+
+Count of Views of the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180244_web_ide_views.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.wiki_pages_create`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180734_wiki_pages_create.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.wiki_pages_delete`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.wiki_pages_update`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180736_wiki_pages_update.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.wiki_pages_view`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183023_wiki_pages_view.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per month to take an action on an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per month to take an action on an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.product_analytics_test_metrics_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.deployments`
Total deployments count for recent 28 days
-| field | value |
-| --- | --- |
-| `key_path` | **`counts_monthly.deployments`** |
-| `product_section` | ops |
-| `product_stage` | release |
-| `product_group` | `group::ops release` |
-| `product_category` | |
-| `value_type` | number |
-| `status` | data_available |
-| `milestone` | 13.2 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35493) |
-| `time_frame` | 28d |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `database.adapter`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210201124930_deployments.yml)
+
+Group: `group::ops release`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181924_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.packages`
+
+Monthly count of Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181050_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.personal_snippets`
+
+Monthly count of Personal Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180308_personal_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.project_snippets`
+
+Monthly count of Project Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180310_project_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.projects_with_alerts_created`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.snippets`
+
+Monthly count of All Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180312_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181923_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_weekly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183211_compliance_features_track_unique_visits_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183219_i_testing_paid_monthly_active_user_total.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per week to take an action on an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per week to take an action on an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.product_analytics_test_metrics_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `database.adapter`
This metric only returns a value of PostgreSQL in supported versions of GitLab. It could be removed from the usage ping. Historically MySQL was also supported.
-| field | value |
-| --- | --- |
-| `key_path` | **`database.adapter`** |
-| `product_section` | enablement |
-| `product_stage` | enablement |
-| `product_group` | `group::enablement distribution` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `dependency_proxy_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210201124935_database_adapter.yml)
+
+Group: `group::enablement distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `database.pg_system_id`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183248_pg_system_id.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `database.version`
+
+The version of the PostgreSQL database.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175609_version.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `dependency_proxy_enabled`
Whether dependency proxy is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`dependency_proxy_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `elasticsearch_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `edition`
+
+Edition of GitLab such as EE, CE, Bronze, Silver, Gold
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175604_edition.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `elasticsearch_enabled`
Whether Elasticsearch is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`elasticsearch_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitaly.clusters`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210204124924_elasticsearch_enabled.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `g_project_management_epic_created_monthly`
+
+Count of MAU creating epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210305144719_g_product_planning_epic_created_monthly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `premium`, `ultimate`
+
+### `g_project_management_epic_created_weekly`
+
+Count of WAU creating epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210305145820_g_product_planning_epic_created_weekly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `premium`, `ultimate`
+
+### `geo_enabled`
+
+Is Geo enabled?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180406_geo_enabled.yml)
+
+Group: `group::geo`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `git.version`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216183237_version.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.clusters`
Total GitLab Managed clusters both enabled and disabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gitaly.clusters`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | number |
-| `status` | data_available |
-| `time_frame` | all |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitaly.servers`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210204124932_clusters.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.filesystems`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183241_filesystems.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.servers`
Total Gitalty Servers
-| field | value |
-| --- | --- |
-| `key_path` | **`gitaly.servers`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | number |
-| `status` | data_available |
-| `time_frame` | all |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitaly.version`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210204124930_servers.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.version`
Version of Gitaly
-| field | value |
-| --- | --- |
-| `key_path` | **`gitaly.version`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitlab_pages.enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124928_version.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_pages.enabled`
Whether GitLab Pages is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gitlab_pages.enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitlab_pages.version`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124934_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_pages.version`
The version number of GitLab Pages
-| field | value |
-| --- | --- |
-| `key_path` | **`gitlab_pages.version`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitlab_shared_runners_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124936_version.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_shared_runners_enabled`
Whether shared runners is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gitlab_shared_runners_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `grafana_link_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitpod_enabled`
+
+Whether gitpod is enabled in the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180314_gitpod_enabled.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `grafana_link_enabled`
Whether Grafana is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`grafana_link_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gravatar_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124922_grafana_link_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gravatar_enabled`
Whether gravatar is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gravatar_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `historical_max_users`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124904_gravatar_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `historical_max_users`
The maximum active user count. Active is defined in UsersStatistics model.
-| field | value |
-| --- | --- |
-| `key_path` | **`historical_max_users`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `hostname`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124835_historical_max_users.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `hostname`
Host name of GitLab instance
-| field | value |
-| --- | --- |
-| `key_path` | **`hostname`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ce, ee |
-| `tier` | free, premium, ultimate |
-| `skip_validation` | true |
-
-## `instance_auto_devops_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124827_hostname.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `ingress_modsecurity_enabled`
+
+Whether or not ModSecurity is enabled within Ingress
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `installation_type`
+
+The installation method used to install GitLab (Omnibus, Helm, etc)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175602_installation_type.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `instance_auto_devops_enabled`
Whether auto DevOps is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`instance_auto_devops_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `ldap_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `ldap_enabled`
Whether LDAP is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`ldap_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `license_expires_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124906_ldap_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `license_expires_at`
The date the license ends
-| field | value |
-| --- | --- |
-| `key_path` | **`license_expires_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_id`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124847_license_expires_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_id`
The ID of the license
-| field | value |
-| --- | --- |
-| `key_path` | **`license_id`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_md5`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124833_license_id.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_md5`
The license key of the GitLab instance
-| field | value |
-| --- | --- |
-| `key_path` | **`license_md5`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | free, premium, ultimate |
-| `skip_validation` | true |
-
-## `license_plan`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124831_license_md5.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `license_plan`
The plan of the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`license_plan`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_starts_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124849_license_plan.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_starts_at`
The date the license starts
-| field | value |
-| --- | --- |
-| `key_path` | **`license_starts_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_subscription_id`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124845_license_starts_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_subscription_id`
Licese zuora_subscription_id
-| field | value |
-| --- | --- |
-| `key_path` | **`license_subscription_id`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_trial`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124852_license_subscription_id.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_trial`
Whether this is a trial license or not
-| field | value |
-| --- | --- |
-| `key_path` | **`license_trial`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_trial_ends_on`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210204124851_license_trial.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_trial_ends_on`
Date the license ends on
-| field | value |
-| --- | --- |
-| `key_path` | **`license_trial_ends_on`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `license_user_count`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124926_license_trial_ends_on.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `license_user_count`
The number of users included in the license
-| field | value |
-| --- | --- |
-| `key_path` | **`license_user_count`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `licensee.Company`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124843_license_user_count.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Company`
Company on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`licensee.Company`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `licensee.Email`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124841_company.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Email`
Email on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`licensee.Email`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `licensee.Name`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124839_email.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Name`
Name on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`licensee.Name`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `mattermost_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124837_name.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `mail.smtp_server`
+
+The value of the SMTP server that is used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174829_smtp_server.yml)
+
+Group: `group::acquisition`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `mattermost_enabled`
Whether Mattermost is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`mattermost_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `omniauth_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124908_mattermost_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `object_store.artifacts.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180836_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180841_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180840_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180838_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.provider`
+
+What Object Storage provider has been configured for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180843_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180845_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180851_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180849_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180847_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.provider`
+
+What Object Storage provider has been configured for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180852_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.enabled`
+
+Whether Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180854_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180900_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180858_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.enabled`
+
+Whether Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180856_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.provider`
+
+What Object Storage provider has been configured for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180902_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180913_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180918_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180916_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.enabled`
+
+Whether Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180915_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.provider`
+
+What Object Storage provider has been configured for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180920_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180903_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180909_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180907_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180905_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.provider`
+
+What Object Storage provider has been configured for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180911_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `omniauth_enabled`
Whether OmniAuth is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`omniauth_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `prometheus_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124910_omniauth_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `prometheus_enabled`
Whether the bundled Prometheus is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`prometheus_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `prometheus_metrics_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124912_prometheus_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `prometheus_metrics_enabled`
Whether Prometheus Metrics endpoint is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`prometheus_metrics_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `recorded_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `recorded_at`
When the Usage Ping computation was started
-| field | value |
-| --- | --- |
-| `key_path` | **`recorded_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `milestone` | 8.1 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/557) |
-| `time_frame` | none |
-| `data_source` | Ruby |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `recording_ce_finished_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210201124932_recorded_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `recording_ce_finished_at`
When the core features were computed
-| field | value |
-| --- | --- |
-| `key_path` | **`recording_ce_finished_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ce, ee |
-| `tier` | |
-| `skip_validation` | true |
-
-## `recording_ee_finished_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124938_recording_ce_finished_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `recording_ee_finished_at`
When the EE-specific features were computed
-| field | value |
-| --- | --- |
-| `key_path` | **`recording_ee_finished_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | |
-| `skip_validation` | true |
-
-## `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124940_recording_ee_finished_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.analytics_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.analytics_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_contribution_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_contribution_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174912_g_analytics_contribution_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_insights_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_insights_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174916_g_analytics_insights_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_issues_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_issues_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174919_g_analytics_issues_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175002_g_analytics_merge_request_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_productivity_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_productivity_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174923_g_analytics_productivity_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_valuestream_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_valuestream_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174927_g_analytics_valuestream_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_cohorts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_cohorts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174955_i_analytics_cohorts_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_score_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174958_i_analytics_dev_ops_score_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_instance_statistics_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_instance_statistics_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_code_reviews_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_code_reviews_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174935_p_analytics_code_reviews_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_insights_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_insights_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174943_p_analytics_insights_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_issues_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_issues_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174947_p_analytics_issues_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175006_p_analytics_merge_request_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_pipelines_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_pipelines_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174931_p_analytics_pipelines_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_repo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_repo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174951_p_analytics_repo_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_valuestream_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_valuestream_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174939_p_analytics_valuestream_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184249_i_ci_secrets_management_vault_build_created_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184532_p_ci_templates_auto_devops_build_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_sast_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.code_review_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.code_review_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_desc_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_title_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_mr_diffs_monthly`
+
+Count of unique merge requests per week|month with diffs viewed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_mr_diffs_weekly`
+
+Count of unique merge requests per week|month with diffs viewed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly`
+
+Count of unique merge requests per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_weekly`
+
+Count of unique merge requests per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly`
+
+Count of unique users per month who added a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_add_suggestion_weekly`
+
+Count of unique users per week who added a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly`
+
+Count of unique users per month who applied a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_weekly`
+
+Count of unique users per week who applied a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approve_mr_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_assigned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_assigned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_assignees_changed_monthly`
+
+Count of unique users per month who changed assignees of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_assignees_changed_weekly`
+
+Count of unique users per week who changed assignees of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_close_mr_monthly`
+
+Count of unique users per week|month who closed a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_close_mr_weekly`
+
+Count of unique users per week|month who closed a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly`
+
+Count of unique users per week|month who commented on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_weekly`
+
+Count of unique users per week|month who commented on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_monthly`
+
+Count of unique users per week|month who created a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_weekly`
+
+Count of unique users per week|month who created a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_review_note_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly`
+
+Count of unique users per week|month who edited a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_weekly`
+
+Count of unique users per week|month who edited a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_labels_changed_monthly`
+
+Count of unique users per month who changed labels of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_labels_changed_weekly`
+
+Count of unique users per week who changed labels of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly`
+
+Count of unique users per week|month who merged a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_merge_mr_weekly`
+
+Count of unique users per week|month who merged a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_milestone_changed_monthly`
+
+Count of unique users per month who changed milestone of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_milestone_changed_weekly`
+
+Count of unique users per week who changed milestone of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_monthly`
+
+Count of unique users per month who locked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_weekly`
+
+Count of unique users per week who locked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_monthly`
+
+Count of unique users per month who unlocked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_weekly`
+
+Count of unique users per week who unlocked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_publish_review_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_publish_review_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly`
+
+Count of unique users per week|month who removed a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_weekly`
+
+Count of unique users per week|month who removed a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly`
+
+Count of unique users per week|month who reopened a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_reopen_mr_weekly`
+
+Count of unique users per week|month who reopened a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_thread_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_review_requested_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_review_requested_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_reviewers_changed_monthly`
+
+Count of unique users per month who changed reviewers of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_reviewers_changed_weekly`
+
+Count of unique users per week who changed reviewers of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly`
+
+Count of unique users per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_weekly`
+
+Count of unique users per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly`
+
+Count of unique users per month who changed time estimate of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly`
+
+Count of unique users per week who changed time estimate of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly`
+
+Count of unique users per month who changed time spent on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly`
+
+Count of unique users per week who changed time spent on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.a_compliance_audit_events_api_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.a_compliance_audit_events_api_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183940_a_compliance_audit_events_api_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.compliance_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.compliance_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183944_compliance_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.g_compliance_audit_events_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.g_compliance_audit_events_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183928_g_compliance_audit_events_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.g_compliance_dashboard_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.g_compliance_dashboard_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183924_g_compliance_dashboard_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.i_compliance_audit_events_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.i_compliance_audit_events_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183932_i_compliance_audit_events_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.i_compliance_credential_inventory_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.i_compliance_credential_inventory_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183936_i_compliance_credential_inventory_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_token_monthly`
+
+Distinct user count events for RubyGems packages in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_token_weekly`
+
+Distinct RubyGems pakages deployed in recent 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184951_i_ecosystem_jira_service_create_issue_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184947_i_ecosystem_jira_service_list_issues_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a confidential issue by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a confidential issue by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_monthly`
+
+Calculated unique users to trigger a Slack message by creating a confidential note by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_weekly`
+
+Calculated unique users to trigger a Slack message by creating a confidential note by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a deployment by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a deployment by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on an issue by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on an issue by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a merge request by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a merge request by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_monthly`
+
+Calculated unique users to trigger a Slack message by creating a note by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_weekly`
+
+Calculated unique users to trigger a Slack message by creating a note by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a Git push by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a Git push by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a tag push by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a tag push by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a wiki page by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a wiki page by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sfe_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sfe_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.g_edit_by_sse_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sse_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_web_ide_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_alert_assigned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_alert_assigned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_alert_status_changed_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_alert_todo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_alert_todo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_assigned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_assigned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_closed_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_closed_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_created_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_created_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_published_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_published_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180605_incident_management_incident_published_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_relate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_relate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_reopened_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_reopened_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_todo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_todo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_unrelate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly`
+
+Count of unique users per month to create an incident corresponding to an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_weekly`
+
+Count of unique users per week to create an incident corresponding to an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_monthly`
+
+Count of MAU adding an issue to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_weekly`
+
+Count of WAU adding an issue to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181413_g_project_management_issue_added_to_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_monthly`
+
+Count of MAU changing issue assignees
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_weekly`
+
+Count of WAU changing issue assignees
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_monthly`
+
+Count of MAU changing the epic on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_weekly`
+
+Count of WAU changing the epic on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181418_g_project_management_issue_changed_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cloned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly`
+
+Count of MAU closing an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_closed_weekly`
+
+Count of WAU closing an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly`
+
+Count of MAU commenting on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_weekly`
+
+Count of WAU commenting on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly`
+
+Count of MAU editing a comment on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_weekly`
+
+Count of WAU editing a comment on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly`
+
+Count of MAU deleting a comment from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_weekly`
+
+Count of WAU deleting a comment from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_created_monthly`
+
+Count of MAU creating new issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_created_weekly`
+
+Count of WAU creating issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly`
+
+Count of MAU referencing an issue from somewhere else
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_weekly`
+
+Count of WAU referncing an issue from somewhere else
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly`
+
+Count of MAU editing an issue description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_weekly`
+
+Count of WAU editing an issue description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly`
+
+Count of MAU adding a design to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_weekly`
+
+Count of WAU adding a design to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly`
+
+Count of MAU modifying a design on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_weekly`
+
+Count of WAU modifying a design on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly`
+
+Count of MAU removing a design from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_weekly`
+
+Count of WAU removing a design from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly`
+
+Count of MAU changing an issue due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_weekly`
+
+Count of WAU changing an issue due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_monthly`
+
+Count of MAU changing the health status on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_weekly`
+
+Count of WAU changing the health status on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181455_g_project_management_issue_health_status_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_monthly`
+
+Count of MAU changing an issue's iteration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_weekly`
+
+Count of WAU changing an issue's iteration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181339_g_project_management_issue_iteration_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly`
+
+Count of MAU changing an issue's label
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_weekly`
+
+Count of WAU changing an issue's label
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly`
+
+Count of MAU locking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_locked_weekly`
+
+Count of WAU locking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly`
+
+Count of MAU making an issue confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_weekly`
+
+Count of WAU making an issue confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly`
+
+Count of MAU making an issue not confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_weekly`
+
+Count of WAU making an issue not confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly`
+
+Count of MAU marking an issue as a duplicate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_weekly`
+
+Count of WAU marking an issue as a duplicate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly`
+
+Count of MAU changing an issue's milestone
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_weekly`
+
+Count of WAU changing an issue's milestone
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly`
+
+Count of MAU moving an issue to another project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_moved_weekly`
+
+Count of WAU moving an issue to another project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_related_monthly`
+
+Count of MAU relating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_related_weekly`
+
+Count of WAU relating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_monthly`
+
+Count of MAU removing an issue from an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184221_g_project_management_issue_removed_from_epic_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly`
+
+Count of MAU re-opening a closed issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_reopened_weekly`
+
+Count of WAU re-opening a closed issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly`
+
+Count of MAU changing an issue time estimate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_weekly`
+
+Count of WAU changing an issue time estimate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly`
+
+Count of MAU recording time spent on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_weekly`
+
+Count of WAU recording time spent on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly`
+
+Count of MAU editing an issue title
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`
Distinct users count that changed issue title in a group for last recent week
-| field | value |
-| --- | --- |
-| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`** |
-| `product_stage` | plan |
-| `product_group` | `group::project management` |
-| `product_category` | issue_tracking |
-| `value_type` | number |
-| `status` | data_available |
-| `milestone` | 13.6 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/issues/229918) |
-| `time_frame` | 7d |
-| `data_source` | Redis_hll |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `reply_by_email_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly`
+
+Count of MAU marking an issue as blocked or blocked by
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_weekly`
+
+Count of WAU marking an issue as blocked or blocked by
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly`
+
+Count of MAU unrelating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_weekly`
+
+Count of WAU unrelating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_monthly`
+
+Count of MAU changing an issue's weight
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_weekly`
+
+Count of WAU changing an issue's weight
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181343_g_project_management_issue_weight_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly`
+
+Count of MAU taking an action related to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_weekly`
+
+Count of WAU taking an action related to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly`
+
+Monthly unique user count having merge requests which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml)
+
+Group: `group::pipeline authoring`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly`
+
+Weekly unique user count having merge requests which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml)
+
+Group: `group::pipeline authoring`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_approve_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_approve_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_multiple_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_multiple_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181514_i_quickactions_assign_multiple_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_self_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_self_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_single_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_single_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_award_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_award_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_board_move_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_board_move_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_child_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_child_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181532_i_quickactions_child_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_clear_weight_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_clear_weight_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181536_i_quickactions_clear_weight_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_clone_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_clone_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_close_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_close_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_confidential_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_confidential_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_create_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_done_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_done_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_draft_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_draft_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_due_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_due_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_duplicate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_duplicate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181617_i_quickactions_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_estimate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_estimate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_monthly`
+
+Unique users using the /invite_email quick action to add a multiple email participants to an issue within 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_weekly`
+
+Unique users using the /invite_email quick action to add a multiple email participants to an issue within 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml)
+
+Group: `group::product planning`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_single_monthly`
+
+Unique users using the /invite_email quick action to add a single email participant to an issue within 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_single_weekly`
+
+Unique users using the /invite_email quick action to add a single email participant to an issue within 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml)
+
+Group: `group::product planning`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_iteration_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_iteration_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181624_i_quickactions_iteration_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_label_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_label_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_lock_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_lock_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_merge_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_merge_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_milestone_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_milestone_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_move_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_move_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_parent_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_parent_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181646_i_quickactions_parent_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_promote_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_promote_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181650_i_quickactions_promote_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_publish_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_publish_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181654_i_quickactions_publish_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_rebase_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_rebase_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_relabel_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_relabel_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_relate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_relate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181716_i_quickactions_remove_child_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_due_date_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181723_i_quickactions_remove_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_estimate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_iteration_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_iteration_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181731_i_quickactions_remove_iteration_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_milestone_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181738_i_quickactions_remove_parent_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_zoom_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_reopen_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_reopen_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_shrug_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_shrug_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_add_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_add_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_subtract_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_submit_review_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_submit_review_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_subscribe_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_subscribe_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_tableflip_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_tableflip_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_tag_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_tag_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_target_branch_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_target_branch_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_title_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_title_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_todo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_todo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_all_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_specific_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_all_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unlock_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlock_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unsubscribe_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_weight_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_weight_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181856_i_quickactions_weight_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_wip_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_wip_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_zoom_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_zoom_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.quickactions_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.search.i_search_advanced_monthly`
+
+Calculated unique users to perform Advanced searches by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180427_i_search_advanced_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_advanced_weekly`
+
+Calculated unique users to perform Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180425_i_search_advanced_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_paid_monthly`
+
+Calculated unique users to perform a search with a paid license enabled by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216184035_i_search_paid_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_paid_weekly`
+
+Calculated unique users to perform a search with a paid license enabled by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184033_i_search_paid_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_total_monthly`
+
+Calculated unique users to perform Basic or Advanced searches by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_total_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.search_total_unique_counts_monthly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.search_total_unique_counts_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.snippets.i_snippets_show_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.snippets.i_snippets_show_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.design_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182106_design_action_monthly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.design_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182104_design_action_weekly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.git_write_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.git_write_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.i_source_code_code_intelligence_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.i_source_code_code_intelligence_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.merge_request_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.merge_request_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.project_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182109_project_action_monthly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.project_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182107_project_action_weekly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.wiki_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.wiki_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.terraform.p_terraform_state_api_unique_users_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.testing.i_testing_full_code_quality_report_total_monthly`
+
+Count of unique users per week|month who visit the full code quality report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182147_i_testing_full_code_quality_report_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_full_code_quality_report_total_weekly`
+
+Count of unique users per week|month who visit the full code quality report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182145_i_testing_full_code_quality_report_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_monthly`
+
+Count of unique users per week|month who click on a project link in the group code coverage table
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182153_i_testing_group_code_coverage_project_click_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184132_i_testing_group_code_coverage_project_click_total_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_monthly`
+
+Count of unique users per week|month who visited the group code coverage page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182143_i_testing_group_code_coverage_visit_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_weekly`
+
+Count of unique users per week|month who visited the group code coverage page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182141_i_testing_group_code_coverage_visit_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_load_performance_widget_total_monthly`
+
+Count of unique users per week|month who expanded the load performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182156_i_testing_load_performance_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_load_performance_widget_total_weekly`
+
+Count of unique users per week|month who expanded the load performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182154_i_testing_load_performance_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_monthly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_weekly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_widget_total_monthly`
+
+Count of unique users per week|month who expanded the metrics report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182139_i_testing_metrics_report_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_widget_total_weekly`
+
+Count of unique users per week|month who expanded the metrics report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182138_i_testing_metrics_report_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_test_case_parsed_monthly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_test_case_parsed_weekly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_web_performance_widget_total_monthly`
+
+Count of unique users per week|month who expanded the browser performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182151_i_testing_web_performance_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_web_performance_widget_total_weekly`
+
+Count of unique users per week|month who expanded the browser performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182149_i_testing_web_performance_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.testing_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.testing.testing_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184138_testing_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_composer_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_composer_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_conan_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_conan_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_container_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_container_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_debian_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_debian_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_generic_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_generic_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_golang_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_golang_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_maven_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_maven_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_npm_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_npm_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_nuget_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_nuget_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_pypi_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_pypi_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_rubygems_user_monthly`
+
+Distinct user count events for RubyGems packages in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_rubygems_user_weekly`
+
+Distinct user count events for RubyGems packages in recent 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_tag_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_tag_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.user_packages_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `reply_by_email_enabled`
Whether incoming email is setup
-| field | value |
-| --- | --- |
-| `key_path` | **`reply_by_email_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `signup_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124916_reply_by_email_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `search_unique_visits.i_search_advanced`
+
+Calculated unique users to perform Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180418_i_search_advanced.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `search_unique_visits.i_search_paid`
+
+Calculated unique users to perform a search with a paid license enabled by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180420_i_search_paid.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `search_unique_visits.i_search_total`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180416_i_search_total.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `search_unique_visits.search_unique_visits_for_any_target_monthly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `search_unique_visits.search_unique_visits_for_any_target_weekly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 7 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183920_search_unique_visits_for_any_target_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `settings.ldap_encrypted_secrets_enabled`
+
+Is encrypted LDAP secrets configured?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `settings.operating_system`
+
+Information about the operating system running GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210225045628_operating_system.yml)
+
+Group: `group::distribution`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `signup_enabled`
Whether public signup is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`signup_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `uuid`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124918_signup_enabled.yml)
+
+Group: `group::access`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `topology.duration_s`
+
+Time it took to collect topology data
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180922_duration_s.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `topology.failures`
+
+Contains information about failed queries
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180924_failures.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175339_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175341_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175337_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.projects_slack_notifications_active`
+
+Unique projects with Slack webhook enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175400_projects_slack_notifications_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.configure.projects_slack_slash_active`
+
+Unique projects with Slack ‘/’ commands enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175402_projects_slack_slash_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.approval_project_rules`
+
+Number of project approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182030_approval_project_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_less_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_more_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules with not default target branch
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182032_approval_project_rules_with_target_branch.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.deploy_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182010_deploy_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182012_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.merge_requests`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175045_merge_requests.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.merge_requests_with_added_rules`
+
+Merge Requests with added rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175047_merge_requests_with_added_rules.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.merge_requests_with_optional_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175049_merge_requests_with_optional_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.merge_requests_with_overridden_project_rules`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.merge_requests_with_required_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175051_merge_requests_with_required_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.projects_enforcing_code_owner_approval`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_with_repositories_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_with_sectional_code_owner_rules`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.protected_branches`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182025_protected_branches.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.remote_mirrors`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182017_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.snippets`
+
+Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180316_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.suggestions`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175053_suggestions.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.total_number_of_locked_files`
+
+The total number of exclusive file locks (through the CLI)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.total_number_of_path_locks`
+
+The total number of default branch locks done through the GitLab UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.users_using_lfs_locks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.users_using_path_locks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183344_users_using_path_locks.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.bulk_imports.gitlab`
+
+Distinct count of users that triggered an import using the Group Migration tool
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180634_gitlab.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.bulk_imports.gitlab_v1`
+
+Count of imports using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180636_gitlab_v1.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180754_events.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_imports.gitlab_migration`
+
+Count of groups imported using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180703_gitlab_migration.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_imports.group_import`
+
+Count of group imports using Group Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180702_group_import.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_saml_enabled`
+
+Has the instance enabled Group SAML SSO `https://docs.gitlab.com/ee/user/group/saml_sso/` on at least 1 group?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180813_group_saml_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `premium`
+
+### `usage_activity_by_stage.manage.groups`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180756_groups.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.groups_imported`
+
+Distinct count of users that imported groups using Group Import
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180729_groups_imported.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.csv`
+
+Count of (attempted) imports from csv files
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180700_csv.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.fogbugz`
+
+Count of projects imported from fogbugz
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180656_fogbugz.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.jira`
+
+Count of projects imported from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180654_jira.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.phabricator`
+
+Count of projects imported from phabricator
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180658_phabricator.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.csv`
+
+Distinct count of users that imported issues into projects using CSV upload
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180727_csv.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.fogbugz`
+
+Distinct count of users that imported issues into projects using FogBugz
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180724_fogbugz.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.jira`
+
+Distinct count of users that imported issues into projects using Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180722_jira.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.phabricator`
+
+Distinct count of users that imported issues into projects using Phabricator
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180726_phabricator.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.ldap_admin_sync_enabled`
+
+Has the instance configured LDAP Admin Sync `https://docs.gitlab.com/ee/administration/auth/ldap/#administrator-sync`?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180811_ldap_admin_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.ldap_group_sync_enabled`
+
+Has the instance configured LDAP Group Sync `https://docs.gitlab.com/ee/administration/auth/ldap/#group-sync`?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180809_ldap_group_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.ldap_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180800_ldap_keys.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.ldap_servers`
+
+Number of LDAP servers configured for the instance `https://docs.gitlab.com/ee/administration/auth/ldap/#multiple-ldap-servers`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180807_ldap_servers.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.ldap_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180801_ldap_users.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.omniauth_providers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183400_omniauth_providers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.bitbucket`
+
+Count of projects imported from Bitbucket
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180643_bitbucket.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.bitbucket_server`
+
+Count of projects imported from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180645_bitbucket_server.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.git`
+
+Count of projects imported by URL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180649_git.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitea`
+
+Count of projects imported from Gitea
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180647_gitea.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.github`
+
+Count of projects imported from GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180641_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab`
+
+Count of projects imported from GitLab.com
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180639_gitlab.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab_migration`
+
+Count of projects imported using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180652_gitlab_migration.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab_project`
+
+Count of projects imported using Project Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180638_gitlab_project.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.manifest`
+
+Count of projects imported using manifst file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180650_manifest.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.bitbucket`
+
+Distinct count of users that imported projects from Bitbucket Cloud
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180713_bitbucket.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.bitbucket_server`
+
+Distinct count of users that imported projects from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180715_bitbucket_server.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.git`
+
+Distinct count of users that imported projects using Import by URL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180718_git.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitea`
+
+Distinct count of users that imported projects from Gitea
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180716_gitea.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.github`
+
+Distinct count of users that imported projects from GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180711_github.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitlab`
+
+Distinct count of users that imported projects from GitLab.com
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180709_gitlab.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitlab_project`
+
+Distinct count of users that imported projects using Project Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180707_gitlab_project.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.manifest`
+
+Distinct count of users that imported projects using Manifest file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180720_manifest.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.total`
+
+Total count of all projects imported with import_source NOT NULL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180705_total.yml)
+
+Group: `group::import`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_with_compliance_framework`
+
+Number of projects labeled with a compliance framework label [see](https://gitlab.com/gitlab-org/gitlab/-/issues/118671)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180805_projects_with_compliance_framework.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.unique_users_all_imports`
+
+Distinct count of users that triggered any kind of import
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183410_google_oauth2.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.standard`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183408_standard.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183402_two-factor.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.users_created`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180758_users_created.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.value_stream_management_customized_group_stages`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180803_value_stream_management_customized_group_stages.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.monitor.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180945_clusters.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with Prometheus enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_incident_sla_enabled`
+
+Projects where Incident SLA is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_enabled_alert_integrations_histogram`
+
+Histogram (buckets 1 to 100) of projects with at least 1 enabled integration.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.projects_with_error_tracking_enabled`
+
+Projects where error tracking is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_incidents`
+
+Count of unique projects with an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180518_projects_with_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.package.projects_with_packages`
+
+Projects with package registry configured
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181055_projects_with_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.assignee_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181132_assignee_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.plan.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181134_epics.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181115_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.label_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181135_label_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.milestone_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181137_milestone_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.notes`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181117_notes.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181119_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181126_projects_jira_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.service_desk_enabled_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.service_desk_issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181124_service_desk_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.todos`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181121_todos.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.deployments`
+
+Unique users triggering deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181926_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181928_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.releases`
+
+Unique users creating release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181930_releases.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181932_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.api_fuzzing_scans`
+
+Counts API fuzzing jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180353_api_fuzzing_scans.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.container_scanning_scans`
+
+Counts container scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175503_container_scanning_scans.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.coverage_fuzzing_scans`
+
+Counts fuzzing jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180352_coverage_fuzzing_scans.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.dast_scans`
+
+Counts dast jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182122_dast_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.dependency_scanning_scans`
+
+Counts dependency scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175220_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.sast_scans`
+
+Counts sast jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182120_sast_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.secret_detection_scans`
+
+Counts secret detection jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182123_secret_detection_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_container_scanning_jobs`
+
+no idea, Count of Container Scanning jobs run, it implies user but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175501_user_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_dast_jobs`
+
+Count of DAST jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175614_user_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_dependency_scanning_jobs`
+
+no idea, Count of Dependency Scanning jobs run, it implies user but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175216_user_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_license_management_jobs`
+
+no idea, Count of License Scanning jobs run, it implies user but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210216175218_user_license_management_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Details on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_sast_jobs`
+
+Count of SAST jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182116_user_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.secure.user_secret_detection_jobs`
+
+Count of Secret Detection Jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml)
+
+Group: `group::secure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_builds`
+
+Unique builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175525_ci_builds.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipelines`
+
+Distinct Users triggering Total pipelines
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175537_ci_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175539_ci_triggers.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.clusters_applications_runner`
+
+Total GitLab Managed clusters with Runner enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml)
+
+Group: `group::runner`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175540_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with Cert Manager enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with Ingress enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with Knative enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175415_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175417_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175413_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.projects_slack_notifications_active`
+
+Unique projects with Slack webhook enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175436_projects_slack_notifications_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.configure.projects_slack_slash_active`
+
+Unique projects with Slack ‘/’ commands enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175437_projects_slack_slash_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write`
+
+Aggregated value for wiki, design and project repo actions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit`
+
+Count unique edit actions when users used an IDE, no matter which one
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit`
+
+Count unique edit actions using the single file editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit`
+
+Count unique edit actions using the snippet editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit`
+
+Count unique edit actions using the static site editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit`
+
+Count unique edit actions using the web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules`
+
+Number of project approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182056_approval_project_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_less_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_more_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules with not default target branch
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182058_approval_project_rules_with_target_branch.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.deploy_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182034_deploy_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182036_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.merge_requests`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175055_merge_requests.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175101_merge_requests_users.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_added_rules`
+
+Merge Requests with added rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175103_merge_requests_with_added_rules.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_optional_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175105_merge_requests_with_optional_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_overridden_project_rules`
+
+Number of merge requests that have local rules that have overwritten a project rule
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182047_merge_requests_with_overridden_project_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_required_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175107_merge_requests_with_required_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_with_repositories_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.protected_branches`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182051_protected_branches.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.remote_mirrors`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182038_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.snippets`
+
+Monthly Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180317_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.suggestions`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175109_suggestions.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.total_number_of_locked_files`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.total_number_of_path_locks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.users_using_lfs_locks`
+
+Number of users that have used default branch locks through the UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182054_users_using_lfs_locks.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.users_using_path_locks`
+
+Number of users that have used exclusive file locks through the CLI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182053_users_using_path_locks.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183640_gitlab.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183642_gitlab_v1.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180814_events.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183711_gitlab_migration.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_imports.group_import`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183709_group_import.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_saml_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180833_group_saml_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.groups`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180816_groups.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.groups_imported`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183737_groups_imported.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.csv`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183707_csv.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.fogbugz`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183703_fogbugz.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.jira`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183701_jira.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.phabricator`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183705_phabricator.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.csv`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183735_csv.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.fogbugz`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183731_fogbugz.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.jira`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183730_jira.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.phabricator`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183733_phabricator.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.ldap_admin_sync_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180831_ldap_admin_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.ldap_group_sync_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180829_ldap_group_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.ldap_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180820_ldap_keys.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.ldap_servers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180827_ldap_servers.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.ldap_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180822_ldap_users.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.omniauth_providers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183627_omniauth_providers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.bitbucket`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183650_bitbucket.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183652_bitbucket_server.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.git`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183655_git.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitea`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183653_gitea.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183648_github.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183646_gitlab.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183659_gitlab_migration.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab_project`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183644_gitlab_project.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.manifest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183657_manifest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183720_bitbucket.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183722_bitbucket_server.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.git`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183726_git.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitea`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183724_gitea.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183718_github.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183716_gitlab.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183714_gitlab_project.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.manifest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183728_manifest.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.total`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183712_total.yml)
+
+Group: ``
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_with_compliance_framework`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180825_projects_with_compliance_framework.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.unique_users_all_imports`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183636_google_oauth2.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183634_standard.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183629_two-factor.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.users_created`
+
+Number of users created in the month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180818_users_created.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.value_stream_management_customized_group_stages`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180824_value_stream_management_customized_group_stages.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.monitor.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180956_clusters.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with Prometheus enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_incident_sla_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert created in the last month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_incidents`
+
+Count of unique projects with an incident created in the last month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.package.projects_with_packages`
+
+Incident confidential status changed event
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181057_projects_with_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.assignee_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181156_assignee_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.plan.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181158_epics.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181139_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.label_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181200_label_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.milestone_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181201_milestone_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.notes`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181141_notes.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181143_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181150_projects_jira_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.service_desk_enabled_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.service_desk_issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181148_service_desk_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.todos`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181145_todos.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.deployments`
+
+Unique users triggering deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181935_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181937_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.releases`
+
+Unique users creating release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181939_releases.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181941_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.api_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 API Fuzzing Testing job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180401_api_fuzzing_pipeline.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.api_fuzzing_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.container_scanning_pipeline`
+
+no idea, what is this when did it get added? guess pipelines containing a CS job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175507_container_scanning_pipeline.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.container_scanning_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.coverage_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 coverage-guided Fuzz Testing job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180359_coverage_fuzzing_pipeline.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.dast_pipeline`
+
+Count of pipelines that have at least 1 DAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175618_dast_pipeline.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.dast_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183832_dast_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.dependency_scanning_pipeline`
+
+no idea, what is this when did it get added? guess pipelines containing a DS job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175226_dependency_scanning_pipeline.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.dependency_scanning_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.sast_pipeline`
+
+Counts of Pipelines that have at least 1 SAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182129_sast_pipeline.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.sast_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183826_sast_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.secret_detection_pipeline`
+
+Counts of Pipelines that have at least 1 Secret Detection job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.secret_detection_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job names
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_container_scanning_jobs`
+
+no idea, Count of Container Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175505_user_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_dast_jobs`
+
+Users who run a DAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_dependency_scanning_jobs`
+
+no idea, Count of Dependency Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175222_user_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_license_management_jobs`
+
+no idea, Count of License Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210216175224_user_license_management_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Security Dashboard on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_sast_jobs`
+
+Users who run a SAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_secret_detection_jobs`
+
+Users who run a Secret Detection job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml)
+
+Group: `group::secure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_builds`
+
+Unique builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175542_ci_builds.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipelines`
+
+ Distinct users triggering pipelines in a month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175554_ci_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175556_ci_triggers.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.clusters_applications_runner`
+
+Total GitLab Managed clusters with Runner enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml)
+
+Group: `group::runner`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175558_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `uuid`
GitLab instance unique identifier
-| field | value |
-| --- | --- |
-| `key_path` | **`uuid`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `milestone` | 9.1 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521) |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `web_ide_clientside_preview_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210201124933_uuid.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `version`
+
+Version of GitLab instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175601_version.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `web_ide_clientside_preview_enabled`
Whether web ide clientside preview is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`web_ide_clientside_preview_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
diff --git a/doc/development/usage_ping/index.md b/doc/development/usage_ping/index.md
new file mode 100644
index 00000000000..604d59f42e1
--- /dev/null
+++ b/doc/development/usage_ping/index.md
@@ -0,0 +1,1337 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Usage Ping Guide
+
+> Introduced in GitLab Ultimate 11.2, more statistics.
+
+This guide describes Usage Ping's purpose and how it's implemented.
+
+For more information about Product Intelligence, see:
+
+- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
+- [Snowplow Guide](../snowplow.md)
+
+More links:
+
+- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
+- [Data Analysis Process](https://about.gitlab.com/handbook/business-ops/data-team/#data-analysis-process/)
+- [Data for Product Managers](https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/)
+- [Data Infrastructure](https://about.gitlab.com/handbook/business-ops/data-team/platform/infrastructure/)
+
+## What is Usage Ping?
+
+- GitLab sends a weekly payload containing usage data to GitLab Inc. Usage Ping provides high-level data to help our product, support, and sales teams. It does not send any project names, usernames, or any other specific data. The information from the usage ping is not anonymous, it is linked to the hostname of the instance. Sending usage ping is optional, and any instance can disable analytics.
+- The usage data is primarily composed of row counts for different tables in the instance’s database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features in the product. In addition to counts, other facts
+ that help us classify and understand GitLab installations are collected.
+- Usage ping is important to GitLab as we use it to calculate our Stage Monthly Active Users (SMAU) which helps us measure the success of our stages and features.
+- While usage ping is enabled, GitLab gathers data from the other instances and can show usage statistics of your instance to your users.
+
+### Why should we enable Usage Ping?
+
+- The main purpose of Usage Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions.
+- As a benefit of having the usage ping active, GitLab lets you analyze the users’ activities over time of your GitLab installation.
+- As a benefit of having the usage ping active, GitLab provides you with The DevOps Report,which gives you an overview of your entire instance’s adoption of Concurrent DevOps from planning to monitoring.
+- You get better, more proactive support. (assuming that our TAMs and support organization used the data to deliver more value)
+- You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization?
+- You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
+- Usage Ping is enabled by default. To disable it, see [Disable Usage Ping](#disable-usage-ping).
+
+### Limitations
+
+- Usage Ping does not track frontend events things like page views, link clicks, or user sessions, and only focuses on aggregated backend events.
+- Because of these limitations we recommend instrumenting your products with Snowplow for more detailed analytics on GitLab.com and use Usage Ping to track aggregated backend events on self-managed.
+
+## Usage Ping payload
+
+You can view the exact JSON payload sent to GitLab Inc. in the administration panel. To view the payload:
+
+1. Navigate to **Admin Area > Settings > Metrics and profiling**.
+1. Expand the **Usage statistics** section.
+1. Click the **Preview payload** button.
+
+For an example payload, see [Example Usage Ping payload](#example-usage-ping-payload).
+
+## Disable Usage Ping
+
+To disable Usage Ping in the GitLab UI, go to the **Settings** page of your administration panel and uncheck the **Usage Ping** checkbox.
+
+To disable Usage Ping and prevent it from being configured in the future through the administration panel, Omnibus installs can set the following in [`gitlab.rb`](https://docs.gitlab.com/omnibus/settings/configuration.html#configuration-options):
+
+```ruby
+gitlab_rails['usage_ping_enabled'] = false
+```
+
+Source installations can set the following in `gitlab.yml`:
+
+```yaml
+production: &base
+ # ...
+ gitlab:
+ # ...
+ usage_ping_enabled: false
+```
+
+## Usage Ping request flow
+
+The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
+
+```mermaid
+sequenceDiagram
+ participant GitLab Instance
+ participant Versions Application
+ participant Licenses Application
+ participant Salesforce
+ participant S3 Bucket
+ participant Snowflake DW
+ participant Sisense Dashboards
+ GitLab Instance->>Versions Application: Send Usage Ping
+ loop Process usage data
+ Versions Application->>Versions Application: Parse usage data
+ Versions Application->>Versions Application: Write to database
+ Versions Application->>Versions Application: Update license ping time
+ end
+ loop Process data for Salesforce
+ Versions Application-xLicenses Application: Request Zuora subscription id
+ Licenses Application-xVersions Application: Zuora subscription id
+ Versions Application-xSalesforce: Request Zuora account id by Zuora subscription id
+ Salesforce-xVersions Application: Zuora account id
+ Versions Application-xSalesforce: Usage data for the Zuora account
+ end
+ Versions Application->>S3 Bucket: Export Versions database
+ S3 Bucket->>Snowflake DW: Import data
+ Snowflake DW->>Snowflake DW: Transform data using dbt
+ Snowflake DW->>Sisense Dashboards: Data available for querying
+ Versions Application->>GitLab Instance: DevOps Report (Conversational Development Index)
+```
+
+## How Usage Ping works
+
+1. The Usage Ping [cron job](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/gitlab_usage_ping_worker.rb#L30) is set in Sidekiq to run weekly.
+1. When the cron job runs, it calls [`Gitlab::UsageData.to_json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L22).
+1. `Gitlab::UsageData.to_json` [cascades down](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L22) to ~400+ other counter method calls.
+1. The response of all methods calls are [merged together](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L14) into a single JSON payload in `Gitlab::UsageData.to_json`.
+1. The JSON payload is then [posted to the Versions application]( https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L20)
+ If a firewall exception is needed, the required URL depends on several things. If
+ the hostname is `version.gitlab.com`, the protocol is `TCP`, and the port number is `443`,
+ the required URL is <https://version.gitlab.com/>.
+
+## Usage Ping Metric Life cycle
+
+### 1. New metrics addition
+
+Please follow the [Implementing Usage Ping](#implementing-usage-ping) guide.
+
+### 2. Existing metric change
+
+Because we do not control when customers update their self-managed instances of GitLab,
+we **STRONGLY DISCOURAGE** changes to the logic used to calculate any metric.
+Any such changes lead to inconsistent reports from multiple GitLab instances.
+If there is a problem with an existing metric, it's best to deprecate the existing metric,
+and use it, side by side, with the desired new metric.
+
+Example:
+Consider following change. Before GitLab 12.6, the `example_metric` was implemented as:
+
+```ruby
+{
+ ...
+ example_metric: distinct_count(Project, :creator_id)
+}
+```
+
+For GitLab 12.6, the metric was changed to filter out archived projects:
+
+```ruby
+{
+ ...
+ example_metric: distinct_count(Project.non_archived, :creator_id)
+}
+```
+
+In this scenario all instances running up to GitLab 12.5 continue to report `example_metric`,
+including all archived projects, while all instances running GitLab 12.6 and higher filters
+out such projects. As Usage Ping data is collected from all reporting instances, the
+resulting dataset includes mixed data, which distorts any following business analysis.
+
+The correct approach is to add a new metric for GitLab 12.6 release with updated logic:
+
+```ruby
+{
+ ...
+ example_metric_without_archived: distinct_count(Project.non_archived, :creator_id)
+}
+```
+
+and update existing business analysis artefacts to use `example_metric_without_archived` instead of `example_metric`
+
+### 3. Metrics deprecation and removal
+
+The process for deprecating and removing metrics is under development. For
+more information, see the following [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/284637).
+
+## Implementing Usage Ping
+
+Usage Ping consists of two kinds of data, counters and observations. Counters track how often a certain event
+happened over time, such as how many CI pipelines have run. They are monotonic and always trend up.
+Observations are facts collected from one or more GitLab instances and can carry arbitrary data. There are no
+general guidelines around how to collect those, due to the individual nature of that data.
+
+There are several types of counters which are all found in `usage_data.rb`:
+
+- **Ordinary Batch Counters:** Simple count of a given ActiveRecord_Relation
+- **Distinct Batch Counters:** Distinct count of a given ActiveRecord_Relation in a given column
+- **Sum Batch Counters:** Sum the values of a given ActiveRecord_Relation in a given column
+- **Alternative Counters:** Used for settings and configurations
+- **Redis Counters:** Used for in-memory counts.
+
+NOTE:
+Only use the provided counter methods. Each counter method contains a built in fail safe to isolate each counter to avoid breaking the entire Usage Ping.
+
+### Why batch counting
+
+For large tables, PostgreSQL can take a long time to count rows due to MVCC [(Multi-version Concurrency Control)](https://en.wikipedia.org/wiki/Multiversion_concurrency_control). Batch counting is a counting method where a single large query is broken into multiple smaller queries. For example, instead of a single query querying 1,000,000 records, with batch counting, you can execute 100 queries of 10,000 records each. Batch counting is useful for avoiding database timeouts as each batch query is significantly shorter than one single long running query.
+
+For GitLab.com, there are extremely large tables with 15 second query timeouts, so we use batch counting to avoid encountering timeouts. Here are the sizes of some GitLab.com tables:
+
+| Table | Row counts in millions |
+|------------------------------|------------------------|
+| `merge_request_diff_commits` | 2280 |
+| `ci_build_trace_sections` | 1764 |
+| `merge_request_diff_files` | 1082 |
+| `events` | 514 |
+
+We have several batch counting methods available:
+
+- [Ordinary Batch Counters](#ordinary-batch-counters)
+- [Distinct Batch Counters](#distinct-batch-counters)
+- [Sum Batch Counters](#sum-batch-counters)
+- [Estimated Batch Counters](#estimated-batch-counters)
+
+Batch counting requires indexes on columns to calculate max, min, and range queries. In some cases,
+you may need to add a specialized index on the columns involved in a counter.
+
+### Ordinary Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Simple count of a given `ActiveRecord_Relation`, does a non-distinct batch count, smartly reduces `batch_size`, and handles errors.
+
+Method: `count(relation, column = nil, batch: true, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the count
+- `column` the column to perform the count on, by default is the primary key
+- `batch`: default `true` to use batch counting
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+Examples:
+
+```ruby
+count(User.active)
+count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
+count(::Clusters::Cluster.aws_installed.enabled, :cluster_id, start: ::Clusters::Cluster.minimum(:id), finish: ::Clusters::Cluster.maximum(:id))
+```
+
+### Distinct Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Distinct count of a given `ActiveRecord_Relation` on given column, a distinct batch count, smartly reduces `batch_size`, and handles errors.
+
+Method: `distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the count
+- `column` the column to perform the distinct count, by default is the primary key
+- `batch`: default `true` to use batch counting
+- `batch_size`: if none set it uses default value 10000 from `Gitlab::Database::BatchCounter`
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+WARNING:
+Counting over non-unique columns can lead to performance issues. Take a look at the [iterating tables in batches](../iterating_tables_in_batches.md) guide for more details.
+
+Examples:
+
+```ruby
+distinct_count(::Project, :creator_id)
+distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
+distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
+```
+
+### Sum Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Sum the values of a given ActiveRecord_Relation on given column and handles errors.
+
+Method: `sum(relation, column, batch_size: nil, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the operation
+- `column` the column to sum on
+- `batch_size`: if none set it uses default value 1000 from `Gitlab::Database::BatchCounter`
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+Examples:
+
+```ruby
+sum(JiraImportState.finished, :imported_issues_count)
+```
+
+### Grouping & Batch Operations
+
+The `count`, `distinct_count`, and `sum` batch counters can accept an `ActiveRecord::Relation`
+object, which groups by a specified column. With a grouped relation, the methods do batch counting,
+handle errors, and returns a hash table of key-value pairs.
+
+Examples:
+
+```ruby
+count(Namespace.group(:type))
+# returns => {nil=>179, "Group"=>54}
+
+distinct_count(Project.group(:visibility_level), :creator_id)
+# returns => {0=>1, 10=>1, 20=>11}
+
+sum(Issue.group(:state_id), :weight))
+# returns => {1=>3542, 2=>6820}
+```
+
+### Estimated Batch Counters
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48233) in GitLab 13.7.
+
+Estimated batch counter functionality handles `ActiveRecord::StatementInvalid` errors
+when used through the provided `estimate_batch_distinct_count` method.
+Errors return a value of `-1`.
+
+WARNING:
+This functionality estimates a distinct count of a specific ActiveRecord_Relation in a given column,
+which uses the [HyperLogLog](http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf) algorithm.
+As the HyperLogLog algorithm is probabilistic, the **results always include error**.
+The highest encountered error rate is 4.9%.
+
+When correctly used, the `estimate_batch_distinct_count` method enables efficient counting over
+columns that contain non-unique values, which can not be assured by other counters.
+
+#### estimate_batch_distinct_count method
+
+Method: `estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`
+
+The [method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
+includes the following arguments:
+
+- `relation`: The ActiveRecord_Relation to perform the count.
+- `column`: The column to perform the distinct count. The default is the primary key.
+- `batch_size`: From `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`. Default value: 10,000.
+- `start`: The custom start of the batch count, to avoid complex minimum calculations.
+- `finish`: The custom end of the batch count to avoid complex maximum calculations.
+
+The method includes the following prerequisites:
+
+1. The supplied `relation` must include the primary key defined as the numeric column.
+ For example: `id bigint NOT NULL`.
+1. The `estimate_batch_distinct_count` can handle a joined relation. To use its ability to
+ count non-unique columns, the joined relation **must NOT** have a one-to-many relationship,
+ such as `has_many :boards`.
+1. Both `start` and `finish` arguments should always represent primary key relationship values,
+ even if the estimated count refers to another column, for example:
+
+ ```ruby
+ estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
+ ```
+
+Examples:
+
+1. Simple execution of estimated batch counter, with only relation provided,
+ returned value represents estimated number of unique values in `id` column
+ (which is the primary key) of `Project` relation:
+
+ ```ruby
+ estimate_batch_distinct_count(::Project)
+ ```
+
+1. Execution of estimated batch counter, where provided relation has applied
+ additional filter (`.where(time_period)`), number of unique values estimated
+ in custom column (`:author_id`), and parameters: `start` and `finish` together
+ apply boundaries that defines range of provided relation to analyze:
+
+ ```ruby
+ estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
+ ```
+
+1. Execution of estimated batch counter with joined relation (`joins(:cluster)`),
+ for a custom column (`'clusters.user_id'`):
+
+ ```ruby
+ estimate_batch_distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
+ ```
+
+When instrumenting metric with usage of estimated batch counter please add
+`_estimated` suffix to its name, for example:
+
+```ruby
+ "counts": {
+ "ci_builds_estimated": estimate_batch_distinct_count(Ci::Build),
+ ...
+```
+
+### Redis Counters
+
+Handles `::Redis::CommandError` and `Gitlab::UsageDataCounters::BaseCounter::UnknownEvent`
+returns -1 when a block is sent or hash with all values -1 when a `counter(Gitlab::UsageDataCounters)` is sent
+different behavior due to 2 different implementations of Redis counter
+
+Method: `redis_usage_data(counter, &block)`
+
+Arguments:
+
+- `counter`: a counter from `Gitlab::UsageDataCounters`, that has `fallback_totals` method implemented
+- or a `block`: which is evaluated
+
+#### Ordinary Redis Counters
+
+Examples of implementation:
+
+- Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
+- Using Redis methods [`HINCRBY`](https://redis.io/commands/hincrby), [`HGETALL`](https://redis.io/commands/hgetall), and [`Gitlab::UsageCounters::PodLogs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_counters/pod_logs.rb)
+
+##### UsageData API Tracking
+
+<!-- There's nearly identical content in `##### Adding new events`. If you fix errors here, you may need to fix the same errors in the other location. -->
+
+1. Track event using `UsageData` API
+
+ Increment event count using ordinary Redis counter, for given event name.
+
+ Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
+
+ API requests are protected by checking for a valid CSRF token.
+
+ To be able to increment the values, the related feature `usage_data_<event_name>` should be enabled.
+
+ ```plaintext
+ POST /usage_data/increment_counter
+ ```
+
+ | Attribute | Type | Required | Description |
+ | :-------- | :--- | :------- | :---------- |
+ | `event` | string | yes | The event name it should be tracked |
+
+ Response
+
+ - `200` if event was tracked
+ - `400 Bad request` if event parameter is missing
+ - `401 Unauthorized` if user is not authenticated
+ - `403 Forbidden` for invalid CSRF token provided
+
+1. Track events using JavaScript/Vue API helper which calls the API above
+
+ Note that `usage_data_api` and `usage_data_#{event_name}` should be enabled to be able to track events
+
+ ```javascript
+ import api from '~/api';
+
+ api.trackRedisCounterEvent('my_already_defined_event_name'),
+ ```
+
+#### Redis HLL Counters
+
+WARNING:
+HyperLogLog (HLL) is a probabilistic algorithm and its **results always includes some small error**. According to [Redis documentation](https://redis.io/commands/pfcount), data from
+used HLL implementation is "approximated with a standard error of 0.81%".
+
+With `Gitlab::UsageDataCounters::HLLRedisCounter` we have available data structures used to count unique values.
+
+Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PFCOUNT](https://redis.io/commands/pfcount).
+
+##### Adding new events
+
+1. Define events in [`known_events`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/).
+
+ Example event:
+
+ ```yaml
+ - name: i_compliance_credential_inventory
+ category: compliance
+ redis_slot: compliance
+ expiry: 42 # 6 weeks
+ aggregation: weekly
+ ```
+
+ Keys:
+
+ - `name`: unique event name.
+
+ Name format `<prefix>_<redis_slot>_name`.
+
+ Use one of the following prefixes for the event's name:
+
+ - `g_` for group, as an event which is tracked for group.
+ - `p_` for project, as an event which is tracked for project.
+ - `i_` for instance, as an event which is tracked for instance.
+ - `a_` for events encompassing all `g_`, `p_`, `i_`.
+ - `o_` for other.
+
+ Consider including in the event's name the Redis slot to be able to count totals for a specific category.
+
+ Example names: `i_compliance_credential_inventory`, `g_analytics_contribution`.
+
+ - `category`: event category. Used for getting total counts for events in a category, for easier
+ access to a group of events.
+ - `redis_slot`: optional Redis slot; default value: event name. Used if needed to calculate totals
+ for a group of metrics. Ensure keys are in the same slot. For example:
+ `i_compliance_credential_inventory` with `redis_slot: 'compliance'` builds Redis key
+ `i_{compliance}_credential_inventory-2020-34`. If `redis_slot` is not defined the Redis key will
+ be `{i_compliance_credential_inventory}-2020-34`.
+ - `expiry`: expiry time in days. Default: 29 days for daily aggregation and 6 weeks for weekly
+ aggregation.
+ - `aggregation`: may be set to a `:daily` or `:weekly` key. Defines how counting data is stored in Redis.
+ Aggregation on a `daily` basis does not pull more fine grained data.
+ - `feature_flag`: optional `default_enabled: :yaml`. If no feature flag is set then the tracking is enabled. For details, see our [GitLab internal Feature flags](../feature_flags/index.md) documentation. The feature flags are owned by the group adding the event tracking.
+
+Use one of the following methods to track events:
+
+1. Track event in controller using `RedisTracking` module with `track_redis_hll_event(*controller_actions, name:, if: nil)`.
+
+ Arguments:
+
+ - `controller_actions`: controller actions we want to track.
+ - `name`: event name.
+ - `if`: optional custom conditions, using the same format as with Rails callbacks.
+
+ Example usage:
+
+ ```ruby
+ # controller
+ class ProjectsController < Projects::ApplicationController
+ include RedisTracking
+
+ skip_before_action :authenticate_user!, only: :show
+ track_redis_hll_event :index, :show, name: 'g_compliance_example_feature_visitors'
+
+ def index
+ render html: 'index'
+ end
+
+ def new
+ render html: 'new'
+ end
+
+ def show
+ render html: 'show'
+ end
+ end
+ ```
+
+1. Track event in API using `increment_unique_values(event_name, values)` helper method.
+
+ To be able to track the event, Usage Ping must be enabled and the event feature `usage_data_<event_name>` must be enabled.
+
+ Arguments:
+
+ - `event_name`: event name.
+ - `values`: values counted, one value or array of values.
+
+ Example usage:
+
+ ```ruby
+ get ':id/registry/repositories' do
+ repositories = ContainerRepositoriesFinder.new(
+ user: current_user, subject: user_group
+ ).execute
+
+ increment_unique_values('i_list_repositories', current_user.id)
+
+ present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
+ end
+ ```
+
+1. Track event using `track_usage_event(event_name, values)` in services and GraphQL
+
+ Increment unique values count using Redis HLL, for given event name.
+
+ Example:
+
+ [Track usage event for incident created in service](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/services/issues/update_service.rb#L66)
+
+ [Track usage event for incident created in GraphQL](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/graphql/mutations/alert_management/update_alert_status.rb#L16)
+
+ ```ruby
+ track_usage_event(:incident_management_incident_created, current_user.id)
+ ```
+
+<!-- There's nearly identical content in `##### UsageData API Tracking`. If you find / fix errors here, you may need to fix errors in that section too. -->
+
+1. Track event using `UsageData` API
+
+ Increment unique users count using Redis HLL, for given event name.
+
+ Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
+
+ API requests are protected by checking for a valid CSRF token.
+
+ To increment the values, the related feature `usage_data_<event_name>` should be
+ set to `default_enabled: true`. For more information, see
+ [Feature flags in development of GitLab](../feature_flags/index.md).
+
+ ```plaintext
+ POST /usage_data/increment_unique_users
+ ```
+
+ | Attribute | Type | Required | Description |
+ | :-------- | :--- | :------- | :---------- |
+ | `event` | string | yes | The event name it should be tracked |
+
+ Response
+
+ Return 200 if tracking failed for any reason.
+
+ - `200` if event was tracked or any errors
+ - `400 Bad request` if event parameter is missing
+ - `401 Unauthorized` if user is not authenticated
+ - `403 Forbidden` for invalid CSRF token provided
+
+1. Track events using JavaScript/Vue API helper which calls the API above
+
+ Example usage for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/):
+
+ Usage Data API is behind `usage_data_api` feature flag which, as of GitLab 13.7, is
+ now set to `default_enabled: true`.
+
+ Each event tracked using Usage Data API is behind a feature flag `usage_data_#{event_name}` which should be `default_enabled: true`
+
+ ```javascript
+ import api from '~/api';
+
+ api.trackRedisHllUserEvent('my_already_defined_event_name'),
+ ```
+
+1. Get event data using `Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names:, start_date:, end_date:, context: '')`.
+
+ Arguments:
+
+ - `event_names`: the list of event names.
+ - `start_date`: start date of the period for which we want to get event data.
+ - `end_date`: end date of the period for which we want to get event data.
+ - `context`: context of the event. Allowed values are `default`, `free`, `bronze`, `silver`, `gold`, `starter`, `premium`, `ultimate`.
+
+1. Testing tracking and getting unique events
+
+Trigger events in rails console by using `track_event` method
+
+ ```ruby
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: 1)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: [2, 3])
+ ```
+
+Next, get the unique events for the current week.
+
+ ```ruby
+ # Get unique events for metric for current_week
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'g_compliance_audit_events',
+ start_date: Date.current.beginning_of_week, end_date: Date.current.next_week)
+ ```
+
+##### Recommendations
+
+We have the following recommendations for [Adding new events](#adding-new-events):
+
+- Event aggregation: weekly.
+- Key expiry time:
+ - Daily: 29 days.
+ - Weekly: 42 days.
+- When adding new metrics, use a [feature flag](../../operations/feature_flags.md) to control the impact.
+- For feature flags triggered by another service, set `default_enabled: false`,
+ - Events can be triggered using the `UsageData` API, which helps when there are > 10 events per change
+
+##### Enable/Disable Redis HLL tracking
+
+Events are tracked behind [feature flags](../feature_flags/index.md) due to concerns for Redis performance and scalability.
+
+For a full list of events and corresponding feature flags see, [known_events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/) files.
+
+To enable or disable tracking for specific event in <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
+[enable or disable the corresponding feature](../feature_flags/index.md).
+
+```shell
+/chatops run feature set <feature_name> true
+/chatops run feature set <feature_name> false
+```
+
+##### Known events are added automatically in usage data payload
+
+All events added in [`known_events/common.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml) are automatically added to usage data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L209).
+For each event we add metrics for the weekly and monthly time frames, and totals for each where applicable:
+
+- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#adding-new-events) events and data for the last complete week for weekly [aggregation](#adding-new-events) events.
+- `#{event_name}_monthly`: Data for 28 days for daily [aggregation](#adding-new-events) events and data for the last 4 complete weeks for weekly [aggregation](#adding-new-events) events.
+
+Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation, and Redis slot.
+
+- `#{category}_total_unique_counts_weekly`: Total unique counts for events in the same category for the last 7 days or the last complete week, if events are in the same Redis slot and we have more than one metric.
+- `#{category}_total_unique_counts_monthly`: Total unique counts for events in same category for the last 28 days or the last 4 complete weeks, if events are in the same Redis slot and we have more than one metric.
+
+Example of `redis_hll_counters` data:
+
+```ruby
+{:redis_hll_counters=>
+ {"compliance"=>
+ {"g_compliance_dashboard_weekly"=>0,
+ "g_compliance_dashboard_monthly"=>0,
+ "g_compliance_audit_events_weekly"=>0,
+ "g_compliance_audit_events_monthly"=>0,
+ "compliance_total_unique_counts_weekly"=>0,
+ "compliance_total_unique_counts_monthly"=>0},
+ "analytics"=>
+ {"g_analytics_contribution_weekly"=>0,
+ "g_analytics_contribution_monthly"=>0,
+ "g_analytics_insights_weekly"=>0,
+ "g_analytics_insights_monthly"=>0,
+ "analytics_total_unique_counts_weekly"=>0,
+ "analytics_total_unique_counts_monthly"=>0},
+ "ide_edit"=>
+ {"g_edit_by_web_ide_weekly"=>0,
+ "g_edit_by_web_ide_monthly"=>0,
+ "g_edit_by_sfe_weekly"=>0,
+ "g_edit_by_sfe_monthly"=>0,
+ "ide_edit_total_unique_counts_weekly"=>0,
+ "ide_edit_total_unique_counts_monthly"=>0},
+ "search"=>
+ {"i_search_total_weekly"=>0, "i_search_total_monthly"=>0, "i_search_advanced_weekly"=>0, "i_search_advanced_monthly"=>0, "i_search_paid_weekly"=>0, "i_search_paid_monthly"=>0, "search_total_unique_counts_weekly"=>0, "search_total_unique_counts_monthly"=>0},
+ "source_code"=>{"wiki_action_weekly"=>0, "wiki_action_monthly"=>0}
+ }
+```
+
+Example usage:
+
+```ruby
+# Redis Counters
+redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
+redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
+
+# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
+
+# Tracking events
+Gitlab::UsageDataCounters::HLLRedisCounter.track_event('expand_vulnerabilities', values: visitor_id)
+
+# Get unique events for metric
+redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'expand_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
+```
+
+### Alternative Counters
+
+Handles `StandardError` and fallbacks into -1 this way not all measures fail if we encounter one exception.
+Mainly used for settings and configurations.
+
+Method: `alt_usage_data(value = nil, fallback: -1, &block)`
+
+Arguments:
+
+- `value`: a simple static value in which case the value is simply returned.
+- or a `block`: which is evaluated
+- `fallback: -1`: the common value used for any metrics that are failing.
+
+Usage:
+
+```ruby
+alt_usage_data { Gitlab::VERSION }
+alt_usage_data { Gitlab::CurrentSettings.uuid }
+alt_usage_data(999)
+```
+
+### Adding counters to build new metrics
+
+When adding the results of two counters, use the `add` usage data method that
+handles fallback values and exceptions. It also generates a valid [SQL export](#exporting-usage-ping-sql-queries-and-definitions).
+
+Example usage:
+
+```ruby
+add(User.active, User.bot)
+```
+
+### Prometheus Queries
+
+In those cases where operational metrics should be part of Usage Ping, a database or Redis query is unlikely
+to provide useful data. Instead, Prometheus might be more appropriate, because most GitLab architectural
+components publish metrics to it that can be queried back, aggregated, and included as usage data.
+
+NOTE:
+Prometheus as a data source for Usage Ping is currently only available for single-node Omnibus installations
+that are running the [bundled Prometheus](../../administration/monitoring/prometheus/index.md) instance.
+
+To query Prometheus for metrics, a helper method is available to `yield` a fully configured
+`PrometheusClient`, given it is available as per the note above:
+
+```ruby
+with_prometheus_client do |client|
+ response = client.query('<your query>')
+ ...
+end
+```
+
+Please refer to [the `PrometheusClient` definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/prometheus_client.rb)
+for how to use its API to query for data.
+
+## Developing and testing Usage Ping
+
+### 1. Naming and placing the metrics
+
+Add the metric in one of the top level keys
+
+- `license`: for license related metrics.
+- `settings`: for settings related metrics.
+- `counts_weekly`: for counters that have data for the most recent 7 days.
+- `counts_monthly`: for counters that have data for the most recent 28 days.
+- `counts`: for counters that have data for all time.
+
+### 2. Use your Rails console to manually test counters
+
+```ruby
+# count
+Gitlab::UsageData.count(User.active)
+Gitlab::UsageData.count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
+
+# count distinct
+Gitlab::UsageData.distinct_count(::Project, :creator_id)
+Gitlab::UsageData.distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
+```
+
+### 3. Generate the SQL query
+
+Your Rails console returns the generated SQL queries.
+
+Example:
+
+```ruby
+pry(main)> Gitlab::UsageData.count(User.active)
+ (2.6ms) SELECT "features"."key" FROM "features"
+ (15.3ms) SELECT MIN("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
+ (2.4ms) SELECT MAX("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
+ (1.9ms) SELECT COUNT("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND "users"."id" BETWEEN 1 AND 100000
+```
+
+### 4. Optimize queries with #database-lab
+
+Paste the SQL query into `#database-lab` to see how the query performs at scale.
+
+- `#database-lab` is a Slack channel which uses a production-sized environment to test your queries.
+- GitLab.com’s production database has a 15 second timeout.
+- Any single query must stay below [1 second execution time](../query_performance.md#timing-guidelines-for-queries) with cold caches.
+- Add a specialized index on columns involved to reduce the execution time.
+
+To have an understanding of the query's execution we add in the MR description the following information:
+
+- For counters that have a `time_period` test we add information for both cases:
+ - `time_period = {}` for all time periods
+ - `time_period = { created_at: 28.days.ago..Time.current }` for last 28 days period
+- Execution plan and query time before and after optimization
+- Query generated for the index and time
+- Migration output for up and down execution
+
+We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/). For more details, see the [database review guide](../database_review.md#preparation-when-adding-or-modifying-queries).
+
+#### Optimization recommendations and examples
+
+- Use specialized indexes [example 1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26871), [example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26445).
+- Use defined `start` and `finish`, and simple queries. These values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
+- Avoid joins and write the queries as simply as possible, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36316).
+- Set a custom `batch_size` for `distinct_count`, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38000).
+
+### 5. Add the metric definition
+
+[Check Metrics Dictionary Guide](metrics_dictionary.md)
+
+When adding, updating, or removing metrics, please update the [Metrics Dictionary](dictionary.md).
+
+### 6. Add new metric to Versions Application
+
+Check if new metrics need to be added to the Versions Application. See `usage_data` [schema](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L147) and usage data [parameters accepted](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
+
+### 7. Add the feature label
+
+Add the `feature` label to the Merge Request for new Usage Ping metrics. These are user-facing changes and are part of expanding the Usage Ping feature.
+
+### 8. Add a changelog file
+
+Ensure you comply with the [Changelog entries guide](../changelog.md).
+
+### 9. Ask for a Product Intelligence Review
+
+On GitLab.com, we have DangerBot setup to monitor Product Intelligence related files and DangerBot recommends a [Product Intelligence review](product_intelligence_review.md). Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR for a review.
+
+### 10. Verify your metric
+
+On GitLab.com, the Product Intelligence team regularly monitors Usage Ping. They may alert you that your metrics need further optimization to run quicker and with greater success. You may also use the [Usage Ping QA dashboard](https://app.periscopedata.com/app/gitlab/632033/Usage-Ping-QA) to check how well your metric performs. The dashboard allows filtering by GitLab version, by "Self-managed" & "SaaS" and shows you how many failures have occurred for each metric. Whenever you notice a high failure rate, you may re-optimize your metric.
+
+### Optional: Test Prometheus based Usage Ping
+
+If the data submitted includes metrics [queried from Prometheus](#prometheus-queries) that you would like to inspect and verify,
+then you need to ensure that a Prometheus server is running locally, and that furthermore the respective GitLab components
+are exporting metrics to it. If you do not need to test data coming from Prometheus, no further action
+is necessary. Usage Ping should degrade gracefully in the absence of a running Prometheus server.
+
+There are three kinds of components that may export data to Prometheus, and which are included in Usage Ping:
+
+- [`node_exporter`](https://github.com/prometheus/node_exporter) - Exports node metrics from the host machine
+- [`gitlab-exporter`](https://gitlab.com/gitlab-org/gitlab-exporter) - Exports process metrics from various GitLab components
+- various GitLab services such as Sidekiq and the Rails server that export their own metrics
+
+#### Test with an Omnibus container
+
+This is the recommended approach to test Prometheus based Usage Ping.
+
+The easiest way to verify your changes is to build a new Omnibus image from your code branch by using CI, then download the image
+and run a local container instance:
+
+1. From your merge request, click on the `qa` stage, then trigger the `package-and-qa` job. This job triggers an Omnibus
+build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/-/pipelines).
+1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
+1. Open the job logs and locate the full container name including the version. It takes the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
+1. On your local machine, make sure you are signed in to the GitLab Docker registry. You can find the instructions for this in
+[Authenticate to the GitLab Container Registry](../../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
+1. Once signed in, download the new image by using `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
+1. For more information about working with and running Omnibus GitLab containers in Docker, please refer to [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/README.html) in the Omnibus documentation.
+
+#### Test with GitLab development toolkits
+
+This is the less recommended approach, because it comes with a number of difficulties when emulating a real GitLab deployment.
+
+The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
+like to do so, [Monitoring the GDK with Prometheus](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/prometheus/index.md#monitoring-the-gdk-with-prometheus) is a good start.
+
+The [GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit) has limited support for testing Prometheus based Usage Ping.
+By default, it already comes with a fully configured Prometheus service that is set up to scrape a number of components,
+but with the following limitations:
+
+- It does not run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
+- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it would normally report itself to not be associated
+with any of the other services that are running. That is not how node metrics are reported in a production setup, where `node_exporter`
+always runs as a process alongside other GitLab components on any given node. From Usage Ping's perspective none of the node data would therefore
+appear to be associated to any of the services running, because they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Usage Ping.
+
+## Aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+
+WARNING:
+This feature is intended solely for internal GitLab use.
+
+To add data for aggregated metrics into Usage Ping payload you should add corresponding definition at [`lib/gitlab/usage_data_counters/aggregated_metrics/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/) for metrics available at Community Edition and at [`ee/lib/gitlab/usage_data_counters/aggregated_metrics/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/gitlab/usage_data_counters/aggregated_metrics/) for Enterprise Edition ones.
+
+Each aggregate definition includes following parts:
+
+- `name`: Unique name under which the aggregate metric is added to the Usage Ping payload.
+- `operator`: Operator that defines how the aggregated metric data is counted. Available operators are:
+ - `OR`: Removes duplicates and counts all entries that triggered any of listed events.
+ - `AND`: Removes duplicates and counts all elements that were observed triggering all of following events.
+- `time_frame`: One or more valid time frames. Use these to limit the data included in aggregated metric to events within a specific date-range. Valid time frames are:
+ - `7d`: Last seven days of data.
+ - `28d`: Last twenty eight days of data.
+ - `all`: All historical data, only available for `database` sourced aggregated metrics.
+- `source`: Data source used to collect all events data included in aggregated metric. Valid data sources are:
+ - [`database`](#database-sourced-aggregated-metrics)
+ - [`redis`](#redis-sourced-aggregated-metrics)
+- `events`: list of events names to aggregate into metric. All events in this list must
+ relay on the same data source. Additional data source requirements are described in the
+ [Database sourced aggregated metrics](#database-sourced-aggregated-metrics) and
+ [Redis sourced aggregated metrics](#redis-sourced-aggregated-metrics) sections.
+- `feature_flag`: Name of [development feature flag](../feature_flags/index.md#development-type)
+ that is checked before metrics aggregation is performed. Corresponding feature flag
+ should have `default_enabled` attribute set to `false`. The `feature_flag` attribute
+ is optional and can be omitted. When `feature_flag` is missing, no feature flag is checked.
+
+Example aggregated metric entries:
+
+```yaml
+- name: example_metrics_union
+ operator: OR
+ events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
+ source: redis
+ time_frame:
+ - 7d
+ - 28d
+- name: example_metrics_intersection
+ operator: AND
+ source: database
+ time_frame:
+ - 28d
+ - all
+ events: ['dependency_scanning_pipeline_all_time', 'container_scanning_pipeline_all_time']
+ feature_flag: example_aggregated_metric
+```
+
+Aggregated metrics collected in `7d` and `28d` time frames are added into Usage Ping payload under the `aggregated_metrics` sub-key in the `counts_weekly` and `counts_monthly` top level keys.
+
+```ruby
+{
+ :counts_monthly => {
+ :deployments => 1003,
+ :successful_deployments => 78,
+ :failed_deployments => 275,
+ :packages => 155,
+ :personal_snippets => 2106,
+ :project_snippets => 407,
+ :promoted_issues => 719,
+ :aggregated_metrics => {
+ :example_metrics_union => 7,
+ :example_metrics_intersection => 2
+ },
+ :snippets => 2513
+ }
+}
+```
+
+Aggregated metrics for `all` time frame are present in the `count` top level key, with the `aggregate_` prefix added to their name.
+
+For example:
+
+`example_metrics_intersection`
+
+Becomes:
+
+`counts.aggregate_example_metrics_intersection`
+
+```ruby
+{
+ :counts => {
+ :deployments => 11003,
+ :successful_deployments => 178,
+ :failed_deployments => 1275,
+ :aggregate_example_metrics_intersection => 12
+ }
+}
+```
+
+### Redis sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+
+To declare the aggregate of events collected with [Redis HLL Counters](#redis-hll-counters),
+you must fulfill the following requirements:
+
+1. All events listed at `events` attribute must come from
+ [`known_events/*.yml`](#known-events-are-added-automatically-in-usage-data-payload) files.
+1. All events listed at `events` attribute must have the same `redis_slot` attribute.
+1. All events listed at `events` attribute must have the same `aggregation` attribute.
+1. `time_frame` does not include `all` value, which is unavailable for Redis sourced aggregated metrics.
+
+### Database sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52784) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's enabled on GitLab.com.
+
+To declare an aggregate of metrics based on events collected from database, follow
+these steps:
+
+1. [Persist the metrics for aggregation](#persist-metrics-for-aggregation).
+1. [Add new aggregated metric definition](#add-new-aggregated-metric-definition).
+
+#### Persist metrics for aggregation
+
+Only metrics calculated with [Estimated Batch Counters](#estimated-batch-counters)
+can be persisted for database sourced aggregated metrics. To persist a metric,
+inject a Ruby block into the
+[estimate_batch_distinct_count](#estimate_batch_distinct_count-method) method.
+This block should invoke the
+`Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+[method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb#L21),
+which stores `estimate_batch_distinct_count` results for future use in aggregated metrics.
+
+The `Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+method accepts the following arguments:
+
+- `metric_name`: The name of metric to use for aggregations. Should be the same
+ as the key under which the metric is added into Usage Ping.
+- `recorded_at_timestamp`: The timestamp representing the moment when a given
+ Usage Ping payload was collected. You should use the convenience method `recorded_at`
+ to fill `recorded_at_timestamp` argument, like this: `recorded_at_timestamp: recorded_at`
+- `time_period`: The time period used to build the `relation` argument passed into
+ `estimate_batch_distinct_count`. To collect the metric with all available historical
+ data, set a `nil` value as time period: `time_period: nil`.
+- `data`: HyperLogLog buckets structure representing unique entries in `relation`.
+ The `estimate_batch_distinct_count` method always passes the correct argument
+ into the block, so `data` argument must always have a value equal to block argument,
+ like this: `data: result`
+
+Example metrics persistence:
+
+```ruby
+class UsageData
+ def count_secure_pipelines(time_period)
+ ...
+ relation = ::Security::Scan.latest_successful_by_build.by_scan_types(scan_type).where(security_scans: time_period)
+
+ pipelines_with_secure_jobs['dependency_scanning_pipeline'] = estimate_batch_distinct_count(relation, :commit_id, batch_size: 1000, start: start_id, finish: finish_id) do |result|
+ ::Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll
+ .save_aggregated_metrics(metric_name: 'dependency_scanning_pipeline', recorded_at_timestamp: recorded_at, time_period: time_period, data: result)
+ end
+ end
+end
+```
+
+#### Add new aggregated metric definition
+
+After all metrics are persisted, you can add an aggregated metric definition at
+[`aggregated_metrics/`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/).
+
+To declare the aggregate of metrics collected with [Estimated Batch Counters](#estimated-batch-counters),
+you must fulfill the following requirements:
+
+- Metrics names listed in the `events:` attribute, have to use the same names you passed in the `metric_name` argument while persisting metrics in previous step.
+- Every metric listed in the `events:` attribute, has to be persisted for **every** selected `time_frame:` value.
+
+Example definition:
+
+```yaml
+- name: example_metrics_intersection_database_sourced
+ operator: AND
+ source: database
+ events: ['dependency_scanning_pipeline', 'container_scanning_pipeline']
+ time_frame:
+ - 28d
+ - all
+```
+
+## Example Usage Ping payload
+
+The following is example content of the Usage Ping payload.
+
+```json
+{
+ "uuid": "0000000-0000-0000-0000-000000000000",
+ "hostname": "example.com",
+ "version": "12.10.0-pre",
+ "installation_type": "omnibus-gitlab",
+ "active_user_count": 999,
+ "recorded_at": "2020-04-17T07:43:54.162+00:00",
+ "edition": "EEU",
+ "license_md5": "00000000000000000000000000000000",
+ "license_id": null,
+ "historical_max_users": 999,
+ "licensee": {
+ "Name": "ABC, Inc.",
+ "Email": "email@example.com",
+ "Company": "ABC, Inc."
+ },
+ "license_user_count": 999,
+ "license_starts_at": "2020-01-01",
+ "license_expires_at": "2021-01-01",
+ "license_plan": "ultimate",
+ "license_add_ons": {
+ },
+ "license_trial": false,
+ "counts": {
+ "assignee_lists": 999,
+ "boards": 999,
+ "ci_builds": 999,
+ ...
+ },
+ "container_registry_enabled": true,
+ "dependency_proxy_enabled": false,
+ "gitlab_shared_runners_enabled": true,
+ "gravatar_enabled": true,
+ "influxdb_metrics_enabled": true,
+ "ldap_enabled": false,
+ "mattermost_enabled": false,
+ "omniauth_enabled": true,
+ "prometheus_enabled": false,
+ "prometheus_metrics_enabled": false,
+ "reply_by_email_enabled": "incoming+%{key}@incoming.gitlab.com",
+ "signup_enabled": true,
+ "web_ide_clientside_preview_enabled": true,
+ "ingress_modsecurity_enabled": true,
+ "projects_with_expiration_policy_disabled": 999,
+ "projects_with_expiration_policy_enabled": 999,
+ ...
+ "elasticsearch_enabled": true,
+ "license_trial_ends_on": null,
+ "geo_enabled": false,
+ "git": {
+ "version": {
+ "major": 2,
+ "minor": 26,
+ "patch": 1
+ }
+ },
+ "gitaly": {
+ "version": "12.10.0-rc1-93-g40980d40",
+ "servers": 56,
+ "clusters": 14,
+ "filesystems": [
+ "EXT_2_3_4"
+ ]
+ },
+ "gitlab_pages": {
+ "enabled": true,
+ "version": "1.17.0"
+ },
+ "container_registry_server": {
+ "vendor": "gitlab",
+ "version": "2.9.1-gitlab"
+ },
+ "database": {
+ "adapter": "postgresql",
+ "version": "9.6.15",
+ "pg_system_id": 6842684531675334351
+ },
+ "analytics_unique_visits": {
+ "g_analytics_contribution": 999,
+ ...
+ },
+ "usage_activity_by_stage": {
+ "configure": {
+ "project_clusters_enabled": 999,
+ ...
+ },
+ "create": {
+ "merge_requests": 999,
+ ...
+ },
+ "manage": {
+ "events": 999,
+ ...
+ },
+ "monitor": {
+ "clusters": 999,
+ ...
+ },
+ "package": {
+ "projects_with_packages": 999
+ },
+ "plan": {
+ "issues": 999,
+ ...
+ },
+ "release": {
+ "deployments": 999,
+ ...
+ },
+ "secure": {
+ "user_container_scanning_jobs": 999,
+ ...
+ },
+ "verify": {
+ "ci_builds": 999,
+ ...
+ }
+ },
+ "usage_activity_by_stage_monthly": {
+ "configure": {
+ "project_clusters_enabled": 999,
+ ...
+ },
+ "create": {
+ "merge_requests": 999,
+ ...
+ },
+ "manage": {
+ "events": 999,
+ ...
+ },
+ "monitor": {
+ "clusters": 999,
+ ...
+ },
+ "package": {
+ "projects_with_packages": 999
+ },
+ "plan": {
+ "issues": 999,
+ ...
+ },
+ "release": {
+ "deployments": 999,
+ ...
+ },
+ "secure": {
+ "user_container_scanning_jobs": 999,
+ ...
+ },
+ "verify": {
+ "ci_builds": 999,
+ ...
+ }
+ },
+ "topology": {
+ "duration_s": 0.013836685999194742,
+ "application_requests_per_hour": 4224,
+ "query_apdex_weekly_average": 0.996,
+ "failures": [],
+ "nodes": [
+ {
+ "node_memory_total_bytes": 33269903360,
+ "node_memory_utilization": 0.35,
+ "node_cpus": 16,
+ "node_cpu_utilization": 0.2,
+ "node_uname_info": {
+ "machine": "x86_64",
+ "sysname": "Linux",
+ "release": "4.19.76-linuxkit"
+ },
+ "node_services": [
+ {
+ "name": "web",
+ "process_count": 16,
+ "process_memory_pss": 233349888,
+ "process_memory_rss": 788220927,
+ "process_memory_uss": 195295487,
+ "server": "puma"
+ },
+ {
+ "name": "sidekiq",
+ "process_count": 1,
+ "process_memory_pss": 734080000,
+ "process_memory_rss": 750051328,
+ "process_memory_uss": 731533312
+ },
+ ...
+ ],
+ ...
+ },
+ ...
+ ]
+ }
+}
+```
+
+## Notable changes
+
+In GitLab 13.5, `pg_system_id` was added to send the [PostgreSQL system identifier](https://www.2ndquadrant.com/en/blog/support-for-postgresqls-system-identifier-in-barman/).
+
+## Exporting Usage Ping SQL queries and definitions
+
+Two Rake tasks exist to export Usage Ping definitions.
+
+- The Rake tasks export the raw SQL queries for `count`, `distinct_count`, `sum`.
+- The Rake tasks export the Redis counter class or the line of the Redis block for `redis_usage_data`.
+- The Rake tasks calculate the `alt_usage_data` metrics.
+
+In the home directory of your local GitLab installation run the following Rake tasks for the YAML and JSON versions respectively:
+
+```shell
+# for YAML export
+bin/rake gitlab:usage_data:dump_sql_in_yaml
+
+# for JSON export
+bin/rake gitlab:usage_data:dump_sql_in_json
+
+# You may pipe the output into a file
+bin/rake gitlab:usage_data:dump_sql_in_yaml > ~/Desktop/usage-metrics-2020-09-02.yaml
+```
+
+## Generating and troubleshooting usage ping
+
+To get a usage ping, or to troubleshoot caching issues on your GitLab instance, please follow [instructions to generate usage ping](../../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping).
diff --git a/doc/development/usage_ping/metrics_dictionary.md b/doc/development/usage_ping/metrics_dictionary.md
index 406a223b204..3c08fb0cc87 100644
--- a/doc/development/usage_ping/metrics_dictionary.md
+++ b/doc/development/usage_ping/metrics_dictionary.md
@@ -28,20 +28,22 @@ Each metric is defined in a separate YAML file consisting of a number of fields:
|---------------------|----------|----------------------------------------------------------------|
| `key_path` | yes | JSON key path for the metric, location in Usage Ping payload. |
| `description` | yes | |
-| `value_type` | yes | |
-| `status` | yes | |
-| `product_group` | yes | The [group](https://about.gitlab.com/handbook/product/categories/#devops-stages) that owns the metric. |
-| `time_frame` | yes | `string`; may be set to a value like "7d" |
-| `data_source` | yes | `string`: may be set to a value like `database` or `redis_hll`. |
-| `distribution` | yes | The [distribution](https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/#definitions) where the metric applies. |
-| `tier` | yes | The [tier]( https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/) where the metric applies. |
-| `product_category` | no | The [product category](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml) for the metric. |
+| `product_section` | yes | The [section](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/data/sections.yml). |
| `product_stage` | no | The [stage](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) for the metric. |
+| `product_group` | yes | The [group](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) that owns the metric. |
+| `product_category` | no | The [product category](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml) for the metric. |
+| `value_type` | yes | `string`; one of `string`, `number`, `boolean`, `object`. |
+| `status` | yes | `string`; status of the metric, may be set to `data_available`, `planned`, `in_progress`, `implemented`, `not_used`, `deprecated` |
+| `time_frame` | yes | `string`; may be set to a value like `7d`, `28d`, `all`, `none`. |
+| `data_source` | yes | `string`; may be set to a value like `database`, `redis`, `redis_hll`, `prometheus`, `ruby`. |
+| `distribution` | yes | `array`; may be set to one of `ce, ee` or `ee`. The [distribution](https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/#definitions) where the tracked feature is available. |
+| `tier` | yes | `array`; may be set to one of `free, premium, ultimate`, `premium, ultimate` or `ultimate`. The [tier]( https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/) where the tracked feature is available. |
| `milestone` | no | The milestone when the metric is introduced. |
| `milestone_removed` | no | The milestone when the metric is removed. |
| `introduced_by_url` | no | The URL to the Merge Request that introduced the metric. |
+| `skip_validation` | no | This should **not** be set. [Used for imported metrics until we review, update and make them valid](https://gitlab.com/groups/gitlab-org/-/epics/5425). |
-### Example metric definition
+### Example YAML metric definition
The linked [`uuid`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/uuid.yml)
YAML file includes an example metric definition, where the `uuid` metric is the GitLab
@@ -50,18 +52,19 @@ instance unique identifier.
```yaml
key_path: uuid
description: GitLab instance unique identifier
-value_type: string
product_category: collection
+product_section: growth
product_stage: growth
+product_group: group::product intelligence
+value_type: string
status: data_available
milestone: 9.1
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521
-product_group: group::product intelligence
time_frame: none
data_source: database
distribution:
-- ee
- ce
+- ee
tier:
- free
- premium
@@ -91,3 +94,9 @@ To create a metric definition used in EE, add the `--ee` flag.
bundle exec rails generate gitlab:usage_metric_definition counts.issues --ee --dir=7d
create ee/config/metrics/counts_7d/issues.yml
```
+
+## Metrics added dynamic to Usage Ping payload
+
+The [Redis HLL metrics](index.md#known-events-are-added-automatically-in-usage-data-payload) are added automatically to Usage Ping payload.
+
+A YAML metric definition is required for each metric.
diff --git a/doc/development/usage_ping/product_intelligence_review.md b/doc/development/usage_ping/product_intelligence_review.md
new file mode 100644
index 00000000000..c667bc8354c
--- /dev/null
+++ b/doc/development/usage_ping/product_intelligence_review.md
@@ -0,0 +1,80 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Product Intelligence review guidelines
+
+This page includes introductory material for a
+[Product Intelligence](https://about.gitlab.com/handbook/engineering/development/growth/product-intelligence/)
+review, and is specific to Product Intelligence reviews. For broader advice and
+general best practices for code reviews, refer to our [code review guide](../code_review.md).
+
+## Resources for Product Intelligence reviewers
+
+- [Usage Ping Guide](index.md)
+- [Snowplow Guide](../snowplow.md)
+- [Metrics Dictionary](metrics_dictionary.md)
+
+## Review process
+
+We recommend a Product Intelligence review when an application update touches
+Product Intelligence files.
+
+- Changes that touch `usage_data*` files.
+- Changes to the Metrics Dictionary including files in:
+ - [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics).
+ - [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics).
+ - [`dictionary.md`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md).
+ - [`schema.json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json).
+- Changes to `tracking` files.
+- Changes to Product Intelligence tooling. For example,
+ [`Gitlab::UsageMetricDefinitionGenerator`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb)
+
+### Roles and process
+
+The merge request **author** should:
+
+- Decide whether a Product Intelligence review is needed.
+- If a Product Intelligence review is needed, add the labels
+ `~product intelligence` and `~product intelligence::review pending`.
+- Assign an
+ [engineer](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) from the Product Intelligence team for a review.
+- Set the correct attributes in YAML metrics:
+ - `product_section`, `product_stage`, `product_group`, `product_category`
+ - Provide a clear description of the metric.
+- Update the
+ [Metrics Dictionary](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md) if it is needed.
+- Add a changelog [according to guidelines](../changelog.md).
+
+The Product Intelligence **reviewer** should:
+
+- Perform a first-pass review on the merge request and suggest improvements to the author.
+- Approve the MR, and relabel the MR with `~"product intelligence::approved"`.
+
+## Review workload distribution
+
+[Danger bot](../dangerbot.md) adds the list of Product Intelligence changed files
+and pings the
+[`@gitlab-org/growth/product-intelligence/engineers`](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) group for merge requests
+that are not drafts.
+
+Any of the Product Intelligence engineers can be assigned for the Product Intelligence review.
+
+### How to review for Product Intelligence
+
+- Check the [metrics location](index.md#1-naming-and-placing-the-metrics) in
+ the Usage Ping JSON payload.
+- Add `~database` label and ask for [database review](../database_review.md) for
+ metrics that are based on Database.
+- For tracking using Redis HLL (HyperLogLog):
+ - Check the Redis slot.
+ - Check if a [feature flag is needed](index.md#recommendations).
+- Metrics YAML definitions:
+ - Check the metric `description`.
+ - Check the metrics `key_path`.
+ - Check the `product_section`, `product_stage`, `product_group`, `product_category`.
+ Read the [stages file](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml).
+ - Check the file location. Consider the time frame, and if the file should be under `ee`.
+ - Check the tiers.
diff --git a/doc/development/value_stream_analytics.md b/doc/development/value_stream_analytics.md
index b3692bd1d2c..6b2442f1c32 100644
--- a/doc/development/value_stream_analytics.md
+++ b/doc/development/value_stream_analytics.md
@@ -90,7 +90,7 @@ Some start/end event pairs are not "compatible" with each other. For example:
- "Issue closed" to "Issue closed": Duration is always 0.
The `StageEvents` module describes the allowed `start_event` and `end_event` pairings (`PAIRING_RULES` constant). If a new event is added, it needs to be registered in this module.
-​To add a new event:​
+To add a new event:
1. Add an entry in `ENUM_MAPPING` with a unique number, which is used in the `Stage` model as `enum`.
1. Define which events are compatible with the event in the `PAIRING_RULES` hash.
@@ -190,9 +190,9 @@ Currently supported parents:
### Default stages
The [original implementation](https://gitlab.com/gitlab-org/gitlab/-/issues/847) of value stream analytics defined 7 stages. These stages are always available for each parent, however altering these stages is not possible.
-​
+
To make things efficient and reduce the number of records created, the default stages are expressed as in-memory objects (not persisted). When the user creates a custom stage for the first time, all the stages are persisted. This behavior is implemented in the value stream analytics service objects.
-​
+
The reason for this was that we'd like to add the abilities to hide and order stages later on.
## Data Collector
diff --git a/doc/development/wikis.md b/doc/development/wikis.md
index 7995afb1e17..f47c87137ae 100644
--- a/doc/development/wikis.md
+++ b/doc/development/wikis.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
description: "GitLab's development guidelines for Wikis"
---
-# Wikis development guide
+# Wikis development guide **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227027) in GitLab 13.5.
diff --git a/doc/gitlab-basics/create-branch.md b/doc/gitlab-basics/create-branch.md
index 9f4f46e5bd3..8135c16bc1e 100644
--- a/doc/gitlab-basics/create-branch.md
+++ b/doc/gitlab-basics/create-branch.md
@@ -13,7 +13,7 @@ When you create a new branch (in your [terminal](start-using-git.md#create-a-bra
[the web interface](../user/project/repository/web_editor.md#create-a-new-branch)),
you are creating a snapshot of a certain branch, usually the main `master` branch,
at its current state. From there, you can start to make your own changes without
-affecting the main codebase. The history of your changes will be tracked in your branch.
+affecting the main codebase. The history of your changes is tracked in your branch.
When your changes are ready, you then merge them into the rest of the codebase with a
[merge request](../user/project/merge_requests/creating_merge_requests.md).
diff --git a/doc/gitlab-basics/feature_branch_workflow.md b/doc/gitlab-basics/feature_branch_workflow.md
index 682bc1aec0b..99d346f2b01 100644
--- a/doc/gitlab-basics/feature_branch_workflow.md
+++ b/doc/gitlab-basics/feature_branch_workflow.md
@@ -35,4 +35,4 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/workflow.html'
1. Create a merge request.
-1. Your team lead will review the code &amp; merge it to the main branch.
+1. Your team lead reviews the code and merges it to the main branch.
diff --git a/doc/gitlab-basics/index.md b/doc/gitlab-basics/index.md
index 8052fd27bb3..774931aad72 100644
--- a/doc/gitlab-basics/index.md
+++ b/doc/gitlab-basics/index.md
@@ -9,7 +9,7 @@ type: index
# GitLab basics guides **(FREE)**
This section provides resources to help you start working with GitLab and Git by focusing
-on the basic features that you will need to use.
+on the basic features that you must use.
This documentation is split into the following groups:
@@ -23,7 +23,7 @@ The following are guides to basic GitLab functionality:
- [Create and add your SSH public key](../ssh/README.md), for enabling Git over SSH.
- [Create a project](../user/project/working_with_projects.md#create-a-project), to start using GitLab.
-- [Create a group](../user/group/index.md#create-a-new-group), to combine and administer
+- [Create a group](../user/group/index.md#create-a-group), to combine and administer
projects together.
- [Create a branch](create-branch.md), to make changes to files stored in a project's repository.
- [Feature branch workflow](feature_branch_workflow.md).
@@ -41,7 +41,7 @@ The following are guides to basic GitLab functionality:
If you're familiar with Git on the command line, you can interact with your GitLab
projects just as you would with any other Git repository.
-These resources will help you get further acclimated to working on the command line.
+These resources can help you get further acclimated to working on the command line.
- [Start using Git on the command line](start-using-git.md), for some simple Git commands.
- [Command line basics](command-line-commands.md), to create and edit files using the command line.
diff --git a/doc/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md
index a2d286379d2..3c824cb5286 100644
--- a/doc/gitlab-basics/start-using-git.md
+++ b/doc/gitlab-basics/start-using-git.md
@@ -17,10 +17,10 @@ directly in the browser, you’ll eventually need to use Git through the command
tasks.
For example, if you need to fix complex merge conflicts, rebase branches,
-merge manually, or undo and roll back commits, you'll need to use Git from
+merge manually, or undo and roll back commits, you musto use Git from
the command line and then push your changes to the remote server.
-This guide will help you get started with Git through the command line and can be your reference
+This guide helps you get started with Git through the command line and can be your reference
for Git commands in the future. If you're only looking for a quick reference of Git commands, you
can download the GitLab [Git Cheat Sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf).
@@ -39,12 +39,12 @@ You don't need a GitLab account to use Git locally, but for the purpose of this
recommend registering and signing into your account before starting. Some commands need a
connection between the files in your computer and their version on a remote server.
-You'll also need to open a [command shell](#command-shell) and have
+You must also open a [command shell](#command-shell) and have
[Git installed](#install-git) in your computer.
### Command shell
-To execute Git commands in your computer, you'll need to open a command shell (also known as command
+To execute Git commands in your computer, you must open a command shell (also known as command
prompt, terminal, and command line) of your preference. Here are some suggestions:
- For macOS users:
@@ -66,18 +66,18 @@ computer:
git --version
```
-If you have Git installed, the output will be:
+If you have Git installed, the output is:
```shell
git version X.Y.Z
```
-If your computer doesn't recognize `git` as a command, you'll need to [install Git](../topics/git/how_to_install_git/index.md).
+If your computer doesn't recognize `git` as a command, you must [install Git](../topics/git/how_to_install_git/index.md).
After that, run `git --version` again to verify whether it was correctly installed.
## Configure Git
-To start using Git from your computer, you'll need to enter your credentials (user name and email)
+To start using Git from your computer, you must enter your credentials (user name and email)
to identify you as the author of your work. The user name and email should match the ones you're
using on GitLab.
@@ -100,7 +100,7 @@ git config --global --list
```
The `--global` option tells Git to always use this information for anything you do on your system.
-If you omit `--global` or use `--local`, the configuration will be applied only to the current
+If you omit `--global` or use `--local`, the configuration is applied only to the current
repository.
You can read more on how Git manages configurations in the
@@ -113,7 +113,7 @@ You have two options:
- Authenticate on a project-by-project basis through HTTPS, and enter your credentials every time
you perform an operation between your computer and GitLab.
-- Authenticate through SSH once and GitLab won't ask your credentials every time you pull, push,
+- Authenticate through SSH once and GitLab no longer requests your credentials every time you pull, push,
and clone.
To start the authentication process, we'll [clone](#clone-a-repository) an existing repository
@@ -121,8 +121,8 @@ to our computer:
- If you want to use **SSH** to authenticate, follow the instructions on the [SSH documentation](../ssh/README.md)
to set it up before cloning.
-- If you want to use **HTTPS**, GitLab will request your user name and password:
- - If you have 2FA enabled for your account, you'll have to use a [Personal Access Token](../user/profile/personal_access_tokens.md)
+- If you want to use **HTTPS**, GitLab requests your user name and password:
+ - If you have 2FA enabled for your account, you must use a [Personal Access Token](../user/profile/personal_access_tokens.md)
with **read_repository** or **write_repository** permissions instead of your account's password.
Create one before cloning.
- If you don't have 2FA enabled, use your account's password.
@@ -158,14 +158,15 @@ A **project** in GitLab is what holds a repository, which holds your files.
Often, the word "repository" is shortened to "repo".
<!-- vale gitlab.Spelling = YES -->
<!-- vale gitlab.SubstitutionWarning = YES -->
+
### Fork
When you want to copy someone else's repository, you [**fork**](../user/project/repository/forking_workflow.md#creating-a-fork)
-the project. By forking it, you'll create a copy of the project into your own
+the project. By forking it, you create a copy of the project into your own
namespace to have read and write permissions to modify the project files
and settings.
-For example, if you fork this project, <https://gitlab.com/gitlab-tests/sample-project/> into your namespace, you'll create your own copy of the repository in your namespace (`https://gitlab.com/your-namespace/sample-project/`). From there, you can clone it into your computer,
+For example, if you fork this project, <https://gitlab.com/gitlab-tests/sample-project/> into your namespace, you create your own copy of the repository in your namespace (`https://gitlab.com/your-namespace/sample-project/`). From there, you can clone it into your computer,
work on its files, and (optionally) submit proposed changes back to the
original repository if you'd like.
@@ -175,7 +176,7 @@ To create a copy of a remote repository's files on your computer, you can either
**download** or **clone**. If you download, you cannot sync it with the
remote repository on GitLab.
-Cloning a repository is the same as downloading, except it preserves the Git connection
+[Cloning](#clone-a-repository) a repository is the same as downloading, except it preserves the Git connection
with the remote repository. This allows you to modify the files locally and
upload the changes to the remote repository on GitLab.
@@ -185,19 +186,19 @@ After you saved a local copy of a repository and modified its files on your comp
changes to GitLab. This is referred to as **pushing** to GitLab, as this is achieved by the command
[`git push`](#send-changes-to-gitlabcom).
-When the remote repository changes, your local copy will be behind it. You can update it with the new
+When the remote repository changes, your local copy is behind it. You can update it with the new
changes in the remote repository.
This is referred to as **pulling** from GitLab, as this is achieved by the command
[`git pull`](#download-the-latest-changes-in-the-project).
## Basic Git commands
-For the purposes of this guide, we will use this example project on GitLab.com:
+For the purposes of this guide, we use this example project on GitLab.com:
[https://gitlab.com/gitlab-tests/sample-project/](https://gitlab.com/gitlab-tests/sample-project/).
To use it, log into GitLab.com and fork the example project into your
namespace to have your own copy to playing with. Your sample
-project will be available under `https://gitlab.com/<your-namespace>/sample-project/`.
+project is available under `https://gitlab.com/<your-namespace>/sample-project/`.
You can also choose any other project to follow this guide. Then, replace the
example URLs with your own project's.
@@ -210,11 +211,13 @@ to GitLab, see how to [convert a local folder into a Git repository](#convert-a-
### Clone a repository
To start working locally on an existing remote repository, clone it with the
-command `git clone <repository path>`. You can either clone it via [HTTPS](#clone-via-https) or [SSH](#clone-via-ssh), according to your preferred [authentication method](#git-authentication-methods).
+command `git clone <repository path>`. You can either clone it via [HTTPS](#clone-via-https)
+or [SSH](#clone-via-ssh), according to your preferred [authentication method](#git-authentication-methods).
You can find both paths (HTTPS and SSH) by navigating to your project's landing page
-and clicking **Clone**. GitLab will prompt you with both paths, from which you can copy
-and paste in your command line.
+and clicking **Clone**. GitLab prompts you with both paths, from which you can copy
+and paste in your command line. You can also
+[clone and open directly in Visual Studio Code](../user/project/repository/index.md#clone-and-open-in-apple-xcode).
For example, considering our [sample project](https://gitlab.com/gitlab-tests/sample-project/):
@@ -224,7 +227,7 @@ For example, considering our [sample project](https://gitlab.com/gitlab-tests/sa
To get started, open a terminal window in the directory you wish to add the
repository files into, and run one of the `git clone` commands as described below.
-Both commands will download a copy of the files in a folder named after the project's
+Both commands download a copy of the files in a folder named after the project's
name and preserve the connection with the remote repository.
You can then navigate to the new directory with `cd sample-project` and start working on it
locally.
@@ -253,8 +256,8 @@ git clone git@gitlab.com:gitlab-org/gitlab.git
### Convert a local directory into a repository
When you have your files in a local folder and want to convert it into
-a repository, you'll need to _initialize_ the folder through the `git init`
-command. This will instruct Git to begin to track that directory as a
+a repository, you must _initialize_ the folder through the `git init`
+command. This instructs Git to begin to track that directory as a
repository. To do so, open the terminal on the directory you'd like to convert
and run:
@@ -271,9 +274,9 @@ so that Git can upload your files into the correct project.
#### Add a remote repository
-By "adding a remote repository" to your local directory you'll tell Git that
+By "adding a remote repository" to your local directory you tell Git that
the path to that specific project in GitLab corresponds to that specific
-folder you have in your computer. This way, your local folder will be
+folder you have in your computer. This way, your local folder is
identified by Git as the local content for that specific remote project.
To add a remote repository to your local copy:
@@ -320,7 +323,7 @@ The `-v` flag stands for verbose.
## Branching
-If you want to add code to a project but you're not sure if it will work properly, or you're
+If you want to add code to a project but you're not sure if it works properly, or you're
collaborating on the project with others, and don't want your work to get mixed up, it's a good idea
to work on a different **branch**.
@@ -384,7 +387,7 @@ git diff
### Add and commit local changes
-You'll see any local changes in red when you type `git status`. These changes may
+Local changes are shown in red when you type `git status`. These changes may
be new, modified, or deleted files/folders. Use `git add` to first stage (prepare)
a local file/folder for committing. Then use `git commit` to commit (save) the staged
files:
@@ -420,8 +423,8 @@ For example, to push your local commits to the _`master`_ branch of the _`origin
git push origin master
```
-On certain occasions, Git won't allow you to push to your repository, and then
-you'll need to [force an update](../topics/git/git_rebase.md#force-push).
+On certain occasions, Git disallows pushes to your repository, and then
+you must [force an update](../topics/git/git_rebase.md#force-push).
NOTE:
To create a merge request from a fork to an upstream repository, see the
diff --git a/doc/install/aws/index.md b/doc/install/aws/index.md
index 8fa1883da59..b18a537bf8b 100644
--- a/doc/install/aws/index.md
+++ b/doc/install/aws/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Installing GitLab on Amazon Web Services (AWS)
+# Installing GitLab on Amazon Web Services (AWS) **(FREE SELF)**
This page offers a walkthrough of a common configuration
for GitLab on AWS using the official GitLab Linux package. You should customize it to accommodate your needs.
@@ -449,9 +449,8 @@ We will need a preconfigured, custom GitLab AMI to use in our launch configurati
From the EC2 dashboard:
-1. Click **Launch Instance** and select **Community AMIs** from the left menu.
-1. In the search bar, search for `GitLab EE <version>` where `<version>` is the latest version as seen on the [releases page](https://about.gitlab.com/releases/). Select the latest patch release, for example `GitLab EE 12.9.2`.
-1. Select an instance type based on your workload. Consult the [hardware requirements](../../install/requirements.md#hardware-requirements) to choose one that fits your needs (at least `c5.xlarge`, which is sufficient to accommodate 100 users).
+1. Use the section below titled "[Find official GitLab-created AMI IDs on AWS](#find-official-gitlab-created-ami-ids-on-aws)" to find the correct AMI to launch.
+1. After clicking **Launch** on the desired AMI, select an instance type based on your workload. Consult the [hardware requirements](../../install/requirements.md#hardware-requirements) to choose one that fits your needs (at least `c5.xlarge`, which is sufficient to accommodate 100 users).
1. Click **Configure Instance Details**:
1. In the **Network** dropdown, select `gitlab-vpc`, the VPC we created earlier.
1. In the **Subnet** dropdown, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier.
@@ -585,9 +584,9 @@ Let's create an EC2 instance where we'll install Gitaly:
1. Finally, acknowledge that you have access to the selected private key file or create a new one. Click **Launch Instances**.
NOTE:
-Instead of storing configuration _and_ repository data on the root volume, you can also choose to add an additional EBS volume for repository storage. Follow the same guidance as above. See the [Amazon EBS pricing](https://aws.amazon.com/ebs/pricing/). We do not recommend using EFS as it may negatively impact the performance of GitLab. You can review the [relevant documentation](../../administration/nfs.md#avoid-using-awss-elastic-file-system-efs) for more details.
+Instead of storing configuration _and_ repository data on the root volume, you can also choose to add an additional EBS volume for repository storage. Follow the same guidance as above. See the [Amazon EBS pricing](https://aws.amazon.com/ebs/pricing/). We do not recommend using EFS as it may negatively impact the performance of GitLab. You can review the [relevant documentation](../../administration/nfs.md#avoid-using-cloud-based-file-systems) for more details.
-Now that we have our EC2 instance ready, follow the [documentation to install GitLab and set up Gitaly on its own server](../../administration/gitaly/index.md#run-gitaly-on-its-own-server). Perform the client setup steps from that document on the [GitLab instance we created](#install-gitlab) above.
+Now that we have our EC2 instance ready, follow the [documentation to install GitLab and set up Gitaly on its own server](../../administration/gitaly/configure_gitaly.md#run-gitaly-on-its-own-server). Perform the client setup steps from that document on the [GitLab instance we created](#install-gitlab) above.
#### Add Support for Proxied SSL
@@ -789,6 +788,24 @@ For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
After a few minutes, the new version should be up and running.
+## Find official GitLab-created AMI IDs on AWS
+
+To find the AMIs generated by GitLab:
+
+1. Login to AWS Web Console, so that clicking the links below will take you directly to the AMI list.
+1. Pick the edition you want:
+
+ - [GitLab Enterprise Edition](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;ownerAlias=782774275127;search=GitLab%20EE;sort=desc:name): If you want to unlock the enterprise features, a license is needed. Recommended for this guide.
+ - [GitLab Community Edition](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;ownerAlias=782774275127;search=GitLab%20CE;sort=desc:name): The open source version of GitLab.
+ - [GitLab Premium or Ultimate Marketplace (Prelicensed)](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;source=Marketplace;search=GitLab%20EE;sort=desc:name): 5 user license built into per-minute billing.
+1. AMI IDs are unique per region, so once you've loaded one of the above, select the desired target region in the upper right of the console to see the appropriate AMIs.
+1. Once the console is loaded, you can add additional search criteria to narrow further. For instance, `13.` to find only 13.x versions.
+1. To launch an EC2 Machine with one of the listed AMIs, check the box at the start of the relevant row, and select the "Launch" button near the top of left of the page.
+
+NOTE:
+If you are trying to restore from an older version of GitLab while moving to AWS, find the
+[Enterprise and Community Editions Before 11.10.3](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;ownerAlias=855262394183;sort=desc:name).
+
## Conclusion
In this guide, we went mostly through scaling and some redundancy options,
diff --git a/doc/install/azure/index.md b/doc/install/azure/index.md
index 15906bc056f..0c0a4457413 100644
--- a/doc/install/azure/index.md
+++ b/doc/install/azure/index.md
@@ -6,7 +6,7 @@ description: 'Learn how to spin up a pre-configured GitLab VM on Microsoft Azure
type: howto
---
-# Install GitLab on Microsoft Azure
+# Install GitLab on Microsoft Azure **(FREE SELF)**
WARNING:
This guide is deprecated and pending an update. For the time being, use the GitLab
@@ -351,7 +351,7 @@ Remember to sign in with the username and password you specified when you
[created your Azure VM](#basics).
If you need to reset your VM password, read
-[how to reset SSH credentials for a user on an Azure VM](https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshoot-ssh-connection).
+[how to reset SSH credentials for a user on an Azure VM](https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection).
#### SSH from the command-line
@@ -433,7 +433,7 @@ Check out our other [Technical Articles](../../topics/index.md) or browse the [G
- [Azure - Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/)
- [Azure Portal](https://portal.azure.com)
- [Azure - Pricing Calculator](https://azure.microsoft.com/en-us/pricing/calculator/)
- - [Azure - Troubleshoot SSH Connections to an Azure Linux VM](https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshoot-ssh-connection)
+ - [Azure - Troubleshoot SSH Connections to an Azure Linux VM](https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)
- [Azure - Properly Shutdown an Azure VM](https://build5nines.com/properly-shutdown-azure-vm-to-save-money/)
- [SSH](https://en.wikipedia.org/wiki/Secure_Shell), [PuTTY](https://www.putty.org) and [Using SSH in PuTTY](https://mediatemple.net/community/products/dv/204404604/using-ssh-in-putty-)
diff --git a/doc/install/digitaloceandocker.md b/doc/install/digitaloceandocker.md
index edd081c66c1..845fc3f04e8 100644
--- a/doc/install/digitaloceandocker.md
+++ b/doc/install/digitaloceandocker.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Digital Ocean and Docker Machine test environment
+# Digital Ocean and Docker Machine test environment **(FREE SELF)**
This guide is for quickly testing different versions of GitLab and not
recommended for ease of future upgrades or keeping the data you create.
diff --git a/doc/install/docker.md b/doc/install/docker.md
index 0cc73c2d64e..064c93776a8 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index
---
-# Install GitLab with Docker
+# Install GitLab with Docker **(FREE SELF)**
[Docker](https://www.docker.com) and container technology have been revolutionizing the software world for the past few years. They combine the performance and efficiency of native execution with the abstraction, security, and immutability of virtualization.
diff --git a/doc/install/google_cloud_platform/index.md b/doc/install/google_cloud_platform/index.md
index 7f38970a2b1..766788da061 100644
--- a/doc/install/google_cloud_platform/index.md
+++ b/doc/install/google_cloud_platform/index.md
@@ -6,7 +6,7 @@ description: 'Learn how to install a GitLab instance on Google Cloud Platform.'
type: howto
---
-# Installing GitLab on Google Cloud Platform
+# Installing GitLab on Google Cloud Platform **(FREE SELF)**
This guide will help you install GitLab on a [Google Cloud Platform (GCP)](https://cloud.google.com/) using the official GitLab Linux package. You should customize it to accommodate your needs.
diff --git a/doc/install/index.md b/doc/install/index.md
index 948365ce548..1e6f0bb95c2 100644
--- a/doc/install/index.md
+++ b/doc/install/index.md
@@ -9,110 +9,49 @@ type: index
# Installation **(FREE SELF)**
-GitLab can be installed in most GNU/Linux distributions and with several
+GitLab can be installed in most GNU/Linux distributions, and with several
cloud providers. To get the best experience from GitLab, you must balance
performance, reliability, ease of administration (backups, upgrades, and
troubleshooting), and the cost of hosting.
-Depending on your platform, select from the following available methods to
-install GitLab:
-
-- [_Omnibus GitLab_](#installing-gitlab-on-linux-using-the-omnibus-gitlab-package-recommended):
- The official deb/rpm packages that contain a bundle of GitLab and the
- components it depends on, including PostgreSQL, Redis, and Sidekiq.
-- [_GitLab Helm chart_](#installing-gitlab-on-kubernetes-via-the-gitlab-helm-charts):
- The cloud native Helm chart for installing GitLab and all of its components
- on Kubernetes.
-- [_Docker_](#installing-gitlab-with-docker): The Omnibus GitLab packages,
- Dockerized.
-- [_Source_](#installing-gitlab-from-source): Install GitLab and all of its
- components from scratch.
-- [_Cloud provider_](#installing-gitlab-on-cloud-providers): Install directly
- from platforms like AWS, Azure, and GCP.
-
-If you're not sure which installation method to use, we recommend you use
-Omnibus GitLab. The Omnibus GitLab packages are mature,
-[scalable](../administration/reference_architectures/index.md), and are used
-today on GitLab.com. The Helm charts are recommended for those who are familiar
-with Kubernetes.
-
## Requirements
Before you install GitLab, be sure to review the [system requirements](requirements.md).
The system requirements include details about the minimum hardware, software,
database, and additional requirements to support GitLab.
-## Installing GitLab on Linux using the Omnibus GitLab package (recommended)
-
-The Omnibus GitLab package uses our official deb/rpm repositories, and is
-recommended for most users.
-
-If you need additional scale or resilience, we recommend deploying
-GitLab as described in our [reference architecture documentation](../administration/reference_architectures/index.md).
-
-[**> Install GitLab using the Omnibus GitLab package.**](https://about.gitlab.com/install/)
-
-### GitLab Environment Toolkit (alpha)
-
-The [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) provides a set of automation tools to easily deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers.
-
-It is currently in alpha, and is not recommended for production use.
-
-[**> Install a GitLab reference architecture using the GitLab Environment Toolkit.**](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit#documentation)
+## Choose the installation method
-## Installing GitLab on Kubernetes via the GitLab Helm charts
-
-When installing GitLab on Kubernetes, there are some trade-offs that you
-need to be aware of:
-
-- Administration and troubleshooting requires Kubernetes knowledge.
-- It can be more expensive for smaller installations. The default installation
- requires more resources than a single node Omnibus deployment, as most services
- are deployed in a redundant fashion.
-- There are some feature [limitations to be aware of](https://docs.gitlab.com/charts/#limitations).
-
-Due to these trade-offs, having Kubernetes experience is a requirement for
-using this method. We recommend being familiar with Kubernetes before using it
-to deploy GitLab in production. The methods for management, observability, and
-some concepts are different than traditional deployments.
-
-[**> Install GitLab on Kubernetes using the GitLab Helm charts.**](https://docs.gitlab.com/charts/)
-
-## Installing GitLab with Docker
-
-GitLab maintains a set of official Docker images based on the Omnibus GitLab
-package.
-
-[**> Install GitLab using the official GitLab Docker images.**](docker.md)
-
-## Installing GitLab from source
-
-If the Omnibus GitLab package isn't available for your distribution, you can
-install GitLab from source. This can be useful with unsupported systems, like
-\*BSD. For an overview of the directory structure, see the
-[structure documentation](installation.md#gitlab-directory-structure).
+Depending on your platform, select from the following available methods to
+install GitLab:
-[**> Install GitLab from source.**](installation.md)
+| Installation method | Description | When to choose |
+|----------------------------------------------------------------|-------------|----------------|
+| [Linux package](https://docs.gitlab.com/omnibus/installation/) | The official deb/rpm packages (also known as Omnibus GitLab) that contains a bundle of GitLab and the components it depends on, including PostgreSQL, Redis, and Sidekiq. | This is the recommended method for getting started. The Linux packages are mature, scalable, and are used today on GitLab.com. If you need additional flexibility and resilience, we recommend deploying GitLab as described in the [reference architecture documentation](../administration/reference_architectures/index.md). |
+| [Helm charts](https://docs.gitlab.com/charts/) | The cloud native Helm chart for installing GitLab and all of its components on Kubernetes. | When installing GitLab on Kubernetes, there are some trade-offs that you need to be aware of: <br/>- Administration and troubleshooting requires Kubernetes knowledge.<br/>- It can be more expensive for smaller installations. The default installation requires more resources than a single node Linux package deployment, as most services are deployed in a redundant fashion.<br/>- There are some feature [limitations to be aware of](https://docs.gitlab.com/charts/#limitations).<br/><br/> Use this method if your infrastructure is built on Kubernetes and you're familiar with how it works. The methods for management, observability, and some concepts are different than traditional deployments. |
+| [Docker](https://docs.gitlab.com/omnibus/docker/) | The GitLab packages, Dockerized. | Use this method if you're familiar with Docker. |
+| [Source](installation.md) | Install GitLab and all of its components from scratch. | Use this method if none of the previous methods are available for your platform. Useful for unsupported systems like \*BSD.|
+| [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit#documentation) | The GitLab Environment toolkit provides a set of automation tools to deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers. | Since GET is in beta and not yet recommended for production use, use this method if you want to test deploying GitLab in scalable environment. |
-## Installing GitLab on cloud providers
+## Install GitLab on cloud providers
-GitLab can be installed on a variety of cloud providers by using any of
-the above methods, provided the cloud provider supports it.
+Regardless of the installation method, you can install GitLab on several cloud
+providers, assuming the cloud provider supports it. Here are several possible installation
+methods, the majority which use the Linux packages:
-- [Install on AWS](aws/index.md): Install Omnibus GitLab on AWS using the community AMIs that GitLab provides.
-- [Install GitLab on Google Cloud Platform](google_cloud_platform/index.md): Install Omnibus GitLab on a VM in GCP.
-- [Install GitLab on Azure](azure/index.md): Install Omnibus GitLab from Azure Marketplace.
-- [Install GitLab on OpenShift](https://docs.gitlab.com/charts/installation/cloud/openshift.html): Install GitLab on OpenShift by using the GitLab Helm charts.
-- [Install GitLab on DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-gitlab-on-ubuntu-18-04): Install Omnibus GitLab on DigitalOcean.
-- _Testing only!_ [DigitalOcean and Docker Machine](digitaloceandocker.md):
- Quickly test any version of GitLab on DigitalOcean using Docker Machine.
+| Cloud provider | Description |
+|---------------------------------------------------------------|-------------|
+| [AWS (HA)](aws/index.md) | Install GitLab on AWS using the community AMIs provided by GitLab. |
+| [Google Cloud Platform (GCP)](google_cloud_platform/index.md) | Install GitLab on a VM in GCP. |
+| [Azure](azure/index.md) | Install GitLab from Azure Marketplace. |
+| [DigitalOcean](https://about.gitlab.com/blog/2016/04/27/getting-started-with-gitlab-and-digitalocean/) | Install GitLab on DigitalOcean. You can also [test GitLab on DigitalOcean using Docker Machine](digitaloceandocker.md). |
## Next steps
Here are a few resources you might want to check out after completing the
installation:
-- [Upload a license](../user/admin_area/license.md) or [start a free trial](https://about.gitlab.com/free-trial/):
+- [Upload a license](../user/admin_area/license.md) or [start a free trial](https://about.gitlab.com/free-trial/):
Activate all GitLab Enterprise Edition functionality with a license.
- [Set up runners](https://docs.gitlab.com/runner/): Set up one or more GitLab
Runners, the agents that are responsible for all of the GitLab CI/CD features.
diff --git a/doc/install/installation.md b/doc/install/installation.md
index f246f975acf..8497b2b5269 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Installation from source
+# Installation from source **(FREE SELF)**
This is the official installation guide to set up a production GitLab server
using the source files. To set up a **development installation** or for many
@@ -108,9 +108,8 @@ Install the required packages (needed to compile Ruby and native extensions to R
```shell
sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libre2-dev \
- libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev \
- libxslt-dev libcurl4-openssl-dev libicu-dev logrotate rsync python-docutils pkg-config cmake \
- runit-systemd
+ libreadline-dev libncurses5-dev libffi-dev curl openssh-server libxml2-dev libxslt-dev \
+ libcurl4-openssl-dev libicu-dev logrotate rsync python-docutils pkg-config cmake runit-systemd
```
Ubuntu 14.04 (Trusty Tahr) doesn't have the `libre2-dev` package available, but
@@ -288,9 +287,9 @@ In GitLab 12.1 and later, only PostgreSQL is supported. In GitLab 13.0 and later
```shell
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- RELEASE=$(lsb_release -cs) echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list
+ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
- sudo apt -y install postgresql-11 postgresql-client-11 libpq-dev
+ sudo apt -y install postgresql-12 postgresql-client-12 libpq-dev
```
1. Verify the PostgreSQL version you have is supported by the version of GitLab you're
@@ -571,7 +570,9 @@ Install the gems (if you want to use Kerberos for user authentication, omit
`kerberos` in the `--without` option below):
```shell
-sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
+sudo -u git -H bundle config set deployment 'true'
+sudo -u git -H bundle config set without 'development test mysql aws kerberos'
+sudo -u git -H bundle install
```
### Install GitLab Shell
diff --git a/doc/install/openshift_and_gitlab/index.md b/doc/install/openshift_and_gitlab/index.md
index 3ee899958af..3dbcbcfc90c 100644
--- a/doc/install/openshift_and_gitlab/index.md
+++ b/doc/install/openshift_and_gitlab/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# How to install GitLab on OpenShift Origin 3
+# How to install GitLab on OpenShift Origin 3 **(FREE SELF)**
WARNING:
This article is deprecated. Use the official Kubernetes Helm charts for
@@ -38,7 +38,7 @@ already, go ahead and install the following components as they are essential to
test OpenShift easily:
- [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
-- [Vagrant](https://www.vagrantup.com/downloads.html)
+- [Vagrant](https://www.vagrantup.com/downloads)
- [OpenShift Client](https://docs.okd.io/3.11/cli_reference/get_started_cli.html) (`oc` for short)
It is also important to mention that for the purposes of this tutorial, the
diff --git a/doc/install/postgresql_extensions.md b/doc/install/postgresql_extensions.md
index ed108a35c4b..8d5a2a79b72 100644
--- a/doc/install/postgresql_extensions.md
+++ b/doc/install/postgresql_extensions.md
@@ -4,13 +4,17 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Managing PostgreSQL extensions
+# Managing PostgreSQL extensions **(FREE SELF)**
This guide documents how to manage PostgreSQL extensions for installations with an external
PostgreSQL database.
-GitLab requires certain extensions to be installed into the GitLab database. For example,
-GitLab relies on `pg_trgm` and the `btree_gist` extensions.
+The following extensions must be loaded into the GitLab database:
+
+| Extension | Minimum GitLab version |
+|--------------|------------------------|
+| `pg_trgm` | 8.6 |
+| `btree_gist` | 13.1 |
In order to install extensions, PostgreSQL requires the user to have superuser privileges.
Typically, the GitLab database user is not a superuser. Therefore, regular database migrations
diff --git a/doc/install/relative_url.md b/doc/install/relative_url.md
index 90026e6e49e..e0971d7f354 100644
--- a/doc/install/relative_url.md
+++ b/doc/install/relative_url.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Install GitLab under a relative URL
+# Install GitLab under a relative URL **(FREE SELF)**
While it is recommended to install GitLab on its own (sub)domain, sometimes
this is not possible due to a variety of reasons. In that case, GitLab can also
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index da07453c2ce..a1343dd5f98 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Requirements
+# Requirements **(FREE SELF)**
This page includes useful information on the supported Operating Systems as well
as the hardware requirements that are needed to install and use GitLab.
@@ -80,7 +80,7 @@ From GitLab 13.1:
Beginning in GitLab 12.9, we only support Node.js 10.13.0 or higher, and we have dropped
support for Node.js 8. (Node.js 6 support was dropped in GitLab 11.8)
-We recommend Node 12.x, as it's faster.
+We recommend Node 14.x, as it's faster.
GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets, which requires a minimum
version of Node.js 10.13.0.
@@ -110,7 +110,8 @@ Apart from a local hard drive you can also mount a volume that supports the netw
If you have enough RAM and a recent CPU the speed of GitLab is mainly limited by hard drive seek times. Having a fast drive (7200 RPM and up) or a solid state drive (SSD) will improve the responsiveness of GitLab.
NOTE:
-Since file system performance may affect the overall performance of GitLab, [we don't recommend using AWS EFS for storage](../administration/nfs.md#avoid-using-awss-elastic-file-system-efs).
+Since file system performance may affect the overall performance of GitLab,
+[we don't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
### CPU
@@ -151,18 +152,24 @@ MySQL/MariaDB are advised to [migrate to PostgreSQL](../update/mysql_to_postgres
The server running PostgreSQL should have _at least_ 5-10 GB of storage
available, though the exact requirements [depend on the number of users](../administration/reference_architectures/index.md).
-We highly recommend users to use the minimum PostgreSQL versions specified below as these are the versions used for development and testing.
+We highly recommend using the minimum PostgreSQL versions (as specified in
+the following table) as these were used for development and testing:
-GitLab version | Minimum PostgreSQL version
--|-
-10.0 | 9.6
-13.0 | 11
+| GitLab version | Minimum PostgreSQL version |
+|----------------|----------------------------|
+| 10.0 | 9.6 |
+| 13.0 | 11 |
-You must also ensure the `pg_trgm` and `btree_gist` extensions are [loaded into every
-GitLab database](postgresql_extensions.html).
+You must also ensure the following extensions are [loaded into every
+GitLab database](postgresql_extensions.html):
+
+| Extension | Minimum GitLab version |
+| ------------ | ---------------------- |
+| `pg_trgm` | 8.6 |
+| `btree_gist` | 13.1 |
NOTE:
-Support for [PostgreSQL 9.6 and 10 has been removed in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#postgresql-11-is-now-the-minimum-required-version-to-install-gitlab) so that GitLab can benefit from PostgreSQL 11 improvements, such as partitioning. For the schedule of transitioning to PostgreSQL 12, see [the related epic](https://gitlab.com/groups/gitlab-org/-/epics/2184).
+Support for [PostgreSQL 9.6 and 10 was removed in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#postgresql-11-is-now-the-minimum-required-version-to-install-gitlab) so that GitLab can benefit from PostgreSQL 11 improvements, such as partitioning. For the schedule of transitioning to PostgreSQL 12, see [the related epic](https://gitlab.com/groups/gitlab-org/-/epics/2184).
#### Additional requirements for GitLab Geo
diff --git a/doc/integration/README.md b/doc/integration/README.md
index 7d38dd6222a..9c3d39327f8 100644
--- a/doc/integration/README.md
+++ b/doc/integration/README.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
comments: false
---
-# GitLab integrations
+# GitLab integrations **(FREE)**
GitLab can be integrated with external services for enhanced functionality.
@@ -59,8 +59,7 @@ GitLab can be integrated with the following enhancements:
or [Kroki](../administration/integration/kroki.md) to use diagrams in AsciiDoc and Markdown documents.
- Attach merge requests to [Trello](trello_power_up.md) cards.
- Enable integrated code intelligence powered by [Sourcegraph](sourcegraph.md).
-- Add [Elasticsearch](elasticsearch.md) for [Advanced Search](../user/search/advanced_global_search.md),
- [Advanced System Search](../user/search/advanced_search_syntax.md), and faster searching.
+- Add [Elasticsearch](elasticsearch.md) for [Advanced Search](../user/search/advanced_search.md).
## Integrations
diff --git a/doc/integration/akismet.md b/doc/integration/akismet.md
index a2720c82fe7..d2e20b225cc 100644
--- a/doc/integration/akismet.md
+++ b/doc/integration/akismet.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Akismet
+# Akismet **(FREE)**
GitLab leverages [Akismet](https://akismet.com/) to protect against spam.
GitLab uses Akismet to prevent the creation of spam issues on public projects. Issues
diff --git a/doc/integration/auth0.md b/doc/integration/auth0.md
index 7e531682faf..6b8b07c3707 100644
--- a/doc/integration/auth0.md
+++ b/doc/integration/auth0.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Auth0 OmniAuth Provider
+# Auth0 OmniAuth Provider **(FREE SELF)**
To enable the Auth0 OmniAuth provider, you must create an Auth0 account, and an
application.
diff --git a/doc/integration/azure.md b/doc/integration/azure.md
index c83ef650f54..61a8290e664 100644
--- a/doc/integration/azure.md
+++ b/doc/integration/azure.md
@@ -4,11 +4,12 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Microsoft Azure OAuth2 OmniAuth Provider
+# Microsoft Azure OAuth2 OmniAuth Provider **(FREE)**
NOTE:
Per Microsoft, this provider uses the [older Azure Active Directory v1.0 endpoint](https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-protocols-oauth-code).
Microsoft documentation suggests that you should use the [OpenID Connect protocol to use the v2 endpoints](../administration/auth/oidc.md#microsoft-azure) for new projects.
+To use v2 endpoints via OmniAuth, please follow [Microsoft Azure OAuth2 OmniAuth Provider v2 instructions](#microsoft-azure-oauth2-omniauth-provider-v2).
To enable the Microsoft Azure OAuth2 OmniAuth provider, you must register your application with Azure. Azure generates a client ID and secret key for you to use.
@@ -94,3 +95,106 @@ sign in and authorize the GitLab application. If successful, you are returned to
Read [Enable OmniAuth for an Existing User](omniauth.md#enable-omniauth-for-an-existing-user)
for information on how existing GitLab users can connect to their newly-available Azure AD accounts.
+
+## Microsoft Azure OAuth2 OmniAuth Provider v2
+
+In order to use v2 endpoints provided by Microsoft Azure Active Directory you must to configure it via Azure OAuth2 OmniAuth Provider v2.
+
+### Registering an Azure application
+
+To enable the Microsoft Azure OAuth2 OmniAuth provider, you must register your application with Azure. Azure generates a client ID and secret key for you to use.
+
+Sign in to the [Azure Portal](https://portal.azure.com), and follow the instructions in
+the [Microsoft Quickstart documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app).
+
+As you go through the Microsoft procedure, keep the following in mind:
+
+- If you have multiple instances of Azure Active Directory, you can switch to the desired tenant.
+- You're setting up a Web application.
+- The redirect URI requires the URL of the Azure OAuth callback of your GitLab
+ installation. For example, `https://gitlab.example.com/users/auth/azure_activedirectory_v2/callback`.
+ The type dropdown should be set to **Web**.
+- The `client ID` and `client secret` are terms associated with OAuth 2. In some Microsoft documentation,
+ the terms may be listed as `Application ID` and `Application Secret`.
+- If you need to generate a new client secret, follow the Microsoft documentation
+ for [creating a new application secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#create-a-new-application-secret).
+- Save the client ID and client secret for your new app, as the client secret is only
+ displayed one time.
+
+### Adding API permissions (scopes)
+
+Once you have created an application, follow the [Microsoft Quickstart documentation to expose a web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis). Be sure to add the following delegated permissions under the Microsoft Graph API:
+
+- `email`
+- `openid`
+- `profile`
+
+### Configuring GitLab
+
+1. On your GitLab server, open the configuration file.
+
+ For Omnibus GitLab:
+
+ ```shell
+ sudo editor /etc/gitlab/gitlab.rb
+ ```
+
+ For installations from source:
+
+ ```shell
+ cd /home/git/gitlab
+
+ sudo -u git -H editor config/gitlab.yml
+ ```
+
+1. Refer to [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration)
+ for initial settings.
+
+1. Add the provider configuration:
+
+ For Omnibus GitLab:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ "name" => "azure_activedirectory_v2",
+ "args" => {
+ "client_id" => "CLIENT ID",
+ "client_secret" => "CLIENT SECRET",
+ "tenant_id" => "TENANT ID",
+ }
+ }
+ ]
+ ```
+
+ For installations from source:
+
+ ```yaml
+ - { name: 'azure_activedirectory_v2',
+ args: { client_id: "CLIENT ID",
+ client_secret: "CLIENT SECRET",
+ tenant_id: "TENANT ID" } }
+ ```
+
+ The `base_azure_url` is optional and can be added for different locales;
+ such as `base_azure_url: "https://login.microsoftonline.de"`.
+
+ The `scope` parameter is optional and can be added to `args`. Default `scope` is: `openid profile email`.
+
+1. Replace `CLIENT ID`, `CLIENT SECRET`, and `TENANT ID` with the values you got above.
+
+1. Save the configuration file.
+
+1. Reconfigure or restart GitLab, depending on your installation method:
+
+ - *If you installed from Omnibus GitLab,*
+ [reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab.
+ - *If you installed from source,*
+ [restart GitLab](../administration/restart_gitlab.md#installations-from-source).
+
+On the sign-in page, you should now see a Microsoft icon below the regular sign-in form.
+Select the icon to begin the authentication process. Microsoft then asks you to
+sign in and authorize the GitLab application. If successful, you are returned to GitLab and signed in.
+
+Read [Enable OmniAuth for an Existing User](omniauth.md#enable-omniauth-for-an-existing-user)
+for information on how existing GitLab users can connect to their newly available Azure AD accounts.
diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md
index 8999f4da9a2..a492b891248 100644
--- a/doc/integration/bitbucket.md
+++ b/doc/integration/bitbucket.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab server with Bitbucket Cloud
+# Integrate your GitLab server with Bitbucket Cloud **(FREE)**
NOTE:
Starting from GitLab 11.4, OmniAuth is enabled by default. If you're using an
@@ -26,6 +26,11 @@ To enable the Bitbucket OmniAuth provider you must register your application
with Bitbucket.org. Bitbucket generates an application ID and secret key for
you to use.
+WARNING:
+To help prevent an [OAuth 2 covert redirect](https://oauth.net/advisories/2014-1-covert-redirect/)
+vulnerability in which users' GitLab accounts could be compromised, append `/users/auth`
+to the end of the Bitbucket authorization callback URL.
+
1. Sign in to [Bitbucket.org](https://bitbucket.org).
1. Navigate to your individual user settings (**Bitbucket settings**) or a team's
settings (**Manage team**), depending on how you want the application registered.
@@ -40,9 +45,7 @@ you to use.
- **Application description:** *(Optional)* Fill this in if you wish.
- **Callback URL:** (Required in GitLab versions 8.15 and greater)
The URL to your GitLab installation, such as
- `https://gitlab.example.com/users/auth`. Be sure to append `/users/auth` to
- the end of the callback URL to prevent an
- [OAuth2 convert redirect](http://tetraph.com/covert_redirect/) vulnerability.
+ `https://gitlab.example.com/users/auth`.
Leaving this field empty
[results in an `Invalid redirect_uri` message](https://confluence.atlassian.com/bitbucket/oauth-faq-338365710.html).
- **URL:** The URL to your GitLab installation, such as `https://gitlab.example.com`.
diff --git a/doc/integration/cas.md b/doc/integration/cas.md
index b444143b03e..59f41ab4368 100644
--- a/doc/integration/cas.md
+++ b/doc/integration/cas.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# CAS OmniAuth Provider
+# CAS OmniAuth Provider **(FREE)**
To enable the CAS OmniAuth provider you must register your application with your CAS instance. This requires the service URL GitLab supplies to CAS. It should be something like: `https://gitlab.example.com:443/users/auth/cas3/callback?url`. By default handling for SLO is enabled, you only need to configure CAS for back-channel logout.
diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md
index 389c7aabdf5..5c9149ef49b 100644
--- a/doc/integration/elasticsearch.md
+++ b/doc/integration/elasticsearch.md
@@ -11,10 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This document describes how to enable Advanced Search. After
Advanced Search is enabled, you'll have the benefit of fast search response times
-and the advantage of the following special searches:
-
-- [Advanced Search](../user/search/advanced_global_search.md)
-- [Advanced Search Syntax](../user/search/advanced_search_syntax.md)
+and the advantage of the [special searches](../user/search/advanced_search.md).
## Version requirements
@@ -41,7 +38,7 @@ each node should have:
- [Memory](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_memory): 8 GiB (minimum).
- [CPU](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_cpus): Modern processor with multiple cores.
-- [Storage](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_disks): Use SSD storage. You will need enough storage for 50% of the total size of your Git repositories.
+- [Storage](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_disks): Use SSD storage. The total storage size of all Elasticsearch nodes is about 50% of the total size of your Git repositories. It includes one primary and one replica.
A few notes on CPU and storage:
@@ -56,6 +53,12 @@ A few notes on CPU and storage:
to any spinning media for Elasticsearch. In testing, nodes that use SSD storage
see boosts in both query and indexing performance.
+- We've introduced the [`estimate_cluster_size`](#gitlab-advanced-search-rake-tasks)
+ Rake task to estimate the Advanced Search storage requirements in advance, which
+- The [`estimate_cluster_size`](#gitlab-advanced-search-rake-tasks) Rake task estimates the
+ Advanced Search storage requirements in advance. The Rake task uses total repository size
+ for the calculation. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221177) in GitLab 13.10.
+
Keep in mind, these are **minimum requirements** for Elasticsearch.
Heavily-used Elasticsearch clusters will likely require considerably more
resources.
@@ -218,8 +221,8 @@ The following Elasticsearch settings are available:
| `Elasticsearch indexing` | Enables or disables Elasticsearch indexing and creates an empty index if one does not already exist. You may want to enable indexing but disable search in order to give the index time to be fully completed, for example. Also, keep in mind that this option doesn't have any impact on existing data, this only enables/disables the background indexer which tracks data changes and ensures new data is indexed. |
| `Pause Elasticsearch indexing` | Enables or disables temporary indexing pause. This is useful for cluster migration/reindexing. All changes are still tracked, but they are not committed to the Elasticsearch index until resumed. |
| `Search with Elasticsearch enabled` | Enables or disables using Elasticsearch in search. |
-| `URL` | The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., `http://host1, https://host2:9200`). If your Elasticsearch instance is password protected, pass the `username:password` in the URL (e.g., `http://<username>:<password>@<elastic_host>:9200/`). |
-| `Number of Elasticsearch shards` | Elasticsearch indexes are split into multiple shards for performance reasons. In general, larger indexes need to have more shards. Changes to this value do not take effect until the index is recreated. You can read more about tradeoffs in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/scalability.html). |
+| `URL` | The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., `http://host1, https://host2:9200`). If your Elasticsearch instance is password protected, pass the `username:password` in the URL (e.g., `http://<username>:<password>@<elastic_host>:9200/`). Special characters in the username or password should use [percentage encoding](https://en.wikipedia.org/wiki/Percent-encoding). |
+| `Number of Elasticsearch shards` | Elasticsearch indexes are split into multiple shards for performance reasons. In general, you should use at least 5 shards, and indexes with tens of millions of documents need to have more shards ([see below](#guidance-on-choosing-optimal-cluster-configuration)). Changes to this value do not take effect until the index is recreated. You can read more about tradeoffs in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/scalability.html). |
| `Number of Elasticsearch replicas` | Each Elasticsearch shard can have a number of replicas. These are a complete copy of the shard, and can provide increased query performance or resilience against hardware failure. Increasing this value will greatly increase total disk space required by the index. |
| `Limit namespaces and projects that can be indexed` | Enabling this will allow you to select namespaces and projects to index. All other namespaces and projects will use database search instead. Please note that if you enable this option but do not select any namespaces or projects, none will be indexed. [Read more below](#limiting-namespaces-and-projects).
| `Using AWS hosted Elasticsearch with IAM credentials` | Sign your Elasticsearch requests using [AWS IAM authorization](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html), [AWS EC2 Instance Profile Credentials](https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-iam-instance-profile.html#getting-started-create-iam-instance-profile-cli), or [AWS ECS Tasks Credentials](https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-iam-roles.html). Please refer to [Identity and Access Management in Amazon Elasticsearch Service](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-ac.html) for details of AWS hosted Elasticsearch domain access policy configuration. |
@@ -232,6 +235,12 @@ The following Elasticsearch settings are available:
| `Bulk request concurrency` | The Bulk request concurrency indicates how many of the GitLab Golang-based indexer processes (or threads) can run in parallel to collect data to subsequently submit to Elasticsearch’s Bulk API. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. This setting should be used together with the Maximum bulk request size setting (see above) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running the GitLab Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. |
| `Client request timeout` | Elasticsearch HTTP client request timeout value in seconds. `0` means using the system default timeout value, which depends on the libraries that GitLab application is built upon. |
+WARNING:
+Increasing the values of `Maximum bulk request size (MiB)` and `Bulk request concurrency` can negatively impact
+Sidekiq performance. Return them to their default values if you see increased `scheduling_latency_s` durations
+in your Sidekiq logs. For more information, see
+[issue 322147](https://gitlab.com/gitlab-org/gitlab/-/issues/322147).
+
### Limiting namespaces and projects
If you select `Limit namespaces and projects that can be indexed`, more options will become available.
@@ -335,7 +344,7 @@ Sometimes, you might want to abandon the unfinished reindex job and resume the i
1. Uncheck the "Pause Elasticsearch indexing" checkbox in **Admin Area > Settings > Advanced Search**.
-## Background migrations
+## Advanced Search migrations
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/234046) in GitLab 13.6.
@@ -343,7 +352,7 @@ With reindex migrations running in the background, there's no need for a manual
intervention. This usually happens in situations where new features are added to
Advanced Search, which means adding or changing the way content is indexed.
-To confirm that the background migrations ran, you can check with:
+To confirm that the Advanced Search migrations ran, you can check with:
```shell
curl "$CLUSTER_URL/gitlab-production-migrations/_search?q=*" | jq .
@@ -393,6 +402,21 @@ debug why the migration was halted and make any changes before retrying the migr
fixed the cause of the failure, click "Retry migration", and the migration will be scheduled to be retried
in the background.
+If you cannot get the migration to succeed, you may
+consider the [last resort to recreate the index from
+scratch](#last-resort-to-recreate-an-index). This may allow you to skip over
+the problem because a newly created index will skip all migrations as the index
+will be recreated with the correct up-to-date schema.
+
+### All migrations must be finished before doing a major upgrade
+
+Before doing a major version GitLab upgrade, you should have completed all
+migrations that exist up until the latest minor version before that major
+version. If you have halted migrations, these will need to be resolved and
+[retried](#retry-a-halted-migration) before proceeding with a major version
+upgrade. Read more about [upgrading to a new major
+version](../update/index.md#upgrading-to-a-new-major-version).
+
## GitLab Advanced Search Rake tasks
Rake tasks are available to:
@@ -415,7 +439,9 @@ The following are some available Rake tasks:
| [`sudo gitlab-rake gitlab:elastic:index_snippets`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Performs an Elasticsearch import that indexes the snippets data. |
| [`sudo gitlab-rake gitlab:elastic:projects_not_indexed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Displays which projects are not indexed. |
| [`sudo gitlab-rake gitlab:elastic:reindex_cluster`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Schedules a zero-downtime cluster reindexing task. This feature should be used with an index that was created after GitLab 13.0. |
-| [`sudo gitlab-rake gitlab:elastic:mark_reindex_failed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake)`] | Mark the most recent re-index job as failed. |
+| [`sudo gitlab-rake gitlab:elastic:mark_reindex_failed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Mark the most recent re-index job as failed. |
+| [`sudo gitlab-rake gitlab:elastic:list_pending_migrations`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | List pending migrations. Pending migrations include those that have not yet started, have started but not finished, and those that are halted. |
+| [`sudo gitlab-rake gitlab:elastic:estimate_cluster_size`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Get an estimate of cluster size based on the total repository size. |
### Environment variables
@@ -465,7 +491,12 @@ For basic guidance on choosing a cluster configuration you may refer to [Elastic
- `Heap size` should be set to no more than 50% of your physical RAM. Additionally, it shouldn't be set to more than the threshold for zero-based compressed oops. The exact threshold varies, but 26 GB is safe on most systems, but can also be as large as 30 GB on some systems. See [Heap size settings](https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html#heap-size-settings) and [Setting JVM options](https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html) for more details.
- Number of CPUs (CPU cores) per node usually corresponds to the `Number of Elasticsearch shards` setting described below.
- A good guideline is to ensure you keep the number of shards per node below 20 per GB heap it has configured. A node with a 30GB heap should therefore have a maximum of 600 shards, but the further below this limit you can keep it the better. This will generally help the cluster stay in good health.
-- Small shards result in small segments, which increases overhead. Aim to keep the average shard size between at least a few GB and a few tens of GB. Another consideration is the number of documents, you should aim for this simple formula for the number of shards: `number of expected documents / 5M +1`.
+- Number of Elasticsearch shards:
+ - Small shards result in small segments, which increases overhead. Aim to keep the average shard size between at least a few GB and a few tens of GB.
+ - Another consideration is the number of documents. To determine the number of shards to use, sum the numbers in the **Admin Area > Dashboard > Statistics** pane (the number of documents to be indexed), divide by 5 million, and add 5. For example:
+ - If you have fewer than about 2,000,000 documents, use the default of 5 shards
+ - 10,000,000 documents: `10000000/5000000 + 5` = 7 shards
+ - 100,000,000 documents: `100000000/5000000 + 5` = 25 shards
- `refresh_interval` is a per index setting. You may want to adjust that from default `1s` to a bigger value if you don't need data in real-time. This will change how soon you will see fresh results. If that's important for you, you should leave it as close as possible to the default value.
- You might want to raise [`indices.memory.index_buffer_size`](https://www.elastic.co/guide/en/elasticsearch/reference/current/indexing-buffer.html) to 30% or 40% if you have a lot of heavy indexing operations.
@@ -873,3 +904,35 @@ Improvements to the `code_analyzer` pattern and filters are being discussed in [
### Some binary files may not be searchable by name
In GitLab 13.9, a change was made where [binary file names are being indexed](https://gitlab.com/gitlab-org/gitlab/-/issues/301083). However, without indexing all projects' data from scratch, only binary files that are added or updated after the GitLab 13.9 release are searchable.
+
+### Last resort to recreate an index
+
+There may be cases where somehow data never got indexed and it's not in the
+queue, or the index is somehow in a state where migrations just simply cannot
+proceed. It is always best to try to troubleshoot the root cause of the problem
+using the above [troubleshooting](#troubleshooting) steps.
+
+If there are no other options, then you always have the option of recreating the
+entire index from scratch. If you have a small GitLab installation, this can
+sometimes be a quick way to resolve a problem, but if you have a large GitLab
+installation, then this will likely take a very long time to complete. Until the
+index is fully recreated, your index will not be serving correct search results,
+so you may want to disable **Search with Elasticsearch** while it is running.
+
+If you are sure you've read the above caveats and want to proceed, then you
+should run the following Rake task to recreate the entire index from scratch:
+
+**For Omnibus installations**
+
+```shell
+# WARNING: DO NOT RUN THIS UNTIL YOU READ THE DESCRIPTION ABOVE
+sudo gitlab-rake gitlab:elastic:index
+```
+
+**For installations from source**
+
+```shell
+# WARNING: DO NOT RUN THIS UNTIL YOU READ THE DESCRIPTION ABOVE
+cd /home/git/gitlab
+sudo -u git -H bundle exec rake gitlab:elastic:index
+```
diff --git a/doc/integration/external-issue-tracker.md b/doc/integration/external-issue-tracker.md
index b1eb9d0d2fe..4e00057c4b7 100644
--- a/doc/integration/external-issue-tracker.md
+++ b/doc/integration/external-issue-tracker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# External issue tracker
+# External issue tracker **(FREE)**
GitLab has a great [issue tracker](../user/project/issues/index.md) but you can also use an external
one. External issue trackers are configurable per GitLab project.
diff --git a/doc/integration/facebook.md b/doc/integration/facebook.md
index b86958726a7..c901fdfdd10 100644
--- a/doc/integration/facebook.md
+++ b/doc/integration/facebook.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Facebook OAuth2 OmniAuth Provider
+# Facebook OAuth2 OmniAuth Provider **(FREE)**
To enable the Facebook OmniAuth provider you must register your application with Facebook. Facebook generates an app ID and secret key for you to use.
diff --git a/doc/integration/github.md b/doc/integration/github.md
index 0239ba0e818..4d8adfe42f1 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -4,24 +4,31 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab instance with GitHub
+# Integrate your GitLab instance with GitHub **(FREE)**
You can integrate your GitLab instance with GitHub.com and GitHub Enterprise. This integration
enables users to import projects from GitHub, or sign in to your GitLab instance
with their GitHub account.
+## Security check
+
+Some integrations risk compromising GitLab accounts. To help mitigate this
+[OAuth 2 covert redirect](https://oauth.net/advisories/2014-1-covert-redirect/)
+vulnerability, append `/users/auth` to the end of the authorization callback URL.
+
+However, as far as we know, GitHub does not validate the subdomain part of the `redirect_uri`.
+This means that a subdomain takeover, an XSS, or an open redirect on any subdomain of
+your website could enable the covert redirect attack.
+
## Enabling GitHub OAuth
-To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/apps/building-oauth-apps/creating-an-oauth-app/).
+To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/en/developers/apps/creating-an-oauth-app).
When you create an OAuth 2 app in GitHub, you need the following information:
- The URL of your GitLab instance, such as `https://gitlab.example.com`.
- The authorization callback URL; in this case, `https://gitlab.example.com/users/auth`. Include the port number if your GitLab instance uses a non-default port.
-NOTE:
-To prevent an [OAuth2 covert redirect](https://oauth.net/advisories/2014-1-covert-redirect/) vulnerability, append `/users/auth` to the end of the GitHub authorization callback URL.
-
See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings.
After you have configured the GitHub provider, you need the following information. You must substitute that information in the GitLab configuration file in these next steps.
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 97c5332c438..7e21685fd54 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your server with GitLab.com
+# Integrate your server with GitLab.com **(FREE)**
Import projects from GitLab.com and login to your GitLab instance with your GitLab.com account.
diff --git a/doc/integration/gitpod.md b/doc/integration/gitpod.md
index 7dc710615fb..e62e3de29c2 100644
--- a/doc/integration/gitpod.md
+++ b/doc/integration/gitpod.md
@@ -5,7 +5,7 @@ group: Editor
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
---
-# Gitpod Integration
+# Gitpod Integration **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228893) in GitLab 13.4.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/258206) in GitLab 13.8
@@ -34,9 +34,8 @@ To learn more about Gitpod, see their [features](https://www.gitpod.io/features/
With the Gitpod integration enabled for your GitLab instance, to enable it for yourself:
1. In the top-right corner, select your avatar.
-1. Select **Edit profile**.
-1. In the left sidebar, select **Account**.
-1. Under **Integrations**, locate the **Gitpod** section.
+1. Select **Preferences**.
+1. Under **Preferences**, locate the **Integrations** section.
1. Check the **Enable Gitpod integration** checkbox and select the **Save changes** button.
## Configure a self-managed instance **(FREE SELF)**
diff --git a/doc/integration/gmail_action_buttons_for_gitlab.md b/doc/integration/gmail_action_buttons_for_gitlab.md
index af9972e825e..fa0e79d4c0b 100644
--- a/doc/integration/gmail_action_buttons_for_gitlab.md
+++ b/doc/integration/gmail_action_buttons_for_gitlab.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Gmail actions buttons for GitLab
+# Gmail actions buttons for GitLab **(FREE)**
GitLab supports [Google actions in email](https://developers.google.com/gmail/markup/actions/actions-overview).
diff --git a/doc/integration/google.md b/doc/integration/google.md
index cd00c854fea..0e4c9b78b5f 100644
--- a/doc/integration/google.md
+++ b/doc/integration/google.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Google OAuth2 OmniAuth Provider
+# Google OAuth2 OmniAuth Provider **(FREE)**
To enable the Google OAuth2 OmniAuth provider you must register your application
with Google. Google generates a client ID and secret key for you to use.
diff --git a/doc/integration/img/oauth_provider_admin_application.png b/doc/integration/img/oauth_provider_admin_application.png
deleted file mode 100644
index 353114fea30..00000000000
--- a/doc/integration/img/oauth_provider_admin_application.png
+++ /dev/null
Binary files differ
diff --git a/doc/integration/jenkins.md b/doc/integration/jenkins.md
index b51ce5de8d7..1250ddee584 100644
--- a/doc/integration/jenkins.md
+++ b/doc/integration/jenkins.md
@@ -31,7 +31,8 @@ the ['GitLab vs. Jenkins' comparison page](https://about.gitlab.com/devops-tools
NOTE:
This documentation focuses only on how to **configure** a Jenkins *integration* with
-GitLab. Learn how to **migrate** from Jenkins to GitLab CI/CD in our
+GitLab. Learn how to set up Jenkins [on your local machine](../development/integrations/jenkins.md)
+in our developer documentation, and how to **migrate** from Jenkins to GitLab CI/CD in our
[Migrating from Jenkins](../ci/migration/jenkins.md) documentation.
## Configure GitLab integration with Jenkins
@@ -138,9 +139,11 @@ Set up the Jenkins project you intend to run your build on.
## Configure the GitLab project
-Configure the GitLab integration with Jenkins.
+Configure the GitLab integration with Jenkins in one of the following ways.
-### Option 1: Jenkins integration (recommended)
+### Recommended Jenkins integration
+
+GitLab recommends this approach for Jenkins integrations.
1. Create a new GitLab project or choose an existing one.
1. Go to **Settings > Integrations**, then select **Jenkins CI**.
@@ -159,7 +162,7 @@ Configure the GitLab integration with Jenkins.
authentication.
1. Click **Test settings and save changes**. GitLab tests the connection to Jenkins.
-### Option 2: Webhook
+### Webhook integration
If you are unable to provide GitLab with your Jenkins server login, you can use this option
to integrate GitLab and Jenkins.
@@ -167,7 +170,8 @@ to integrate GitLab and Jenkins.
1. In the configuration of your Jenkins job, in the GitLab configuration section, click **Advanced**.
1. Click the **Generate** button under the **Secret Token** field.
1. Copy the resulting token, and save the job configuration.
-1. In GitLab, create a webhook for your project, enter the trigger URL (such as `https://JENKINS_URL/project/YOUR_JOB`) and paste the token in the **Secret Token** field.
+1. In GitLab, create a webhook for your project, enter the trigger URL
+ (such as `https://JENKINS_URL/project/YOUR_JOB`) and paste the token in the **Secret Token** field.
1. After you add the webhook, click the **Test** button, and it should succeed.
## Troubleshooting
diff --git a/doc/integration/jenkins_deprecated.md b/doc/integration/jenkins_deprecated.md
index 2ed87456ea1..61d1deace4f 100644
--- a/doc/integration/jenkins_deprecated.md
+++ b/doc/integration/jenkins_deprecated.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Jenkins CI (deprecated) service
+# Jenkins CI (deprecated) service **(FREE)**
NOTE:
In GitLab 8.3, Jenkins integration using the
@@ -42,7 +42,7 @@ In GitLab, perform the following steps.
Jenkins needs read access to the GitLab repository. We already specified a
private key to use in Jenkins, now we need to add a public one to the GitLab
project. For that case we need a Deploy key. Read the documentation on
-[how to set up a Deploy key](../ssh/README.md#deploy-keys).
+[how to set up a Deploy key](../user/project/deploy_keys/index.md).
### Jenkins service
diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md
index 41656bd2216..84490757c16 100644
--- a/doc/integration/oauth2_generic.md
+++ b/doc/integration/oauth2_generic.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Sign into GitLab with (almost) any OAuth2 provider
+# Sign into GitLab with (almost) any OAuth2 provider **(FREE)**
The `omniauth-oauth2-generic` gem allows Single Sign-On between GitLab and your own OAuth2 provider
(or any OAuth2 provider compatible with this gem)
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index cf033018e17..e3b18c0b82b 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# OmniAuth
+# OmniAuth **(FREE)**
GitLab leverages OmniAuth to allow users to sign in using Twitter, GitHub, and
other popular services. [OmniAuth](https://rubygems.org/gems/omniauth/) is
@@ -239,7 +239,6 @@ from the OmniAuth provider's documentation.
If you have successfully set up a provider that is not shipped with GitLab itself,
please let us know.
-Share your experience [in the public Wiki](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Custom-omniauth-provider-configurations).
You can help others by reporting successful configurations and probably share a
few insights or provide warnings for common errors or pitfalls.
diff --git a/doc/integration/openid_connect_provider.md b/doc/integration/openid_connect_provider.md
index 4455ace3e1f..b37c5064063 100644
--- a/doc/integration/openid_connect_provider.md
+++ b/doc/integration/openid_connect_provider.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab as OpenID Connect identity provider
+# GitLab as OpenID Connect identity provider **(FREE)**
This document is about using GitLab as an OpenID Connect identity provider
to sign in to other services.
diff --git a/doc/integration/recaptcha.md b/doc/integration/recaptcha.md
index 8f090dfc588..9ffc89e2c13 100644
--- a/doc/integration/recaptcha.md
+++ b/doc/integration/recaptcha.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# reCAPTCHA
+# reCAPTCHA **(FREE)**
GitLab leverages [Google's reCAPTCHA](https://www.google.com/recaptcha/about/)
to protect against spam and abuse. GitLab displays the CAPTCHA form on the sign-up page
diff --git a/doc/integration/salesforce.md b/doc/integration/salesforce.md
index 156109518a6..102b89298a1 100644
--- a/doc/integration/salesforce.md
+++ b/doc/integration/salesforce.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Salesforce OmniAuth Provider
+# Salesforce OmniAuth Provider **(FREE)**
You can integrate your GitLab instance with [Salesforce](https://www.salesforce.com/) to enable users to log in to your GitLab instance with their Salesforce account.
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index 9b6ad3f2755..d68cf8e2f34 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -13,15 +13,15 @@ You should also reference the [OmniAuth documentation](omniauth.md) for general
## Common SAML Terms
-| Term | Description |
-|------|-------------|
-| Identity Provider (IdP) | The service which manages your user identities such as ADFS, Okta, Onelogin, or Ping Identity. |
-| Service Provider (SP) | SAML considers GitLab to be a service provider. |
-| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. |
-| SSO | Single Sign-On. |
+| Term | Description |
+|--------------------------------|-------------|
+| Identity Provider (IdP) | The service which manages your user identities, such as ADFS, Okta, OneLogin, or Ping Identity. |
+| Service Provider (SP) | SAML considers GitLab to be a service provider. |
+| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. |
+| SSO | Single Sign-On. |
| Assertion consumer service URL | The callback on GitLab where users will be redirected after successfully authenticating with the identity provider. |
-| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". |
-| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
+| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". |
+| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
## General Setup
@@ -265,7 +265,7 @@ considered admin users.
### Auditor groups **(PREMIUM SELF)**
-> Introduced in [GitLab Starter](https://about.gitlab.com/pricing/) 11.4.
+> Introduced in GitLab 11.4.
The requirements are the same as the previous settings, your IdP needs to pass Group information to GitLab, you need to tell
GitLab where to look for the groups in the SAML response, and which group(s) should be
@@ -454,8 +454,6 @@ args: {
### `uid_attribute`
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17734) in GitLab 10.7.
-
By default, the `uid` is set as the `name_id` in the SAML response. If you'd like to designate a unique attribute for the `uid`, you can set the `uid_attribute`. In the example below, the value of `uid` attribute in the SAML response is set as the `uid_attribute`.
```yaml
diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md
index 3b92f2858ac..c4cf19747be 100644
--- a/doc/integration/shibboleth.md
+++ b/doc/integration/shibboleth.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Shibboleth OmniAuth Provider
+# Shibboleth OmniAuth Provider **(FREE)**
NOTE:
The preferred approach for integrating a Shibboleth authentication system
diff --git a/doc/integration/slash_commands.md b/doc/integration/slash_commands.md
index 0dcf86cc46d..2c133c1de76 100644
--- a/doc/integration/slash_commands.md
+++ b/doc/integration/slash_commands.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Slash Commands
+# Slash Commands **(FREE)**
> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) to GitLab Free in 11.9.
diff --git a/doc/integration/trello_power_up.md b/doc/integration/trello_power_up.md
index 1a1b6cd101f..e8956271508 100644
--- a/doc/integration/trello_power_up.md
+++ b/doc/integration/trello_power_up.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Trello Power-Up
+# Trello Power-Up **(FREE)**
The GitLab Trello Power-Up enables you to seamlessly attach
GitLab **merge requests** to Trello cards.
diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md
index 8404352d0e9..58e111be73c 100644
--- a/doc/integration/twitter.md
+++ b/doc/integration/twitter.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Twitter OAuth2 OmniAuth Provider
+# Twitter OAuth2 OmniAuth Provider **(FREE)**
To enable the Twitter OmniAuth provider you must register your application with Twitter. Twitter generates a client ID and secret key for you to use.
diff --git a/doc/intro/index.md b/doc/intro/index.md
index 1ab7553d3a8..a40293955a9 100644
--- a/doc/intro/index.md
+++ b/doc/intro/index.md
@@ -12,7 +12,7 @@ comments: false
Create projects and groups.
- [Create a new project](../user/project/working_with_projects.md#create-a-project)
-- [Create a new group](../user/group/index.md#create-a-new-group)
+- [Create a new group](../user/group/index.md#create-a-group)
## Prioritize
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index f23880554a6..216e6adcdaf 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -79,8 +79,8 @@ is 200. For GitLab SaaS, the maximum number is determined by [tier](https://abou
You can apply a feature flag strategy across multiple environments, without defining
the strategy multiple times.
-GitLab Feature Flags use [Unleash](https://unleash.github.io) as the feature flag
-engine. In Unleash, there are [strategies](https://unleash.github.io/docs/activation_strategy)
+GitLab Feature Flags use [Unleash](https://docs.getunleash.io/) as the feature flag
+engine. In Unleash, there are [strategies](https://docs.getunleash.io/docs/activation_strategy)
for granular feature flag controls. GitLab Feature Flags can have multiple strategies,
and the supported strategies are:
@@ -95,7 +95,7 @@ and clicking **{pencil}** (edit).
### All users
-Enables the feature for all users. It uses the [`default`](https://unleash.github.io/docs/activation_strategy#default)
+Enables the feature for all users. It uses the [`default`](https://docs.getunleash.io/docs/activation_strategy#default)
Unleash activation strategy.
### Percent Rollout
diff --git a/doc/operations/incident_management/img/custom_alert_mapping_v13_10.png b/doc/operations/incident_management/img/custom_alert_mapping_v13_10.png
new file mode 100644
index 00000000000..b2527d3a298
--- /dev/null
+++ b/doc/operations/incident_management/img/custom_alert_mapping_v13_10.png
Binary files differ
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index f0bb9a8e950..317797376fc 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -54,7 +54,7 @@ With Maintainer or higher [permissions](../../user/permissions.md), you can enab
1. Navigate to **Settings > Operations > Incidents** and expand **Incidents**.
1. Check the **Create an incident** checkbox.
1. To customize the incident, select an
- [issue template](../../user/project/description_templates.md#creating-issue-templates).
+ [issue template](../../user/project/description_templates.md#create-an-issue-template).
1. To send [an email notification](paging.md#email-notifications) to users
with [Developer permissions](../../user/permissions.md), select
**Send a separate email notification to Developers**. Email notifications are
diff --git a/doc/operations/incident_management/integrations.md b/doc/operations/incident_management/integrations.md
index b3e7d9c544d..62a50255dd8 100644
--- a/doc/operations/incident_management/integrations.md
+++ b/doc/operations/incident_management/integrations.md
@@ -4,7 +4,7 @@ group: Health
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Alert integrations **(FREE)**
+# Integrations **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13203) in GitLab Ultimate 12.4.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42640) to GitLab Free in 12.8.
@@ -57,19 +57,36 @@ and you can [customize the payload](#customize-the-alert-payload-outside-of-gitl
1. Expand the **Alerts** section.
1. For each endpoint you want to create:
+ 1. Click the **Add new integration** button.
1. In the **Integration** dropdown menu, select **HTTP Endpoint**.
1. Name the integration.
- 1. Toggle the **Active** alert setting to display the **URL** and **Authorization Key**
- for the webhook configuration. You must also input the URL and Authorization Key
- in your external service.
- 1. _(Optional)_ To generate a test alert to test the new integration, enter a
- sample payload, then click **Save and test alert payload**. Valid JSON is required.
- 1. Click **Save Integration**.
+ 1. Toggle the **Active** alert setting. The **URL** and **Authorization Key** for the webhook
+ configuration are available in the **View credentials** tab after you save the integration.
+ You must also input the URL and Authorization Key in your external service.
+ 1. _(Optional)_ To map fields from your monitoring tool's alert to GitLab fields, enter a sample
+ payload and click **Parse payload for custom mapping**. Valid JSON is required. If you update
+ a sample payload, you must also remap the fields.
+
+ 1. _(Optional)_ If you provided a valid sample payload, select each value in
+ **Payload alert key** to [map to a **GitLab alert key**](#map-fields-in-custom-alerts).
+ 1. To save your integration, click **Save Integration**. If desired, you can send a test alert
+ from your integration's **Send test alert** tab after the integration is created.
The new HTTP Endpoint displays in the [integrations list](#integrations-list).
-You can edit the integration by selecting the **{pencil}** pencil icon on the right
+You can edit the integration by selecting the **{settings}** settings icon on the right
side of the integrations list.
+#### Map fields in custom alerts
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4443) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.10.
+
+You can integrate your monitoring tool's alert format with GitLab alerts. To show the
+correct information in the [Alert list](alerts.md) and the
+[Alert Details page](alerts.md#alert-details-page), map your alert's fields to
+GitLab fields when you [create an HTTP endpoint](#http-endpoints):
+
+![Alert Management List](img/custom_alert_mapping_v13_10.png)
+
### External Prometheus integration
For GitLab versions 13.1 and greater, read
@@ -79,7 +96,7 @@ to configure alerts for this integration.
## Customize the alert payload outside of GitLab
For all integration types, you can customize the payload by sending the following
-parameters. All fields are optional. If the incoming alert does not contain a value for the `Title` field, a default value of `New: Incident` will be applied.
+parameters. All fields are optional. If the incoming alert does not contain a value for the `Title` field, a default value of `New: Alert` will be applied.
| Property | Type | Description |
| ------------------------- | --------------- | ----------- |
diff --git a/doc/operations/incident_management/paging.md b/doc/operations/incident_management/paging.md
index dd04cd63a54..4801f94d494 100644
--- a/doc/operations/incident_management/paging.md
+++ b/doc/operations/incident_management/paging.md
@@ -23,14 +23,12 @@ you never miss a page.
## Email notifications
-Email notifications are available in projects that have been
-[configured to create incidents automatically](incidents.md#create-incidents-automatically)
-for triggered alerts. Project members with the **Owner** or **Maintainer** roles are
-sent an email notification automatically. (This is not configurable.) To optionally
-send additional email notifications to project members with the **Developer** role:
+Email notifications are available in projects for triggered alerts. Project
+members with the **Owner** or **Maintainer** roles have the option to receive
+a single email notification for new alerts.
1. Navigate to **Settings > Operations**.
1. Expand the **Incidents** section.
-1. In the **Alert Integration** tab, select the **Send a separate email notification to Developers**
- check box.
+1. In the **Alert Integration** tab, select the checkbox
+ **Send a single email notification to Owners and Maintainers for new alerts**.
1. Select **Save changes**.
diff --git a/doc/operations/incident_management/status_page.md b/doc/operations/incident_management/status_page.md
index fe0bfa3318b..46f0a6f278c 100644
--- a/doc/operations/incident_management/status_page.md
+++ b/doc/operations/incident_management/status_page.md
@@ -80,7 +80,7 @@ the necessary CI/CD variables to deploy the Status Page to AWS S3:
- `AWS_DEFAULT_REGION` - The AWS region.
- `AWS_ACCESS_KEY_ID` - The AWS access key ID.
- `AWS_SECRET_ACCESS_KEY` - The AWS secret.
-1. Navigate to **CI / CD > Pipelines > Run Pipeline**, and run the pipeline to
+1. Navigate to **CI/CD > Pipelines > Run Pipeline**, and run the pipeline to
deploy the Status Page to S3.
WARNING:
diff --git a/doc/operations/metrics/dashboards/variables.md b/doc/operations/metrics/dashboards/variables.md
index c0d0f65cc65..df2dd0939bb 100644
--- a/doc/operations/metrics/dashboards/variables.md
+++ b/doc/operations/metrics/dashboards/variables.md
@@ -16,7 +16,7 @@ Queries that continue to use the old format display no data.
## Predefined variables
-GitLab supports a limited set of [CI variables](../../../ci/variables/README.md)
+GitLab supports a limited set of [CI/CD variables](../../../ci/variables/README.md)
in the Prometheus query. This is particularly useful for identifying a specific
environment, for example with `ci_environment_slug`. Variables for Prometheus queries
must be lowercase. The supported variables are:
diff --git a/doc/operations/metrics/embed.md b/doc/operations/metrics/embed.md
index e5ab391afe5..87d84bfdfc0 100644
--- a/doc/operations/metrics/embed.md
+++ b/doc/operations/metrics/embed.md
@@ -4,10 +4,10 @@ group: Health
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Embedding metric charts within GitLab-flavored Markdown **(FREE)**
+# Embedding metric charts within GitLab Flavored Markdown **(FREE)**
You can display metrics charts within
-[GitLab Flavored Markdown](../../user/markdown.md#gitlab-flavored-markdown-gfm)
+[GitLab Flavored Markdown](../../user/markdown.md#gitlab-flavored-markdown)
fields such as issue or merge request descriptions. The maximum number of embedded
charts allowed in a GitLab Flavored Markdown field is 100.
Embedding charts is useful when sharing an application incident or performance
diff --git a/doc/operations/metrics/embed_grafana.md b/doc/operations/metrics/embed_grafana.md
index f9db3750bb9..2548e81813b 100644
--- a/doc/operations/metrics/embed_grafana.md
+++ b/doc/operations/metrics/embed_grafana.md
@@ -4,75 +4,76 @@ group: Health
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Embedding Grafana charts **(FREE)**
+# Embed Grafana panels in Markdown **(FREE)**
-Grafana metrics can be embedded in [GitLab Flavored Markdown](../../user/markdown.md).
+Grafana panels can be embedded in [GitLab Flavored Markdown](../../user/markdown.md). You can
+embed Grafana panels using either:
-## Embedding charts via Grafana rendered images
+- [Grafana-rendered images](#use-grafana-rendered-images).
+- [Grafana API](#use-integration-with-grafana-api).
-You can embed live [Grafana](https://docs.gitlab.com/omnibus/settings/grafana.html)
-charts in issues as a
-[direct linked rendered image](https://grafana.com/docs/grafana/latest/reference/share_panel/#direct-link-rendered-image). Your Grafana instance must be available to the
-target user, either as a public dashboard or on the same network. The
-**Direct link rendered image** sharing dialog within Grafana provides the link:
+## Use Grafana-rendered images
-![Grafana Direct Linked Rendered Image](img/grafana_live_embed.png)
+You can embed live [Grafana](https://docs.gitlab.com/omnibus/settings/grafana.html) panels as a
+[direct linked rendered image](https://grafana.com/docs/grafana/latest/reference/share_panel/#direct-link-rendered-image).
+Your Grafana instance must:
-For this embed to display correctly, the
+- Be available to the target user, either as a public dashboard or on the same network.
+- Have [Grafana Image Renderer](https://grafana.com/grafana/plugins/grafana-image-renderer) installed.
-Copy the link and add an image tag as [inline HTML](../../user/markdown.md#inline-html)
-in your Markdown. You can tweak the query parameters to meet your needs, such as
-removing the `&from=` and `&to=` parameters to display a live chart. Here is example
-markup for a live chart from a GitLab public dashboard:
+To use Grafana-rendered images:
-```html
-<img src="https://dashboards.gitlab.com/d/RZmbBr7mk/gitlab-triage?orgId=1&refresh=30s&var-env=gprd&var-environment=gprd&var-prometheus=prometheus-01-inf-gprd&var-prometheus_app=prometheus-app-01-inf-gprd&var-backend=All&var-type=All&var-stage=main&from=1580444107655&to=1580465707655"/>
-```
+1. Go to the dashboard containing the panel in Grafana.
+1. From the panel's menu, select **Share**.
+1. Select the **Direct link rendered image** button, which provides the link.
+1. Copy the link and add an image tag as [inline HTML](../../user/markdown.md#inline-html) in your
+ Markdown in the format `<img src="your_link"/>`. You can tweak the query parameters to meet your needs, such as removing the `&from=`
+ and `&to=` parameters to display a live panel.
-This markup renders a graph of `5xx` errors, like this:
-
-![Grafana dashboard embedded preview](img/grafana_embedded.png)
-
-## Embedding charts via integration with Grafana HTTP API
+## Use integration with Grafana API
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31376) in GitLab 12.5.
-Each project can support integration with one Grafana instance. This configuration
-enables you to copy a link to a panel in Grafana, then paste it into a GitLab Markdown
-field. The chart renders in the GitLab chart format. To embed charts
-from a Grafana instance, the data source must:
+Each project can support integration with one Grafana instance. This enables you to copy a link to a
+panel in Grafana, then paste it into a GitLab Markdown field. The panel renders in the GitLab panel
+format. To embed panels from a Grafana instance, the data source must be:
-1. Be a Prometheus instance.
-1. Be proxyable, so the HTTP Access setting should be set to `Server`:
+- A Prometheus instance.
+- Proxyable, so the **HTTP > Access** setting for the Grafana data source should be set to
+ **Server (default)**.
- ![HTTP Proxy Access](img/http_proxy_access_v12_5.png)
+### Set up Grafana integration
-## Setting up the Grafana integration
+To set up the Grafana API in Grafana:
1. In Grafana, [generate an Admin-level API Token](https://grafana.com/docs/grafana/latest/http_api/auth/#create-api-token).
-1. In your GitLab project, navigate to **Settings > Operations > Grafana Authentication**.
+1. In your GitLab project, go to **Settings > Operations** and expand the **Grafana authentication**
+ section.
1. To enable the integration, check the **Active** checkbox.
1. For **Grafana URL**, enter the base URL of the Grafana instance.
-1. For **API Token**, enter the Admin API Token you just generated.
+1. For **API Token**, enter the Admin API token you just generated.
1. Click **Save Changes**.
-## Generating a link to a chart
+### Generate a link to a panel
+
+To generate a link to a panel:
-1. In Grafana, navigate to the dashboard you wish to embed a panel from.
- ![Grafana Metric Panel](img/grafana_panel_v12_5.png)
-1. In the upper-left corner of the page, select a specific value for each variable
- required for the queries in the chart.
- ![Select Query Variables](img/select_query_variables_v12_5.png)
-1. In Grafana, click on a panel's title, then click **Share** to open the panel's
- sharing dialog to the **Link** tab. If you click the _dashboard's_ share panel
- instead, GitLab attempts to embed the first supported panel on the dashboard (if available).
+1. In Grafana, go to the dashboard you wish to embed a panel from.
+1. In the upper-left corner of the page, select a specific value for each variable required for the
+ queries in the dashboard.
+1. In Grafana click on a panel's title, then click **Share** to open the panel's sharing dialog to
+ the **Link** tab.
+
+ If you click the dashboard's share button instead, GitLab attempts to embed the first supported
+ panel on the dashboard (if available).
1. If your Prometheus queries use Grafana's custom template variables, ensure the
- **Template variables** option is toggled to **On**. Of Grafana global template
- variables, only `$__interval`, `$__from`, and `$__to` are supported.
-1. Toggle **On** the **Current time range** option to specify the time range of
- the chart. Otherwise, the default range is the last 8 hours.
- ![Grafana Sharing Dialog](img/grafana_sharing_dialog_v12_5.png)
-1. Click **Copy** to copy the URL to the clipboard.
-1. In GitLab, paste the URL into a Markdown field and save. The chart takes a few
- moments to render.
- ![GitLab Rendered Grafana Panel](img/rendered_grafana_embed_v12_5.png)
+ **Template variables** option is set to on. Only the Grafana global template variables
+ `$__interval`, `$__from`, and `$__to` are supported.
+1. Set the **Current time range** option to on, to specify the time range of the panel. Otherwise,
+ the default range is the last 8 hours.
+1. Select **Copy** to copy the URL to the clipboard.
+1. In GitLab, paste the URL into a Markdown field and save. The panel takes a few moments to render.
+
+See the following example of a rendered panel.
+
+![GitLab Rendered Grafana Panel](img/rendered_grafana_embed_v12_5.png)
diff --git a/doc/operations/metrics/img/grafana_embedded.png b/doc/operations/metrics/img/grafana_embedded.png
deleted file mode 100644
index c7946aa4b10..00000000000
--- a/doc/operations/metrics/img/grafana_embedded.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/metrics/img/grafana_live_embed.png b/doc/operations/metrics/img/grafana_live_embed.png
deleted file mode 100644
index 91970cd379a..00000000000
--- a/doc/operations/metrics/img/grafana_live_embed.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/metrics/img/grafana_panel_v12_5.png b/doc/operations/metrics/img/grafana_panel_v12_5.png
deleted file mode 100644
index 18c17b910cd..00000000000
--- a/doc/operations/metrics/img/grafana_panel_v12_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/metrics/img/grafana_sharing_dialog_v12_5.png b/doc/operations/metrics/img/grafana_sharing_dialog_v12_5.png
deleted file mode 100644
index fae62dd50df..00000000000
--- a/doc/operations/metrics/img/grafana_sharing_dialog_v12_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/metrics/img/http_proxy_access_v12_5.png b/doc/operations/metrics/img/http_proxy_access_v12_5.png
deleted file mode 100644
index 0036a916a12..00000000000
--- a/doc/operations/metrics/img/http_proxy_access_v12_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/metrics/img/select_query_variables_v12_5.png b/doc/operations/metrics/img/select_query_variables_v12_5.png
deleted file mode 100644
index 23503577327..00000000000
--- a/doc/operations/metrics/img/select_query_variables_v12_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index 20131a795c5..48fa847e170 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -1,6 +1,6 @@
---
stage: Enablement
-group: Distribution
+group: Geo
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -629,7 +629,7 @@ directory that you want to copy the tarballs to is the root of your mounted
directory, use `.` instead.
Because file system performance may affect overall GitLab performance,
-[GitLab doesn't recommend using EFS for storage](../administration/nfs.md#avoid-using-awss-elastic-file-system-efs).
+[GitLab doesn't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
For Omnibus GitLab packages:
@@ -1017,7 +1017,7 @@ issue.
The GitLab Helm chart uses a different process, documented in
[restoring a GitLab Helm chart installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/restore.md).
-### Restoring only one or a few project(s) or group(s) from a backup
+### Restoring only one or a few projects or groups from a backup
Although the Rake task used to restore a GitLab instance doesn't support
restoring a single project or group, you can use a workaround by restoring
diff --git a/doc/raketasks/index.md b/doc/raketasks/index.md
index be7e55cba9b..ab0505f065e 100644
--- a/doc/raketasks/index.md
+++ b/doc/raketasks/index.md
@@ -42,7 +42,7 @@ The following are available Rake tasks:
| [Repository storage](../administration/raketasks/storage.md) | List and migrate existing projects and attachments from legacy storage to hashed storage. |
| [Uploads migrate](../administration/raketasks/uploads/migrate.md) | Migrate uploads between storage local and object storage. |
| [Uploads sanitize](../administration/raketasks/uploads/sanitize.md) | Remove EXIF data from images uploaded to earlier versions of GitLab. |
-| [Usage data](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping) | Generate and troubleshoot [Usage Ping](../development/usage_ping.md).|
+| [Usage data](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping) | Generate and troubleshoot [Usage Ping](../development/usage_ping/index.md).|
| [User management](user_management.md) | Perform user management tasks. |
| [Webhooks administration](web_hooks.md) | Maintain project Webhooks. |
| [X.509 signatures](x509_signatures.md) | Update X.509 commit signatures, useful if certificate store has changed. |
diff --git a/doc/security/README.md b/doc/security/README.md
index b009fe5c8da..9b9d4f030ac 100644
--- a/doc/security/README.md
+++ b/doc/security/README.md
@@ -24,6 +24,7 @@ type: index
- [Security of running jobs](https://docs.gitlab.com/runner/security/)
- [Proxying images](asset_proxy.md)
- [CI/CD variables](cicd_variables.md)
+- [Token overview](token_overview.md)
## Securing your GitLab installation
diff --git a/doc/security/token_overview.md b/doc/security/token_overview.md
new file mode 100644
index 00000000000..2bb4ffa8eec
--- /dev/null
+++ b/doc/security/token_overview.md
@@ -0,0 +1,108 @@
+---
+stage: Manage
+group: Access
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# GitLab Token overview
+
+This document lists tokens used in GitLab, their purpose and, where applicable, security guidance.
+
+## Personal access tokens
+
+You can create [Personal access tokens](../user/profile/personal_access_tokens.md) to authenticate with:
+
+- The GitLab API.
+- GitLab repositories.
+- The GitLab registry.
+
+You can limit the scope and expiration date of your personal access tokens. By default,
+they inherit permissions from the user who created them.
+
+## OAuth2 tokens
+
+GitLab can serve as an [OAuth2 provider](../api/oauth2.md) to allow other services to access the GitLab API on a user’s behalf.
+
+You can limit the scope and lifetime of your OAuth2 tokens.
+
+## Impersonation tokens
+
+An [Impersonation token](../api/README.md#impersonation-tokens) is a special type of personal access
+token. It can be created only by an administrator for a specific user. Impersonation tokens can
+help you build applications or scripts that authenticate with the GitLab API, repositories, and the GitLab registry as a specific user.
+
+You can limit the scope and set an expiration date for an impersonation token.
+
+## Project access tokens
+
+[Project access tokens](../user/project/settings/project_access_tokens.md#project-access-tokens)
+are scoped to a project. As with [Personal access tokens](#personal-access-tokens), you can use them to authenticate with:
+
+- The GitLab API.
+- GitLab repositories.
+- The GitLab registry.
+
+You can limit the scope and expiration date of project access tokens. When you
+create a project access token, GitLab creates a [project bot user](../user/project/settings/project_access_tokens.md#project-bot-users). Project
+bot users are service accounts and do not count as licensed seats.
+
+## Deploy tokens
+
+[Deploy tokens](../user/project/deploy_tokens/index.md) allow you to download (`git clone`) or push and pull packages and container registry images of a project without having a user and a password. Deploy tokens cannot be used with the GitLab API.
+
+Deploy tokens can be managed by project maintainers and owners.
+
+## Deploy keys
+
+[Deploy keys](../user/project/deploy_keys/index.md) allow read-only or read-write access to your repositories by importing an SSH public key into your GitLab instance. Deploy keys cannot be used with the GitLab API or the registry.
+
+This is useful, for example, for cloning repositories to your Continuous Integration (CI) server. By using deploy keys, you don’t have to set up a fake user account.
+
+Project maintainers and owners can add or enable a deploy key for a project repository
+
+## Runner registration tokens
+
+Runner registration tokens are used to [register](https://docs.gitlab.com/runner/register/) a [runner](https://docs.gitlab.com/runner/) with GitLab. Group or project owners or instance admins can obtain them through the GitLab user interface. The registration token is limited to runner registration and has no further scope.
+
+You can use the runner registration token to add runners that execute jobs in a project or group. The runner has access to the project’s code, so be careful when assigning project and group-level permissions.
+
+## Runner authentication tokens (also called runner tokens)
+
+After registration, the runner receives an authentication token, which it uses to authenticate with GitLab when picking up jobs from the job queue. The authentication token is stored locally in the runner's [`config.toml`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html) file.
+
+After authentication with GitLab, the runner receives a [job token](../user/project/new_ci_build_permissions_model.md#job-token), which it uses to execute the job.
+
+In case of Docker Machine/Kubernetes/VirtualBox/Parallels/SSH executors, the execution environment has no access to the runner authentication token, because it stays on the runner machine. They have access to the job token only, which is needed to execute the job.
+
+Malicious access to a runner's file system may expose the `config.toml` file and thus the authentication token, allowing an attacker to [clone the runner](https://docs.gitlab.com/runner/security/#cloning-a-runner).
+
+## CI/CD job tokens
+
+The [CI/CD](../api/README.md#gitlab-ci-job-token) job token
+is a short lived token only valid for the duration of a job. It gives a CI/CD job
+access to a limited amount of [API endpoints](../api/README.md#gitlab-ci-job-token).
+API authentication uses the job token, by using the authorization of the user
+triggering the job.
+
+The job token is secured by its short life-time and limited scope. It could possibly be leaked if multiple jobs run on the same machine ([like with the shell runner](https://docs.gitlab.com/runner/security/#usage-of-shell-executor)). On Docker Machine runners, configuring [`MaxBuilds=1`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersmachine-section) is recommended to make sure runner machines only ever run one build and are destroyed afterwards. This may impact performance, as provisioning machines takes some time.
+
+## Available scopes
+
+This table shows available scopes per token. Scopes can be limited further on token creation.
+
+| | API access | Registry access | Repository access |
+|-----------------------------|------------|-----------------|-------------------|
+| Personal access token | ✅ | ✅ | ✅ |
+| OAuth2 token | ✅ | 🚫 | ✅ |
+| Impersonation token | ✅ | ✅ | ✅ |
+| Project access token | ✅(1) | ✅(1) | ✅(1) |
+| Deploy token | 🚫 | ✅ | ✅ |
+| Deploy key | 🚫 | 🚫 | ✅ |
+| Runner registration token | 🚫 | 🚫 | ✴️(2) |
+| Runner authentication token | 🚫 | 🚫 | ✴️(2) |
+| Job token | ✴️(3) | 🚫 | ✅ |
+
+1. Limited to the one project.
+1. Runner registration and authentication token don't provide direct access to repositories, but can be used to register and authenticate a new runner that may execute jobs which do have access to the repository
+1. Limited to certain [endpoints](../api/README.md#gitlab-ci-job-token).
diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md
index 7a9ed9d435d..1abd4502eb5 100644
--- a/doc/security/two_factor_authentication.md
+++ b/doc/security/two_factor_authentication.md
@@ -61,7 +61,7 @@ The following are important notes about 2FA:
2FA for the project. For example, if project *P* belongs to 2FA-enabled group *A* and
is shared with 2FA-disabled group *B*, members of group *B* can access project *P*
without 2FA. To ensure this scenario doesn't occur,
- [prevent sharing of projects](../user/group/index.md#share-with-group-lock)
+ [prevent sharing of projects](../user/group/index.md#prevent-a-project-from-being-shared-with-groups)
for the 2FA-enabled group.
- If you add additional members to a project within a group or subgroup that has
2FA enabled, 2FA is **not** required for those individually added members.
@@ -129,8 +129,15 @@ verification can be done via a GitLab Shell command:
ssh git@<hostname> 2fa_verify
```
-Once the OTP is verified, Git over SSH operations can be used for 15 minutes
-with the associated SSH key.
+Once the OTP is verified, Git over SSH operations can be used for a session duration of
+15 minutes (default) with the associated SSH key.
+
+### Security limitation
+
+2FA does not protect users with compromised *private* SSH keys.
+
+Once an OTP is verified, anyone can run Git over SSH with that private SSH key for
+the configured [session duration](../user/admin_area/settings/account_and_limit_settings.md#customize-session-duration-for-git-operations-when-2fa-is-enabled).
### Enable or disable Two-factor Authentication (2FA) for Git operations
diff --git a/doc/ssh/README.md b/doc/ssh/README.md
index 815d8c13c43..11ab991a7f3 100644
--- a/doc/ssh/README.md
+++ b/doc/ssh/README.md
@@ -7,19 +7,12 @@ type: howto, reference
# GitLab and SSH keys
-Git is a distributed version control system, which means you can work locally.
-In addition, you can also share or "push" your changes to other servers.
-GitLab supports secure communication between Git and its servers using SSH keys.
+Git is a distributed version control system, which means you can work locally,
+then share or "push" your changes to a server. In this case, the server is GitLab.
-The SSH protocol provides this security and allows you to authenticate to the
-GitLab remote server without supplying your username or password each time.
-
-This page can help you configure secure SSH keys which you can use to help secure
-connections to GitLab repositories.
-
-- If you need information on creating SSH keys, start with our [options for SSH keys](#supported-ssh-key-types).
-- If you have SSH keys dedicated for your GitLab account, you may be interested in [Working with non-default SSH key pair paths](#working-with-non-default-ssh-key-pair-paths).
-- If you already have an SSH key pair, you can go to how you can [add an SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account).
+GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
## Prerequisites
@@ -31,7 +24,7 @@ To use SSH to communicate with GitLab, you need:
To view the version of SSH installed on your system, run `ssh -V`.
GitLab does [not support installation on Microsoft Windows](../install/requirements.md#microsoft-windows),
-but you can set up SSH keys on the Windows [client](#options-for-microsoft-windows).
+but you can set up SSH keys on the Windows [client](#use-ssh-on-microsoft-windows).
## Supported SSH key types
@@ -84,7 +77,7 @@ If you do not have an existing SSH key pair, generate a new one.
1. Type `ssh-keygen -t` followed by the key type and an optional comment.
This comment is included in the `.pub` file that's created.
You may want to use an email address for the comment.
-
+
For example, for ED25519:
```shell
@@ -104,10 +97,10 @@ If you do not have an existing SSH key pair, generate a new one.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
```
-1. Accept the suggested filename and directory, unless you are generating a [deploy key](#deploy-keys)
+1. Accept the suggested filename and directory, unless you are generating a [deploy key](../user/project/deploy_keys/index.md)
or want to save in a specific directory where you store other keys.
- You can also dedicate the SSH key pair to a [specific host](#working-with-non-default-ssh-key-pair-paths).
+ You can also dedicate the SSH key pair to a [specific host](#configure-ssh-to-point-to-a-different-directory).
1. Specify a [passphrase](https://www.ssh.com/ssh/passphrase/):
@@ -118,15 +111,47 @@ If you do not have an existing SSH key pair, generate a new one.
1. A confirmation is displayed, including information about where your files are stored.
-A public and private key are generated.
+A public and private key are generated.
[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep
the private key secure.
+### Configure SSH to point to a different directory
+
+If you did not save your SSH key pair in the default directory,
+configure your SSH client to point to the directory where the private key is stored.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ eval $(ssh-agent -s)
+ ssh-add <directory to private SSH key>
+ ```
+
+1. Save these settings in the `~/.ssh/config` file. For example:
+
+ ```conf
+ # GitLab.com
+ Host gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/gitlab_com_rsa
+
+ # Private GitLab instance
+ Host gitlab.company.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/example_com_rsa
+ ```
+
+ For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
+
+Public SSH keys must be unique to GitLab because they bind to your account.
+Your SSH key is the only identifier you have when you push code with SSH.
+It must uniquely map to a single user.
+
### Update your SSH key passphrase
You can update the passphrase for your SSH key.
-1. Open a terminal and type this command:
+1. Open a terminal and run this command:
```shell
ssh-keygen -p -f /path/to/ssh_key
@@ -140,7 +165,7 @@ If your version of OpenSSH is between 6.5 and 7.8,
you can save your private RSA SSH keys in a more secure
OpenSSH format.
-1. Open a terminal and type this command:
+1. Open a terminal and run this command:
```shell
ssh-keygen -o -f ~/.ssh/id_rsa
@@ -155,19 +180,18 @@ OpenSSH format.
## Add an SSH key to your GitLab account
-Now you can copy the SSH key you created to your GitLab account.
+To use SSH with GitLab, copy your public key to your GitLab account.
-1. Copy your **public** SSH key to a location that saves information in text format.
- The following options saves information for ED25519 keys to the clipboard
- for the noted operating system:
+1. Copy the contents of your public key file. You can do this manually or use a script.
+ For example, to copy an ED25519 key to the clipboard:
**macOS:**
```shell
- pbcopy < ~/.ssh/id_ed25519.pub
+ tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
```
- **Linux (requires the `xclip` package):**
+ **Linux** (requires the `xclip` package):
```shell
xclip -sel clip < ~/.ssh/id_ed25519.pub
@@ -179,128 +203,83 @@ Now you can copy the SSH key you created to your GitLab account.
cat ~/.ssh/id_ed25519.pub | clip
```
- If you're using an RSA key, substitute accordingly.
+ Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA.
-1. Navigate to `https://gitlab.com` or your local GitLab instance URL and sign in.
-1. In the top-right corner, select your avatar.
-1. Select **Edit profile**.
-1. In the left sidebar, select **SSH Keys**.
-1. Paste the public key that you copied into the **Key** text box.
-1. Make sure your key includes a descriptive name in the **Title** text box, such as _Work Laptop_ or
+1. Sign in to GitLab.
+1. In the top right corner, select your avatar.
+1. Select **Settings**.
+1. From the left sidebar, select **SSH Keys**.
+1. In the **Key** box, paste the contents of your public key.
+ If you manually copied the key, make sure you copy the entire key,
+ which starts with `ssh-ed25519` or `ssh-rsa`, and may end with a comment.
+1. In the **Title** text box, type a description, like _Work Laptop_ or
_Home Workstation_.
-1. Include an (optional) expiry date for the key under "Expires at" section. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
-1. Click the **Add key** button.
-
-SSH keys that have "expired" using this procedure are valid in GitLab workflows.
-As the GitLab-configured expiration date is not included in the SSH key itself,
-you can still export public SSH keys as needed.
-
-NOTE:
-If you manually copied your public SSH key make sure you copied the entire
-key starting with `ssh-ed25519` (or `ssh-rsa`) and ending with your email address.
+1. Optional. In the **Expires at** box, select an expiration date. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
+ The expiration date is informational only, and does not prevent you from using
+ the key. However, administrators can view expiration dates and
+ use them for guidance when [deleting keys](../user/admin_area/credentials_inventory.md#delete-a-users-ssh-key).
+1. Select **Add key**.
-## Two-factor Authentication (2FA)
+## Verify that you can connect
-You can set up two-factor authentication (2FA) for
-[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
+Verify that your SSH key was added correctly.
-## Testing that everything is set up correctly
+1. For GitLab.com, to ensure you're connecting to the correct server, confirm the
+ [SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints).
+1. Open a terminal and run this command, replacing `gitlab.example.com` with your GitLab instance URL:
-To test whether your SSH key was added correctly, run the following
-command in your terminal (replace `gitlab.com` with the domain of
-your GitLab instance):
-
-```shell
-ssh -T git@gitlab.com
-```
-
-The first time you connect to GitLab via SSH, you should verify the
-authenticity of the GitLab host that you're connecting to.
-For example, when connecting to GitLab.com, answer `yes` to add GitLab.com to
-the list of trusted hosts:
-
-```plaintext
-The authenticity of host 'gitlab.com (35.231.145.151)' can't be established.
-ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
-Are you sure you want to continue connecting (yes/no)? yes
-Warning: Permanently added 'gitlab.com' (ECDSA) to the list of known hosts.
-```
-
-NOTE:
-For GitLab.com, consult the
-[SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints),
-section to make sure you're connecting to the correct server. For example, you can see
-the ECDSA key fingerprint shown above in the linked section.
-
-Once added to the list of known hosts, you should validate the
-authenticity of the GitLab host, once again. Run the above command
-again, and you should receive a _Welcome to GitLab, `@username`!_ message.
+ ```shell
+ ssh -T git@gitlab.example.com
+ ```
-If the welcome message doesn't appear, you can troubleshoot the problem by running `ssh`
-in verbose mode with the following command:
+1. If this is the first time you connect, you should verify the
+ authenticity of the GitLab host. If you see a message like:
-```shell
-ssh -Tvvv git@gitlab.com
-```
+ ```plaintext
+ The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established.
+ ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
+ Are you sure you want to continue connecting (yes/no)? yes
+ Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
+ ```
-## Working with non-default SSH key pair paths
+ Type `yes` and press Enter.
-If you used a non-default file path for your GitLab SSH key pair,
-configure your SSH client to point to your GitLab private SSH key.
+1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
-To make these changes, run the following commands:
+If the welcome message doesn't appear, you can troubleshoot by running `ssh`
+in verbose mode:
```shell
-eval $(ssh-agent -s)
-ssh-add <path to private SSH key>
-```
-
-Now save these settings to the `~/.ssh/config` file. Two examples
-for SSH keys dedicated to GitLab are shown here:
-
-```conf
-# GitLab.com
-Host gitlab.com
- Preferredauthentications publickey
- IdentityFile ~/.ssh/gitlab_com_rsa
-
-# Private GitLab instance
-Host gitlab.company.com
- Preferredauthentications publickey
- IdentityFile ~/.ssh/example_com_rsa
+ssh -Tvvv git@gitlab.example.com
```
-Public SSH keys need to be unique to GitLab, as they bind to your account.
-Your SSH key is the only identifier you have when pushing code via SSH,
-that's why it needs to uniquely map to a single user.
+## Use different keys for different repositories
-## Per-repository SSH keys
+You can use a different key for each repository.
-If you want to use different keys depending on the repository you are working
-on, you can issue the following command while inside your repository:
+Open a terminal and run this command:
```shell
git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
```
-This does not use the SSH Agent and requires at least Git 2.10.
+This command does not use the SSH Agent and requires Git 2.10 or later. For more information
+on `ssh` command options, see the `man` pages for both `ssh` and `ssh_config`.
-## Multiple accounts on a single GitLab instance
+## Use different accounts on a single GitLab instance
-The [per-repository](#per-repository-ssh-keys) method also works for using
-multiple accounts within a single GitLab instance.
+You can use multiple accounts to connect to a single instance of GitLab.
+You can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
+However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an `IdentityFile` exists
+outside of a `Host` block.
-Alternatively, it is possible to directly assign aliases to hosts in
-`~.ssh/config`. SSH and, by extension, Git fails to log in if there is
-an `IdentityFile` set outside of a `Host` block in `.ssh/config`. This is
-due to how SSH assembles `IdentityFile` entries and is not changed by
-setting `IdentitiesOnly` to `yes`. `IdentityFile` entries should point to
-the private key of an SSH key pair.
+Instead, you can assign aliases to hosts in the `~.ssh/config` file.
-NOTE:
-Private and public keys should be readable by the user only. Accomplish this
-on Linux and macOS by running: `chmod 0400 ~/.ssh/<example_ssh_key>` and
-`chmod 0400 ~/.ssh/<example_sh_key.pub>`.
+- For the `Host`, use an alias like `user_1.gitlab.com` and
+ `user_2.gitlab.com`. Advanced configurations
+ are more difficult to maintain, and these strings are easier to
+ understand when you use tools like `git remote`.
+- For the `IdentityFile`, use the path the private key.
```conf
# User1 Account Identity
@@ -316,59 +295,60 @@ Host <user_2.gitlab.com>
IdentityFile ~/.ssh/<example_ssh_key2>
```
-NOTE:
-The example `Host` aliases are defined as `user_1.gitlab.com` and
-`user_2.gitlab.com` for efficiency and transparency. Advanced configurations
-are more difficult to maintain; using this type of alias makes it easier to
-understand when using other tools such as `git remote` sub-commands. SSH
-would understand any string as a `Host` alias thus `Tanuki1` and `Tanuki2`,
-despite giving very little context as to where they point, would also work.
-
-Cloning the `gitlab` repository normally looks like this:
-
-```shell
-git clone git@gitlab.com:gitlab-org/gitlab.git
-```
-
-To clone it for `user_1`, replace `gitlab.com` with the SSH alias `user_1.gitlab.com`:
+Now, to clone a repository for `user_1`, use `user_1.gitlab.com` in the `git clone` command:
```shell
git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
```
-Fix a previously cloned repository using the `git remote` command.
-
-The example below assumes the remote repository is aliased as `origin`.
+To update a previously-cloned repository that is aliased as `origin`:
```shell
git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
```
-## Deploy keys
+NOTE:
+Private and public keys contain sensitive data. Ensure the permissions
+on the files make them readable to you but not accessible to others.
-Read the [documentation on deploy keys](../user/project/deploy_keys/index.md).
+## Configure two-factor authentication (2FA)
-## Applications
+You can set up two-factor authentication (2FA) for
+[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
-### Eclipse
+## Use EGit on Eclipse
If you are using [EGit](https://www.eclipse.org/egit/), you can [add your SSH key to Eclipse](https://wiki.eclipse.org/EGit/User_Guide#Eclipse_SSH_Configuration).
-## SSH on the GitLab server
+## Use SSH on Microsoft Windows
+
+If you're running Windows 10, you can use the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
+with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2).
+You can use WSL to install Linux distributions, which include the Git and SSH clients.
-GitLab integrates with the system-installed SSH daemon, designating a user
+For other versions of Windows, you can install the Git and SSH clients by using
+[Git for Windows](https://gitforwindows.org).
+
+Alternative tools include:
+
+- [Cygwin](https://www.cygwin.com)
+- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+
+## Overriding SSH settings on the GitLab server
+
+GitLab integrates with the system-installed SSH daemon and designates a user
(typically named `git`) through which all access requests are handled. Users
-connecting to the GitLab server over SSH are identified by their SSH key instead
+who connect to the GitLab server over SSH are identified by their SSH key instead
of their username.
SSH *client* operations performed on the GitLab server are executed as this
-user. Although it is possible to modify the SSH configuration for this user to,
-e.g., provide a private SSH key to authenticate these requests by, this practice
+user. You can modify this SSH configuration. For example, you can specify
+a private SSH key for this user to use for authentication requests. However, this practice
is **not supported** and is strongly discouraged as it presents significant
security risks.
-The GitLab check process includes a check for this condition, and directs you
-to this section if your server is configured like this, for example:
+GitLab checks for this condition, and directs you
+to this section if your server is configured this way. For example:
```shell
$ gitlab-rake gitlab:check
@@ -379,34 +359,20 @@ Git user has default SSH configuration? ... no
sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
For more information see:
- doc/ssh/README.md in section "SSH on the GitLab server"
+ [Overriding SSH settings on the GitLab server](#overriding-ssh-settings-on-the-gitlab-server)
Please fix the error above and rerun the checks.
```
-Remove the custom configuration as soon as you're able to. These customizations
-are *explicitly not supported* and may stop working at any time.
-
-### Options for Microsoft Windows
-
-If you're running Windows 10, the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10), and its latest [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2) version,
-support the installation of different Linux distributions, which include the Git and SSH clients.
-
-For current versions of Windows, you can also install the Git and SSH clients with
-[Git for Windows](https://gitforwindows.org).
-
-Alternative tools include:
-
-- [Cygwin](https://www.cygwin.com)
-- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+Remove the custom configuration as soon as you can. These customizations
+are **explicitly not supported** and may stop working at any time.
-## Troubleshooting
+## Troubleshooting SSH connections
-If on Git clone you are prompted for a password like `git@gitlab.com's password:`
-something is wrong with your SSH setup.
+When you run `git clone`, you may be prompted for a password, like `git@gitlab.example.com's password:`.
+This indicates that something is wrong with your SSH setup.
- Ensure that you generated your SSH key pair correctly and added the public SSH
- key to your GitLab profile
-- Try manually registering your private SSH key using `ssh-agent` as documented
- earlier in this document
-- Try to debug the connection by running `ssh -Tv git@example.com`
- (replacing `example.com` with your GitLab domain)
+ key to your GitLab profile.
+- Try to manually register your private SSH key by using `ssh-agent`.
+- Try to debug the connection by running `ssh -Tv git@example.com`.
+ Replace `example.com` with your GitLab URL.
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 8b223953007..303f734bc24 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -20,15 +20,15 @@ the tiers are no longer mentioned in GitLab documentation:
[per-group charts](../user/project/milestones/index.md#group-burndown-charts)
- [Code owners](../user/project/code_owners.md)
- Description templates:
- - [Setting a default template for merge requests and issues](../user/project/description_templates.md#setting-a-default-template-for-merge-requests-and-issues)
+ - [Setting a default template for merge requests and issues](../user/project/description_templates.md#set-a-default-template-for-merge-requests-and-issues)
- [Email from GitLab](../tools/email.md)
- Groups:
- - [Creating group memberships via CN](../user/group/index.md#creating-group-links-via-cn)
+ - [Creating group memberships via CN](../user/group/index.md#create-group-links-via-cn)
- [Group push rules](../user/group/index.md#group-push-rules)
- [Managing group memberships via LDAP](../user/group/index.md#manage-group-memberships-via-ldap)
- - [Member locking](../user/group/index.md#member-lock)
- - [Overriding user permissions](../user/group/index.md#overriding-user-permissions)
- - [User contribution analysis](../user/group/index.md#user-contribution-analysis)
+ - [Member locking](../user/group/index.md#prevent-members-from-being-added-to-a-group)
+ - [Overriding user permissions](../user/group/index.md#override-user-permissions)
+ - [User contribution analytics](../user/group/contribution_analytics/index.md)
- [Kerberos integration](../integration/kerberos.md)
- Issue Boards:
- [Configurable issue boards](../user/project/issue_board.md#configurable-issue-boards)
@@ -107,8 +107,7 @@ the tiers are no longer mentioned in GitLab documentation:
- Search:
- [Filtering merge requests by approvers](../user/search/index.md#filtering-merge-requests-by-approvers)
- [Filtering merge requests by "approved by"](../user/search/index.md#filtering-merge-requests-by-approved-by)
- - [Advanced Global Search (Elasticsearch)](../user/search/advanced_global_search.md)
- - [Advanced Search Syntax](../user/search/advanced_search_syntax.md)
+ - [Advanced Search (Elasticsearch)](../user/search/advanced_search.md)
- [Service Desk](../user/project/service_desk.md)
- [Storage usage statistics](../user/usage_quotas.md#storage-usage-statistics)
@@ -130,7 +129,7 @@ Bronze-level subscribers:
- [Group iterations API](../api/group_iterations.md)
- Project milestones API: [Get all burndown chart events for a single milestone](../api/milestones.md#get-all-burndown-chart-events-for-a-single-milestone)
- [Project iterations API](../api/iterations.md)
- - Fields in the [Search API](../api/search.md) available only to [Advanced Global Search (Elasticsearch)](../integration/elasticsearch.md) users
+ - Fields in the [Search API](../api/search.md) available only to [Advanced Search (Elasticsearch)](../integration/elasticsearch.md) users
- Fields in the [Merge requests API](../api/merge_requests.md) for [merge request approvals](../user/project/merge_requests/merge_request_approvals.md)
- Fields in the [Protected branches API](../api/protected_branches.md) that specify users or groups allowed to merge
- [Merge request approvals API](../api/merge_request_approvals.md)
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index b7a1243be72..5aa5a06021c 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -37,7 +37,9 @@ Every occupied seat is counted in the subscription, with the following exception
NOTE:
To support the open source community and encourage the development of open
source projects, GitLab grants access to **Ultimate** features for all GitLab SaaS
-**public** projects, regardless of the subscription.
+**public** projects, regardless of the subscription. GitLab also provides qualifying
+open source projects with 50,000 CI minutes and free access to the Ultimate tier for
+groups through the [GitLab for Open Source program](https://about.gitlab.com/solutions/open-source/).
## Obtain a GitLab SaaS subscription
@@ -93,7 +95,7 @@ The **Seat usage** page lists all users occupying seats. Details for each user i
- Full name
- Username
-- Public email address (if they have provided one in their [user settings](../../user/profile/index.md#user-settings))
+- Public email address (if they have provided one in their [user settings](../../user/profile/index.md#access-your-user-settings))
The Seat usage listing is updated live, but the usage statistics on the billing page are updated
only once per day. For this reason there can be a minor difference between the seat usage listing
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index b7f2a0768ef..7dcecb9af1e 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -17,7 +17,7 @@ staging and canary deployments,
## Custom buildpacks
If the automatic buildpack detection fails for your project, or if you want to
-use a custom buildpack, you can override the buildpack using a project variable
+use a custom buildpack, you can override the buildpack using a project CI/CD variable
or a `.buildpacks` file in your project:
- **Project variable** - Create a project variable `BUILDPACK_URL` with the URL
@@ -43,7 +43,7 @@ can't use the `.buildpacks` file. The buildpack
in the backend to parse the `.buildpacks` file, does not provide the necessary commands
`bin/test-compile` and `bin/test`.
-If your goal is to use only a single custom buildpack, you should provide the project variable
+If your goal is to use only a single custom buildpack, you should provide the project CI/CD variable
`BUILDPACK_URL` instead.
## Custom `Dockerfile`
@@ -55,13 +55,13 @@ builds a Docker image based on the Dockerfile, rather than using buildpacks.
This can be much faster and result in smaller images, especially if your
Dockerfile is based on [Alpine](https://hub.docker.com/_/alpine/).
-If you set the `DOCKERFILE_PATH` CI variable, Auto Build looks for a Dockerfile there
+If you set the `DOCKERFILE_PATH` CI/CD variable, Auto Build looks for a Dockerfile there
instead.
## Passing arguments to `docker build`
Arguments can be passed to the `docker build` command using the
-`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project variable. For example, to build a
+`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project CI/CD variable. For example, to build a
Docker image based on based on the `ruby:alpine` instead of the default `ruby:latest`:
1. Set `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` to `--build-arg=RUBY_VERSION=alpine`.
@@ -93,12 +93,12 @@ You can extend and manage your Auto DevOps configuration with GitLab APIs:
- [Editing groups](../../api/groups.md#update-group).
- [Editing projects](../../api/projects.md#edit-project).
-## Forward CI variables to the build environment
+## Forward CI/CD variables to the build environment
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25514) in GitLab 12.3, but available in versions 11.9 and above.
-CI variables can be forwarded into the build environment using the
-`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI variable.
+CI/CD variables can be forwarded into the build environment using the
+`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI/CD variable.
The forwarded variables should be specified by name in a comma-separated
list. For example, to forward the variables `CI_COMMIT_SHA` and
`CI_ENVIRONMENT_NAME`, set `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES`
@@ -130,7 +130,7 @@ feature to use the `--secret` flag.
Auto DevOps uses [Helm](https://helm.sh/) to deploy your application to Kubernetes.
You can override the Helm chart used by bundling up a chart into your project
-repository or by specifying a project variable:
+repository or by specifying a project CI/CD variable:
- **Bundled chart** - If your project has a `./chart` directory with a `Chart.yaml`
file in it, Auto DevOps detects the chart and uses it instead of the
@@ -151,17 +151,17 @@ You can override the default values in the `values.yaml` file in the
- Adding a file named `.gitlab/auto-deploy-values.yaml` to your repository, which is
automatically used, if found.
- Adding a file with a different name or path to the repository, and setting the
- `HELM_UPGRADE_VALUES_FILE` [environment variable](#environment-variables) with
+ `HELM_UPGRADE_VALUES_FILE` [CI/CD variable](#cicd-variables) with
the path and name.
NOTE:
-For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` environment variable
+For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` variable
to override the default chart values by setting `HELM_UPGRADE_EXTRA_ARGS` to `--values <my-values.yaml>`.
## Customize the `helm upgrade` command
You can customize the `helm upgrade` command used in the [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image)
-by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` variable.
+by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` CI/CD variable.
For example, set the value of `HELM_UPGRADE_EXTRA_ARGS` to `--no-hooks` to disable
pre-upgrade and post-upgrade hooks when the command is executed.
@@ -170,7 +170,7 @@ list of options.
## Custom Helm chart per environment
-You can specify the use of a custom Helm chart per environment by scoping the environment variable
+You can specify the use of a custom Helm chart per environment by scoping the CI/CD variable
to the desired environment. See [Limiting environment scopes of variables](../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables).
## Customizing `.gitlab-ci.yml`
@@ -204,7 +204,7 @@ into your project and edit it as needed.
For clusters not managed by GitLab, you can customize the namespace in
`.gitlab-ci.yml` by specifying
-[`environment:kubernetes:namespace`](../../ci/environments/index.md#configuring-kubernetes-deployments).
+[`environment:kubernetes:namespace`](../../ci/environments/index.md#configure-kubernetes-deployments).
For example, the following configuration overrides the namespace used for
`production` deployments:
@@ -260,7 +260,7 @@ the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12
To support applications requiring a database,
[PostgreSQL](https://www.postgresql.org/) is provisioned by default. The credentials to access
the database are preconfigured, but can be customized by setting the associated
-[variables](#environment-variables). You can use these credentials to define a `DATABASE_URL`:
+[CI/CD variables](#cicd-variables). You can use these credentials to define a `DATABASE_URL`:
```yaml
postgres://user:password@postgres-host:postgres-port/postgres-database
@@ -269,7 +269,7 @@ postgres://user:password@postgres-host:postgres-port/postgres-database
### Upgrading PostgresSQL
WARNING:
-The variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
+The CI/CD variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
PostgreSQL was changed to `2` in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/210499).
To keep using the old PostgreSQL, set the `AUTO_DEVOPS_POSTGRES_CHANNEL` variable to
`1`.
@@ -290,17 +290,17 @@ production environments, for some use cases, it may not be sufficiently secure o
resilient, and you may want to use an external managed provider (such as
AWS Relational Database Service) for PostgreSQL.
-You must define environment-scoped variables for `POSTGRES_ENABLED` and
+You must define environment-scoped CI/CD variables for `POSTGRES_ENABLED` and
`DATABASE_URL` in your project's CI/CD settings:
1. Disable the built-in PostgreSQL installation for the required environments using
- scoped [environment variables](../../ci/environments/index.md#scoping-environments-with-specs).
+ environment-scoped [CI/CD variables](../../ci/environments/index.md#scoping-environments-with-specs).
For this use case, it's likely that only `production` must be added to this
list. The built-in PostgreSQL setup for Review Apps and staging is sufficient.
![Auto Metrics](img/disable_postgres.png)
-1. Define the `DATABASE_URL` CI variable as a scoped environment variable that is
+1. Define the `DATABASE_URL` variable as an environment-scoped variable that is
available to your application. This should be a URL in the following format:
```yaml
@@ -310,7 +310,7 @@ You must define environment-scoped variables for `POSTGRES_ENABLED` and
You must ensure that your Kubernetes cluster has network access to wherever
PostgreSQL is hosted.
-## Environment variables
+## CI/CD variables
The following variables can be used for setting up the Auto DevOps domain,
providing a custom Helm chart, or scaling your application. PostgreSQL can
@@ -318,10 +318,10 @@ also be customized, and you can use a [custom buildpack](#custom-buildpacks).
### Build and deployment
-The following table lists variables related to building and deploying
+The following table lists CI/CD variables related to building and deploying
applications.
-| **Variable** | **Description** |
+| **CI/CD Variable** | **Description** |
|-----------------------------------------|------------------------------------|
| `ADDITIONAL_HOSTS` | Fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. |
| `<ENVIRONMENT>_ADDITIONAL_HOSTS` | For a specific environment, the fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. This takes precedence over `ADDITIONAL_HOSTS`. |
@@ -329,7 +329,7 @@ applications.
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` | When set to a non-empty value and no `Dockerfile` is present, Auto Build builds your application using Cloud Native Buildpacks instead of Herokuish. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER` | The builder used when building with Cloud Native Buildpacks. The default builder is `heroku/buildpacks:18`. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). |
| `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` | Extra arguments to be passed to the `docker build` command. Note that using quotes doesn't prevent word splitting. [More details](#passing-arguments-to-docker-build). |
-| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI variable names](#forward-ci-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
+| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI/CD variable names](#forward-cicd-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
| `AUTO_DEVOPS_CHART` | Helm Chart used to deploy your apps. Defaults to the one [provided by GitLab](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app). |
| `AUTO_DEVOPS_CHART_REPOSITORY` | Helm Chart repository used to search for charts. Defaults to `https://charts.gitlab.io`. |
| `AUTO_DEVOPS_CHART_REPOSITORY_NAME` | From GitLab 11.11, used to set the name of the Helm repository. Defaults to `gitlab`. |
@@ -367,9 +367,9 @@ Auto DevOps can undo your changes.
### Database
-The following table lists variables related to the database.
+The following table lists CI/CD variables related to the database.
-| **Variable** | **Description** |
+| **CI/CD Variable** | **Description** |
|-----------------------------------------|------------------------------------|
| `DB_INITIALIZE` | From GitLab 11.4, used to specify the command to run to initialize the application's PostgreSQL database. Runs inside the application pod. |
| `DB_MIGRATE` | From GitLab 11.4, used to specify the command to run to migrate the application's PostgreSQL database. Runs inside the application pod. |
@@ -383,7 +383,7 @@ The following table lists variables related to the database.
The following table lists variables used to disable jobs.
-| **Job Name** | **Variable** | **GitLab version** | **Description** |
+| **Job Name** | **CI/CDVariable** | **GitLab version** | **Description** |
|----------------------------------------|---------------------------------|-----------------------|-----------------|
| `.fuzz_base` | `COVFUZZ_DISABLED` | [From GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34984) | [Read more](../../user/application_security/coverage_fuzzing/) about how `.fuzz_base` provide capability for your own jobs. If the variable is present, your jobs aren't created. |
| `apifuzzer_fuzz` | `API_FUZZING_DISABLED` | [From GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39135) | If the variable is present, the job isn't created. |
@@ -433,7 +433,7 @@ The following table lists variables used to disable jobs.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49056) in GitLab 11.7.
Some applications need to define secret variables that are accessible by the deployed
-application. Auto DevOps detects variables starting with `K8S_SECRET_`, and makes
+application. Auto DevOps detects CI/CD variables starting with `K8S_SECRET_`, and makes
these prefixed variables available to the deployed application as environment variables.
To configure your application variables:
@@ -545,7 +545,7 @@ The normal behavior of Auto DevOps is to use continuous deployment, pushing
automatically to the `production` environment every time a new pipeline is run
on the default branch. However, there are cases where you might want to use a
staging environment, and deploy to production manually. For this scenario, the
-`STAGING_ENABLED` environment variable was introduced.
+`STAGING_ENABLED` CI/CD variable was introduced.
If you define `STAGING_ENABLED` with a non-empty value, then GitLab automatically deploys the application
to a `staging` environment, and creates a `production_manual` job for
@@ -584,7 +584,7 @@ are created:
1. `rollout 50%`
1. `rollout 100%`
-The percentage is based on the `REPLICAS` variable, and defines the number of
+The percentage is based on the `REPLICAS` CI/CD variable, and defines the number of
pods you want to have for your deployment. If the value is `10`, and you run the
`10%` rollout job, there is `1` new pod and `9` old ones.
@@ -593,7 +593,7 @@ required to go from `10%` to `100%`, you can jump to whatever job you want.
You can also scale down by running a lower percentage job, just before hitting
`100%`. Once you get to `100%`, you can't scale down, and you'd have to roll
back by redeploying the old version using the
-[rollback button](../../ci/environments/index.md#retrying-and-rolling-back) in the
+[rollback button](../../ci/environments/index.md#retry-or-roll-back-a-deployment) in the
environment page.
Below, you can see how the pipeline appears if the rollout or staging
@@ -616,8 +616,8 @@ With `INCREMENTAL_ROLLOUT_MODE` set to `manual` and with `STAGING_ENABLED`
![Rollout and staging enabled](img/rollout_staging_enabled.png)
WARNING:
-Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` environment
-variable enabled this feature. This configuration is deprecated, and is scheduled to be
+Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` CI/CD variable
+enabled this feature. This configuration is deprecated, and is scheduled to be
removed in the future.
### Timed incremental rollout to production **(PREMIUM)**
@@ -632,7 +632,7 @@ This configuration is based on
Everything behaves the same way, except:
-- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` variable to `timed`.
+- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` CI/CD variable to `timed`.
- Instead of the standard `production` job, the following jobs are created with
a 5 minute delay between each:
@@ -651,7 +651,7 @@ permissions on new projects when Auto DevOps is not enabled:
The banner can be disabled for:
- A user, when they dismiss it themselves.
-- A project, by explicitly [disabling Auto DevOps](index.md#enablingdisabling-auto-devops).
+- A project, by explicitly [disabling Auto DevOps](index.md#enable-or-disable-auto-devops).
- An entire GitLab instance:
- By an administrator running the following in a Rails console:
diff --git a/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png b/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png
deleted file mode 100644
index 7dc37737835..00000000000
--- a/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png b/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png
deleted file mode 100644
index fa3ab4c1820..00000000000
--- a/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index d95e5568e0b..dbb63275a06 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -6,69 +6,134 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Auto DevOps **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/37115) in GitLab 10.0.
-> - Generally available on GitLab 11.0.
-
-Auto DevOps are default CI/CD templates that auto-discover the source code you have. They
-enable GitLab to automatically detect, build, test, deploy, and monitor your applications.
-Leveraging [CI/CD best practices](../../ci/pipelines/pipeline_efficiency.md) and tools,
-Auto DevOps aims to simplify the setup and execution of a mature and modern software
-development lifecycle.
-
-## Overview
-
-You can spend a lot of effort to set up the workflow and processes required to
-build, deploy, and monitor your project. It gets worse when your company has
-hundreds, if not thousands, of projects to maintain. With new projects
-constantly starting up, the entire software development process becomes
-impossibly complex to manage.
-
-Auto DevOps provides you a seamless software development process by
-automatically detecting all dependencies and language technologies required to
-test, build, package, deploy, and monitor every project with minimal
-configuration. Automation enables consistency across your projects, seamless
-management of processes, and faster creation of new projects: push your code,
-and GitLab does the rest, improving your productivity and efficiency.
+> - Introduced in GitLab 11.0 for general availability.
+
+GitLab Auto DevOps helps to reduce the complexity of software delivery by
+setting up pipelines and integrations for you. Instead of requiring you to
+manually configure your entire GitLab environment, Auto DevOps configures
+many of these areas for you, including security auditing and vulnerability
+testing.
+
+Using Auto DevOps, you can:
+
+- Detect the language of your code.
+- Automatically build, test, and measure code quality.
+- Scan for potential vulnerabilities, security flaws, and licensing issues.
+- Monitor in real-time.
+- Deploy your application.
+
+The functionality of Auto DevOps is based on default CI/CD templates that
+auto-discover your source code. These templates enable GitLab to provide
+consistency across your projects, seamless management of processes, and faster
+creation of new projects. Leveraging [CI/CD best practices](../../ci/pipelines/pipeline_efficiency.md)
+and tools, Auto DevOps lets you push your code, with GitLab doing the rest,
+improving your productivity and efficiency.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4).
+For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4) or see this [overview](https://about.gitlab.com/stages-devops-lifecycle/auto-devops/).
For requirements, read [Requirements for Auto DevOps](requirements.md) for more information.
-For a developer's guide, read [Auto DevOps development guide](../../development/auto_devops.md).
+For GitLab contributors, see the [Auto DevOps development guide](../../development/auto_devops.md).
-### Share your feedback
+## Enable or disable Auto DevOps
-As Auto DevOps continues to gain popularity, and lowers the barrier to entry for
-getting started with DevOps and CI/CD, see what our wider community is saying:
+Auto DevOps is enabled by default for all projects in self-managed instances
+(as of [GitLab 11.3](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41729)),
+but not for GitLab SaaS instances.
-From [AlexJonesax](https://twitter.com/AlexJonesax) and [KaiPMDH](https://twitter.com/KaiPMDH) on Twitter:
+When first using Auto DevOps, review the [requirements](requirements.md) to
+ensure all the necessary components to make full use of Auto DevOps are
+available. First-time users should follow the [quick start guide](quick_start_guide.md).
-![Alex on Twitter: Auto DevOps in GitLab doesn't just lower the bar to entry, it removes the bar and holds your hand.](img/alexj_autodevops_min_v13_8.png)
+Depending on your instance type, you can enable or disable Auto DevOps at the
+following levels:
-![Kai on Twitter: When I saw this on the Auto DevOps stuff, my mind was blown...](img/kai_autodevops_min_v13_8.png)
+| Instance type | [Project](#at-the-project-level) | [Group](#at-the-group-level) | [Instance](#at-the-instance-level) (Admin Area) |
+|---------------------|------------------------|------------------------|------------------------|
+| GitLab SaaS | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
+| GitLab self-managed | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
-We welcome everyone to [share your experience by tagging GitLab on Twitter](https://twitter.com/gitlab).
+When you enable AutoDevOps for your instance, it attempts to run on all
+pipelines in each project, but will automatically disable itself for individual
+projects on their first pipeline failure. An instance administrator can enable
+or disable this default in the [Auto DevOps settings](../../user/admin_area/settings/continuous_integration.md#auto-devops).
-## Enabled by default
+Since [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/26655),
+Auto DevOps runs on pipelines automatically only if a [`Dockerfile` or matching buildpack](stages.md#auto-build)
+exists.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41729) in GitLab 11.3.
+If a [CI/CD configuration file](../../ci/yaml/README.md) is present in the
+project, it isn't changed and won't be affected by Auto DevOps.
-On self-managed instances, Auto DevOps is enabled by default for all projects.
-It attempts to run on all pipelines in each project. An instance administrator can
-enable or disable this default in the
-[Auto DevOps settings](../../user/admin_area/settings/continuous_integration.md#auto-devops).
-Auto DevOps automatically disables in individual projects on their first pipeline failure,
+### At the project level
-NOTE:
-Auto DevOps is not enabled by default on GitLab.com.
+When you enable Auto DevOps for a project, ensure that your project does not have a `.gitlab-ci.yml` present. If it exists, remove it before enabling Auto DevOps.
-Since [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/26655), Auto DevOps
-runs on pipelines automatically only if a [`Dockerfile` or matching buildpack](stages.md#auto-build)
-exists.
+To enable it:
+
+1. Go to your project's **Settings > CI/CD > Auto DevOps**.
+1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
+1. (Optional, but recommended) When enabling, you can add in the
+ [base domain](#auto-devops-base-domain) Auto DevOps uses to
+ [deploy your application](stages.md#auto-deploy),
+ and choose the [deployment strategy](#deployment-strategy).
+1. Click **Save changes** for the changes to take effect.
+
+After enabling the feature, an Auto DevOps pipeline is triggered on the `master` branch.
+
+### At the group level
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52447) in GitLab 11.10.
+
+Only administrators and group owners can enable or disable Auto DevOps at the group level.
+
+When enabling or disabling Auto DevOps at group level, group configuration is
+implicitly used for the subgroups and projects inside that group, unless Auto DevOps
+is specifically enabled or disabled on the subgroup or project.
+
+To enable or disable Auto DevOps at the group level:
+
+1. Go to your group's **Settings > CI/CD > Auto DevOps** page.
+1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
+1. Click **Save changes** for the changes to take effect.
+
+### At the instance level **(FREE SELF)**
+
+Even when disabled at the instance level, group owners and project maintainers
+can still enable Auto DevOps at the group and project level, respectively.
+
+1. As an administrator, go to **Admin Area > Settings > CI/CD > Continuous Integration and Deployment**.
+1. Select **Default to Auto DevOps pipeline for all projects** to enable it.
+1. (Optional) You can set up the Auto DevOps [base domain](#auto-devops-base-domain),
+ for Auto Deploy and Auto Review Apps to use.
+1. Click **Save changes** for the changes to take effect.
+
+### Deployment strategy
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
-If a [CI/CD configuration file](../../ci/yaml/README.md) is present in the project,
-it continues to be used, whether or not Auto DevOps is enabled.
+You can change the deployment strategy used by Auto DevOps by visiting your
+project's **Settings > CI/CD > Auto DevOps**. The following options
+are available:
+
+- **Continuous deployment to production**: Enables [Auto Deploy](stages.md#auto-deploy)
+ with `master` branch directly deployed to production.
+- **Continuous deployment to production using timed incremental rollout**: Sets the
+ [`INCREMENTAL_ROLLOUT_MODE`](customize.md#timed-incremental-rollout-to-production) variable
+ to `timed`. Production deployments execute with a 5 minute delay between
+ each increment in rollout.
+- **Automatic deployment to staging, manual deployment to production**: Sets the
+ [`STAGING_ENABLED`](customize.md#deploy-policy-for-staging-and-production-environments) and
+ [`INCREMENTAL_ROLLOUT_MODE`](customize.md#incremental-rollout-to-production) variables
+ to `1` and `manual`. This means:
+
+ - `master` branch is directly deployed to staging.
+ - Manual actions are provided for incremental rollout to production.
+
+NOTE:
+Use the [blue-green deployment](../../ci/environments/incremental_rollouts.md#blue-green-deployment) technique
+to minimize downtime and risk.
## Quick start
@@ -110,20 +175,20 @@ Depending on your target platform, some features might not be available to you.
Comprised of a set of [stages](stages.md), Auto DevOps brings these best practices to your
project in a simple and automatic way:
-1. [Auto Build](stages.md#auto-build)
-1. [Auto Test](stages.md#auto-test)
-1. [Auto Code Quality](stages.md#auto-code-quality)
-1. [Auto SAST (Static Application Security Testing)](stages.md#auto-sast)
-1. [Auto Secret Detection](stages.md#auto-secret-detection)
-1. [Auto Dependency Scanning](stages.md#auto-dependency-scanning) **(ULTIMATE)**
-1. [Auto License Compliance](stages.md#auto-license-compliance) **(ULTIMATE)**
-1. [Auto Container Scanning](stages.md#auto-container-scanning) **(ULTIMATE)**
-1. [Auto Review Apps](stages.md#auto-review-apps)
-1. [Auto DAST (Dynamic Application Security Testing)](stages.md#auto-dast) **(ULTIMATE)**
-1. [Auto Deploy](stages.md#auto-deploy)
-1. [Auto Browser Performance Testing](stages.md#auto-browser-performance-testing) **(PREMIUM)**
-1. [Auto Monitoring](stages.md#auto-monitoring)
-1. [Auto Code Intelligence](stages.md#auto-code-intelligence)
+- [Auto Browser Performance Testing](stages.md#auto-browser-performance-testing)
+- [Auto Build](stages.md#auto-build)
+- [Auto Code Intelligence](stages.md#auto-code-intelligence)
+- [Auto Code Quality](stages.md#auto-code-quality)
+- [Auto Container Scanning](stages.md#auto-container-scanning)
+- [Auto DAST (Dynamic Application Security Testing)](stages.md#auto-dast)
+- [Auto Dependency Scanning](stages.md#auto-dependency-scanning)
+- [Auto Deploy](stages.md#auto-deploy)
+- [Auto License Compliance](stages.md#auto-license-compliance)
+- [Auto Monitoring](stages.md#auto-monitoring)
+- [Auto Review Apps](stages.md#auto-review-apps)
+- [Auto SAST (Static Application Security Testing)](stages.md#auto-sast)
+- [Auto Secret Detection](stages.md#auto-secret-detection)
+- [Auto Test](stages.md#auto-test)
As Auto DevOps relies on many different components, you should have a basic
knowledge of the following:
@@ -162,7 +227,7 @@ any of the following places:
[groups](../../user/group/clusters/index.md#base-domain)
- or at the project level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
- or at the group level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
-- or as an instance-wide fallback in **Admin Area > Settings** under the
+- or as an instance-wide fallback in **Admin Area > Settings > CI/CD** under the
**Continuous Integration and Delivery** section
The base domain variable `KUBE_INGRESS_BASE_DOMAIN` follows the same order of precedence
@@ -193,83 +258,6 @@ to the Kubernetes pods running your application.
See [Auto DevOps requirements for Amazon ECS](requirements.md#auto-devops-requirements-for-amazon-ecs).
-## Enabling/Disabling Auto DevOps
-
-When first using Auto DevOps, review the [requirements](requirements.md) to ensure
-all the necessary components to make full use of Auto DevOps are available. First-time
-users should follow the [quick start guide](quick_start_guide.md).
-
-GitLab.com users can enable or disable Auto DevOps only at the project level.
-Self-managed users can enable or disable Auto DevOps at the project, group, or
-instance level.
-
-### At the project level
-
-If enabling, check that your project does not have a `.gitlab-ci.yml`, or if one exists, remove it.
-
-1. Go to your project's **Settings > CI/CD > Auto DevOps**.
-1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
-1. (Optional, but recommended) When enabling, you can add in the
- [base domain](#auto-devops-base-domain) Auto DevOps uses to
- [deploy your application](stages.md#auto-deploy),
- and choose the [deployment strategy](#deployment-strategy).
-1. Click **Save changes** for the changes to take effect.
-
-After enabling the feature, an Auto DevOps pipeline is triggered on the `master` branch.
-
-### At the group level
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52447) in GitLab 11.10.
-
-Only administrators and group owners can enable or disable Auto DevOps at the group level.
-
-When enabling or disabling Auto DevOps at group level, group configuration is
-implicitly used for the subgroups and projects inside that group, unless Auto DevOps
-is specifically enabled or disabled on the subgroup or project.
-
-To enable or disable Auto DevOps at the group level:
-
-1. Go to your group's **Settings > CI/CD > Auto DevOps** page.
-1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
-1. Click **Save changes** for the changes to take effect.
-
-### At the instance level (Administrators only)
-
-Even when disabled at the instance level, group owners and project maintainers can still enable
-Auto DevOps at the group and project level, respectively.
-
-1. Go to **Admin Area > Settings > Continuous Integration and Deployment**.
-1. Select **Default to Auto DevOps pipeline for all projects** to enable it.
-1. (Optional) You can set up the Auto DevOps [base domain](#auto-devops-base-domain),
- for Auto Deploy and Auto Review Apps to use.
-1. Click **Save changes** for the changes to take effect.
-
-### Deployment strategy
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
-
-You can change the deployment strategy used by Auto DevOps by visiting your
-project's **Settings > CI/CD > Auto DevOps**. The following options
-are available:
-
-- **Continuous deployment to production**: Enables [Auto Deploy](stages.md#auto-deploy)
- with `master` branch directly deployed to production.
-- **Continuous deployment to production using timed incremental rollout**: Sets the
- [`INCREMENTAL_ROLLOUT_MODE`](customize.md#timed-incremental-rollout-to-production) variable
- to `timed`. Production deployments execute with a 5 minute delay between
- each increment in rollout.
-- **Automatic deployment to staging, manual deployment to production**: Sets the
- [`STAGING_ENABLED`](customize.md#deploy-policy-for-staging-and-production-environments) and
- [`INCREMENTAL_ROLLOUT_MODE`](customize.md#incremental-rollout-to-production) variables
- to `1` and `manual`. This means:
-
- - `master` branch is directly deployed to staging.
- - Manual actions are provided for incremental rollout to production.
-
-NOTE:
-Use the [blue-green deployment](../../ci/environments/incremental_rollouts.md#blue-green-deployment) technique
-to minimize downtime and risk.
-
## Using multiple Kubernetes clusters
When using Auto DevOps, you can deploy different environments to
@@ -333,7 +321,7 @@ simplify configuration and prevent any unforeseen issues.
The GitLab integration with Helm does not support installing applications when
behind a proxy. Users who want to do so must inject their proxy settings
into the installation pods at runtime, such as by using a
-[`PodPreset`](https://kubernetes.io/docs/concepts/workloads/pods/podpreset/):
+[`PodPreset`](https://v1-19.docs.kubernetes.io/docs/concepts/workloads/pods/podpreset/):
```yaml
apiVersion: settings.k8s.io/v1alpha1
@@ -349,245 +337,5 @@ spec:
value: "PUT_YOUR_HTTPS_PROXY_HERE"
```
-## Troubleshooting
-
-### Unable to select a buildpack
-
-Auto Build and Auto Test may fail to detect your language or framework with the
-following error:
-
-```plaintext
-Step 5/11 : RUN /bin/herokuish buildpack build
- ---> Running in eb468cd46085
- -----> Unable to select a buildpack
-The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1
-```
-
-The following are possible reasons:
-
-- Your application may be missing the key files the buildpack is looking for.
- Ruby applications require a `Gemfile` to be properly detected,
- even though it's possible to write a Ruby app without a `Gemfile`.
-- No buildpack may exist for your application. Try specifying a
- [custom buildpack](customize.md#custom-buildpacks).
-
-### Pipeline that extends Auto DevOps with only / except fails
-
-If your pipeline fails with the following message:
-
-```plaintext
-Found errors in your .gitlab-ci.yml:
-
- jobs:test config key may not be used with `rules`: only
-```
-
-This error appears when the included job’s rules configuration has been overridden with the `only` or `except` syntax.
-To fix this issue, you must either:
-
-- Transition your `only/except` syntax to rules.
-- (Temporarily) Pin your templates to the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
-
-### Failure to create a Kubernetes namespace
-
-Auto Deploy fails if GitLab can't create a Kubernetes namespace and
-service account for your project. For help debugging this issue, see
-[Troubleshooting failed deployment jobs](../../user/project/clusters/index.md#troubleshooting).
-
-### Detected an existing PostgreSQL database
-
-After upgrading to GitLab 13.0, you may encounter this message when deploying
-with Auto DevOps:
-
-```plaintext
-Detected an existing PostgreSQL database installed on the
-deprecated channel 1, but the current channel is set to 2. The default
-channel changed to 2 in of GitLab 13.0.
-[...]
-```
-
-Auto DevOps, by default, installs an in-cluster PostgreSQL database alongside
-your application. The default installation method changed in GitLab 13.0, and
-upgrading existing databases requires user involvement. The two installation
-methods are:
-
-- **channel 1 (deprecated):** Pulls in the database as a dependency of the associated
- Helm chart. Only supports Kubernetes versions up to version 1.15.
-- **channel 2 (current):** Installs the database as an independent Helm chart. Required
- for using the in-cluster database feature with Kubernetes versions 1.16 and greater.
-
-If you receive this error, you can do one of the following actions:
-
-- You can *safely* ignore the warning and continue using the channel 1 PostgreSQL
- database by setting `AUTO_DEVOPS_POSTGRES_CHANNEL` to `1` and redeploying.
-
-- You can delete the channel 1 PostgreSQL database and install a fresh channel 2
- database by setting `AUTO_DEVOPS_POSTGRES_DELETE_V1` to a non-empty value and
- redeploying.
-
- WARNING:
- Deleting the channel 1 PostgreSQL database permanently deletes the existing
- channel 1 database and all its data. See
- [Upgrading PostgreSQL](upgrading_postgresql.md)
- for more information on backing up and upgrading your database.
-
-- If you are not using the in-cluster database, you can set
- `POSTGRES_ENABLED` to `false` and re-deploy. This option is especially relevant to
- users of *custom charts without the in-chart PostgreSQL dependency*.
- Database auto-detection is based on the `postgresql.enabled` Helm value for
- your release. This value is set based on the `POSTGRES_ENABLED` CI variable
- and persisted by Helm, regardless of whether or not your chart uses the
- variable.
-
-WARNING:
-Setting `POSTGRES_ENABLED` to `false` permanently deletes any existing
-channel 1 database for your environment.
-
-### Error: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
-
-After upgrading your Kubernetes cluster to [v1.16+](stages.md#kubernetes-116),
-you may encounter this message when deploying with Auto DevOps:
-
-```plaintext
-UPGRADE FAILED
-Error: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
-```
-
-This can occur if your current deployments on the environment namespace were deployed with a
-deprecated/removed API that doesn't exist in Kubernetes v1.16+. For example,
-if [your in-cluster PostgreSQL was installed in a legacy way](#detected-an-existing-postgresql-database),
-the resource was created via the `extensions/v1beta1` API. However, the deployment resource
-was moved to the `app/v1` API in v1.16.
-
-To recover such outdated resources, you must convert the current deployments by mapping legacy APIs
-to newer APIs. There is a helper tool called [`mapkubeapis`](https://github.com/hickeyma/helm-mapkubeapis)
-that works for this problem. Follow these steps to use the tool in Auto DevOps:
-
-1. Modify your `.gitlab-ci.yml` with:
-
- ```yaml
- include:
- - template: Auto-DevOps.gitlab-ci.yml
- - remote: https://gitlab.com/shinya.maeda/ci-templates/-/raw/master/map-deprecated-api.gitlab-ci.yml
-
- variables:
- HELM_VERSION_FOR_MAPKUBEAPIS: "v2" # If you're using auto-depoy-image v2 or above, please specify "v3".
- ```
-
-1. Run the job `<environment-name>:map-deprecated-api`. Ensure that this job succeeds before moving
- to the next step. You should see something like the following output:
-
- ```shell
- 2020/10/06 07:20:49 Found deprecated or removed Kubernetes API:
- "apiVersion: extensions/v1beta1
- kind: Deployment"
- Supported API equivalent:
- "apiVersion: apps/v1
- kind: Deployment"
- ```
-
-1. Revert your `.gitlab-ci.yml` to the previous version. You no longer need to include the
- supplemental template `map-deprecated-api`.
-
-1. Continue the deployments as usual.
-
-### Error: error initializing: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached
-
-As [announced in the official CNCF blog post](https://www.cncf.io/blog/2020/10/07/important-reminder-for-all-helm-users-stable-incubator-repos-are-deprecated-and-all-images-are-changing-location/),
-the stable Helm chart repository was deprecated and removed on November 13th, 2020.
-You may encounter this error after that date.
-
-Some GitLab features had dependencies on the stable chart. To mitigate the impact, we changed them
-to use new official repositories or the [Helm Stable Archive repository maintained by GitLab](https://gitlab.com/gitlab-org/cluster-integration/helm-stable-archive).
-Auto Deploy contains [an example fix](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/127).
-
-In Auto Deploy, `v1.0.6+` of `auto-deploy-image` no longer adds the deprecated stable repository to
-the `helm` command. If you use a custom chart and it relies on the deprecated stable repository,
-specify an older `auto-deploy-image` like this example:
-
-```yaml
-include:
- - template: Auto-DevOps.gitlab-ci.yml
-
-.auto-deploy:
- image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v1.0.5"
-```
-
-Keep in mind that this approach stops working when the stable repository is removed,
-so you must eventually fix your custom chart.
-
-To fix your custom chart:
-
-1. In your chart directory, update the `repository` value in your `requirements.yaml` file from :
-
- ```yaml
- repository: "https://kubernetes-charts.storage.googleapis.com/"
- ```
-
- to:
-
- ```yaml
- repository: "https://charts.helm.sh/stable"
- ```
-
-1. In your chart directory, run `helm dep update .` using the same Helm major version as Auto DevOps.
-1. Commit the changes for the `requirements.yaml` file.
-1. If you previously had a `requirements.lock` file, commit the changes to the file.
- If you did not previously have a `requirements.lock` file in your chart,
- you do not need to commit the new one. This file is optional, but when present,
- it's used to verify the integrity of the downloaded dependencies.
-
-You can find more information in
-[issue #263778, "Migrate PostgreSQL from stable Helm repository"](https://gitlab.com/gitlab-org/gitlab/-/issues/263778).
-
-### Error: release .... failed: timed out waiting for the condition
-
-When getting started with Auto DevOps, you may encounter this error when first
-deploying your application:
-
-```plaintext
-INSTALL FAILED
-PURGING CHART
-Error: release staging failed: timed out waiting for the condition
-```
-
-This is most likely caused by a failed liveness (or readiness) probe attempted
-during the deployment process. By default, these probes are run against the root
-page of the deployed application on port 5000. If your application isn't configured
-to serve anything at the root page, or is configured to run on a specific port
-*other* than 5000, this check fails.
-
-If it fails, you should see these failures in the events for the relevant
-Kubernetes namespace. These events look like the following example:
-
-```plaintext
-LAST SEEN TYPE REASON OBJECT MESSAGE
-3m20s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Readiness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
-3m32s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Liveness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
-```
-
-To change the port used for the liveness checks, pass
-[custom values to the Helm chart](customize.md#customize-values-for-helm-chart)
-used by Auto DevOps:
-
-1. Create a directory and file at the root of your repository named `.gitlab/auto-deploy-values.yaml`.
-
-1. Populate the file with the following content, replacing the port values with
- the actual port number your application is configured to use:
-
- ```yaml
- service:
- internalPort: <port_value>
- externalPort: <port_value>
- ```
-
-1. Commit your changes.
-
-After committing your changes, subsequent probes should use the newly-defined ports.
-The page that's probed can also be changed by overriding the `livenessProbe.path`
-and `readinessProbe.path` values (shown in the
-[default `values.yaml`](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml)
-file) in the same fashion.
-
-## Development guides
-
-[Development guide for Auto DevOps](../../development/auto_devops.md)
+<!-- DO NOT ADD TROUBLESHOOTING INFO HERE -->
+<!-- Troubleshooting information has moved to troubleshooting.md -->
diff --git a/doc/topics/autodevops/quick_start_guide.md b/doc/topics/autodevops/quick_start_guide.md
index cd951e53bd1..631180f696c 100644
--- a/doc/topics/autodevops/quick_start_guide.md
+++ b/doc/topics/autodevops/quick_start_guide.md
@@ -222,7 +222,7 @@ you to common environment tasks:
- **Terminal** (**{terminal}**) - Opens a [web terminal](../../ci/environments/index.md#web-terminals)
session inside the container where the application is running
- **Re-deploy to environment** (**{repeat}**) - For more information, see
- [Retrying and rolling back](../../ci/environments/index.md#retrying-and-rolling-back)
+ [Retrying and rolling back](../../ci/environments/index.md#retry-or-roll-back-a-deployment)
- **Stop environment** (**{stop}**) - For more information, see
[Stopping an environment](../../ci/environments/index.md#stopping-an-environment)
@@ -234,8 +234,8 @@ takes you to the pod's logs page.
NOTE:
The example shows only one pod hosting the application at the moment, but you can add
-more pods by defining the [`REPLICAS` variable](customize.md#environment-variables)
-in **Settings > CI/CD > Environment variables**.
+more pods by defining the [`REPLICAS` CI/CD variable](customize.md#cicd-variables)
+in **Settings > CI/CD > Variables**.
### Work with branches
@@ -307,7 +307,7 @@ and customized to fit your workflow. Here are some helpful resources for further
1. [Auto DevOps](index.md)
1. [Multiple Kubernetes clusters](index.md#using-multiple-kubernetes-clusters)
1. [Incremental rollout to production](customize.md#incremental-rollout-to-production) **(PREMIUM)**
-1. [Disable jobs you don't need with environment variables](customize.md#environment-variables)
+1. [Disable jobs you don't need with CI/CD variables](customize.md#cicd-variables)
1. [Use a static IP for your cluster](../../user/clusters/applications.md#using-a-static-ip)
1. [Use your own buildpacks to build your application](customize.md#custom-buildpacks)
1. [Prometheus monitoring](../../user/project/integrations/prometheus.md)
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 930938b7571..d536282cca4 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -101,7 +101,7 @@ If you don't have Kubernetes or Prometheus installed, then
[Auto Deploy](stages.md#auto-deploy), and [Auto Monitoring](stages.md#auto-monitoring)
are skipped.
-After all requirements are met, you can [enable Auto DevOps](index.md#enablingdisabling-auto-devops).
+After all requirements are met, you can [enable Auto DevOps](index.md#enable-or-disable-auto-devops).
## Auto DevOps requirements for Amazon ECS
@@ -109,10 +109,10 @@ After all requirements are met, you can [enable Auto DevOps](index.md#enablingdi
You can choose to target [AWS ECS](../../ci/cloud_deployment/index.md) as a deployment platform instead of using Kubernetes.
-To get started on Auto DevOps to AWS ECS, you must add a specific Environment
-Variable. To do so, follow these steps:
+To get started on Auto DevOps to AWS ECS, you must add a specific CI/CD variable.
+To do so, follow these steps:
-1. In your project, go to **Settings > CI / CD** and expand the **Variables**
+1. In your project, go to **Settings > CI/CD** and expand the **Variables**
section.
1. Specify which AWS platform to target during the Auto DevOps deployment
@@ -121,7 +121,7 @@ Variable. To do so, follow these steps:
- `ECS` if you're not enforcing any launch type check when deploying to ECS.
When you trigger a pipeline, if you have Auto DevOps enabled and if you have correctly
-[entered AWS credentials as environment variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs),
+[entered AWS credentials as variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs),
your application is deployed to AWS ECS.
[GitLab Managed Apps](../../user/clusters/applications.md) are not available when deploying to AWS ECS.
@@ -145,7 +145,7 @@ own pipeline, as the override stops working when the name changes.
You can target [AWS EC2](../../ci/cloud_deployment/index.md)
as a deployment platform instead of Kubernetes. To use Auto DevOps with AWS EC2, you must add a
-specific environment variable.
+specific CI/CD variable.
For more details, see [Custom build job for Auto DevOps](../../ci/cloud_deployment/index.md#custom-build-job-for-auto-devops)
for deployments to AWS EC2.
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index f1244a1ad1b..913c221d8ec 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -53,7 +53,7 @@ For the requirements of other languages and frameworks, read the
NOTE:
If Auto Build fails despite the project meeting the buildpack requirements, set
-a project variable `TRACE=true` to enable verbose logging, which may help you
+a project CI/CD variable `TRACE=true` to enable verbose logging, which may help you
troubleshoot.
### Auto Build using Cloud Native Buildpacks (beta)
@@ -62,9 +62,9 @@ troubleshoot.
Auto Build supports building your application using [Cloud Native Buildpacks](https://buildpacks.io)
through the [`pack` command](https://github.com/buildpacks/pack). To use Cloud Native Buildpacks,
-set the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty
+set the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty
value. The default builder is `heroku/buildpacks:18` but a different builder
-can be selected using the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`.
+can be selected using the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`.
Cloud Native Buildpacks (CNBs) are an evolution of Heroku buildpacks, and
GitLab expects them to eventually supersede Herokuish-based builds within Auto DevOps. For more
@@ -103,7 +103,9 @@ NOTE:
Not all buildpacks supported by [Auto Build](#auto-build) are supported by Auto Test.
Auto Test uses [Herokuish](https://gitlab.com/gitlab-org/gitlab/-/issues/212689), *not*
Cloud Native Buildpacks, and only buildpacks that implement the
+<!-- vale gitlab.Spelling = NO -->
[Testpack API](https://devcenter.heroku.com/articles/testpack-api) are supported.
+<!-- vale gitlab.Spelling = YES -->
### Currently supported languages
@@ -284,7 +286,7 @@ see the documentation.
### Overriding the DAST target
To use a custom target instead of the auto-deployed review apps,
-set a `DAST_WEBSITE` environment variable to the URL for DAST to scan.
+set a `DAST_WEBSITE` CI/CD variable to the URL for DAST to scan.
WARNING:
If [DAST Full Scan](../../user/application_security/dast/index.md#full-scan) is
@@ -297,10 +299,10 @@ data loss or corruption.
You can disable DAST:
-- On all branches by setting the `DAST_DISABLED` environment variable to `"true"`.
+- On all branches by setting the `DAST_DISABLED` CI/CD variable to `"true"`.
- Only on the default branch by setting the `DAST_DISABLED_FOR_DEFAULT_BRANCH`
- environment variable to `"true"`.
-- Only on feature branches by setting `REVIEW_DISABLED` environment variable to
+ variable to `"true"`.
+- Only on feature branches by setting `REVIEW_DISABLED` variable to
`"true"`. This also disables the Review App.
## Auto Browser Performance Testing **(PREMIUM)**
@@ -336,15 +338,16 @@ uploads the report as an artifact.
Some initial setup is required. A [k6](https://k6.io/) test needs to be
written that's tailored to your specific application. The test also needs to be
-configured so it can pick up the environment's dynamic URL via an environment variable.
+configured so it can pick up the environment's dynamic URL via a CI/CD variable.
Any load performance test result differences between the source and target branches are also
[shown in the merge request widget](../../user/project/merge_requests/load_performance_testing.md).
## Auto Deploy
-This is an optional step, since many projects don't have a Kubernetes cluster
-available. If the [requirements](requirements.md) are not met, the job is skipped.
+[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216008) in GitLab 13.6, you have the choice to deploy to [Amazon Elastic Compute Cloud (Amazon EC2)](https://aws.amazon.com/ec2/) in addition to a Kubernetes cluster.
+
+Auto Deploy is an optional step for Auto DevOps. If the [requirements](requirements.md) are not met, the job is skipped.
After a branch or merge request is merged into the project's default branch (usually
`master`), Auto Deploy deploys the application to a `production` environment in
@@ -356,7 +359,7 @@ default, but the
[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
contains job definitions for these tasks if you want to enable them.
-You can use [environment variables](customize.md#environment-variables) to automatically
+You can use [CI/CD variables](customize.md#cicd-variables) to automatically
scale your pod replicas, and to apply custom arguments to the Auto DevOps `helm upgrade`
commands. This is an easy way to
[customize the Auto Deploy Helm chart](customize.md#custom-helm-chart).
@@ -440,7 +443,7 @@ On GitLab 12.9 and 12.10, opting into
`AUTO_DEVOPS_POSTGRES_CHANNEL` version `2` deletes the version `1` PostgreSQL
database. Follow the [guide to upgrading PostgreSQL](upgrading_postgresql.md)
to back up and restore your database before opting into version `2` (On
-GitLab 13.0, an additional variable is required to trigger the database
+GitLab 13.0, an additional CI/CD variable is required to trigger the database
deletion).
### Migrations
@@ -448,7 +451,7 @@ deletion).
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21955) in GitLab 11.4
You can configure database initialization and migrations for PostgreSQL to run
-within the application pod by setting the project variables `DB_INITIALIZE` and
+within the application pod by setting the project CI/CD variables `DB_INITIALIZE` and
`DB_MIGRATE` respectively.
If present, `DB_INITIALIZE` is run as a shell command within an application pod
@@ -500,7 +503,7 @@ access to a Redis instance. Auto DevOps doesn't deploy this instance for you, so
you must:
- Maintain your own Redis instance.
-- Set a CI variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance,
+- Set a CI/CD variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance,
to ensure it's passed into your deployments.
After configuring your worker to respond to health checks, run a Sidekiq
@@ -527,7 +530,8 @@ workers:
### Network Policy
-> [Introduced](https://gitlab.com/gitlab-org/charts/auto-deploy-app/-/merge_requests/30) in GitLab 12.7.
+- [Introduced](https://gitlab.com/gitlab-org/charts/auto-deploy-app/-/merge_requests/30) in GitLab 12.7.
+- [Deprecated](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/184) in GitLab 13.9.
By default, all Kubernetes pods are
[non-isolated](https://kubernetes.io/docs/concepts/services-networking/network-policies/#isolated-and-non-isolated-pods),
@@ -578,6 +582,76 @@ networkPolicy:
For more information on installing Network Policies, see
[Install Cilium using GitLab CI/CD](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd).
+### Cilium Network Policy
+
+> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/184) in GitLab 13.9.
+
+By default, all Kubernetes pods are
+[non-isolated](https://kubernetes.io/docs/concepts/services-networking/network-policies/#isolated-and-non-isolated-pods),
+and accept traffic to and from any source. You can use
+[CiliumNetworkPolicy](https://docs.cilium.io/en/v1.8/concepts/kubernetes/policy/#ciliumnetworkpolicy)
+to restrict connections to and from selected pods, namespaces, and the internet.
+
+#### Requirements
+
+As the default network plugin for Kubernetes (`kubenet`)
+[does not implement](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet)
+support for it, you must have [Cilium](https://docs.cilium.io/en/v1.8/intro/) as your Kubernetes network plugin.
+
+The [Cilium](https://cilium.io/) network plugin can be
+installed as a [cluster application](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd)
+to enable support for network policies.
+
+#### Configuration
+
+You can enable deployment of a network policy by setting the following
+in the `.gitlab/auto-deploy-values.yaml` file:
+
+```yaml
+ciliumNetworkPolicy:
+ enabled: true
+```
+
+The default policy deployed by the Auto Deploy pipeline allows
+traffic within a local namespace, and from the `gitlab-managed-apps`
+namespace. All other inbound connections are blocked. Outbound
+traffic (for example, to the internet) is not affected by the default policy.
+
+You can also provide a custom [policy specification](https://docs.cilium.io/en/v1.8/policy/language/#simple-ingress-allow)
+in the `.gitlab/auto-deploy-values.yaml` file, for example:
+
+```yaml
+ciliumNetworkPolicy:
+ enabled: true
+ spec:
+ endpointSelector:
+ matchLabels:
+ app.gitlab.com/env: staging
+ ingress:
+ - fromEndpoints:
+ - matchLabels:
+ app.gitlab.com/managed_by: gitlab
+```
+
+#### Enabling Alerts
+
+You can also enable alerts. Network policies with alerts are considered only if
+[GitLab Kubernetes Agent](../../user/clusters/agent/index.md)
+has been integrated.
+
+You can enable alerts as follows:
+
+```yaml
+ciliumNetworkPolicy:
+ enabled: true
+ alerts:
+ enabled: true
+
+```
+
+For more information on installing Network Policies, see
+[Install Cilium using GitLab CI/CD](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd).
+
### Web Application Firewall (ModSecurity) customization
> [Introduced](https://gitlab.com/gitlab-org/charts/auto-deploy-app/-/merge_requests/44) in GitLab 12.8.
@@ -664,7 +738,7 @@ GitLab provides some initial alerts for you after you install Prometheus:
To use Auto Monitoring:
1. [Install and configure the Auto DevOps requirements](requirements.md).
-1. [Enable Auto DevOps](index.md#enablingdisabling-auto-devops), if you haven't done already.
+1. [Enable Auto DevOps](index.md#enable-or-disable-auto-devops), if you haven't done already.
1. Navigate to your project's **{rocket}** **CI/CD > Pipelines** and click **Run Pipeline**.
1. After the pipeline finishes successfully, open the
[monitoring dashboard for a deployed environment](../../ci/environments/index.md#monitoring-environments)
@@ -686,5 +760,5 @@ You can follow the [code intelligence epic](https://gitlab.com/groups/gitlab-org
for updates.
This stage is enabled by default. You can disable it by adding the
-`CODE_INTELLIGENCE_DISABLED` environment variable. Read more about
+`CODE_INTELLIGENCE_DISABLED` CI/CD variable. Read more about
[disabling Auto DevOps jobs](../../topics/autodevops/customize.md#disable-jobs).
diff --git a/doc/topics/autodevops/troubleshooting.md b/doc/topics/autodevops/troubleshooting.md
new file mode 100644
index 00000000000..ed75dd4e262
--- /dev/null
+++ b/doc/topics/autodevops/troubleshooting.md
@@ -0,0 +1,247 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Troubleshooting Auto DevOps **(FREE)**
+
+The information in this documentation page describes common errors when using
+Auto DevOps, and any available workarounds.
+
+## Unable to select a buildpack
+
+Auto Build and Auto Test may fail to detect your language or framework with the
+following error:
+
+```plaintext
+Step 5/11 : RUN /bin/herokuish buildpack build
+ ---> Running in eb468cd46085
+ -----> Unable to select a buildpack
+The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1
+```
+
+The following are possible reasons:
+
+- Your application may be missing the key files the buildpack is looking for.
+ Ruby applications require a `Gemfile` to be properly detected,
+ even though it's possible to write a Ruby app without a `Gemfile`.
+- No buildpack may exist for your application. Try specifying a
+ [custom buildpack](customize.md#custom-buildpacks).
+
+## Pipeline that extends Auto DevOps with only / except fails
+
+If your pipeline fails with the following message:
+
+```plaintext
+Found errors in your .gitlab-ci.yml:
+
+ jobs:test config key may not be used with `rules`: only
+```
+
+This error appears when the included job’s rules configuration has been overridden with the `only` or `except` syntax.
+To fix this issue, you must either:
+
+- Transition your `only/except` syntax to rules.
+- (Temporarily) Pin your templates to the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
+
+## Failure to create a Kubernetes namespace
+
+Auto Deploy fails if GitLab can't create a Kubernetes namespace and
+service account for your project. For help debugging this issue, see
+[Troubleshooting failed deployment jobs](../../user/project/clusters/index.md#troubleshooting).
+
+## Detected an existing PostgreSQL database
+
+After upgrading to GitLab 13.0, you may encounter this message when deploying
+with Auto DevOps:
+
+```plaintext
+Detected an existing PostgreSQL database installed on the
+deprecated channel 1, but the current channel is set to 2. The default
+channel changed to 2 in of GitLab 13.0.
+[...]
+```
+
+Auto DevOps, by default, installs an in-cluster PostgreSQL database alongside
+your application. The default installation method changed in GitLab 13.0, and
+upgrading existing databases requires user involvement. The two installation
+methods are:
+
+- **channel 1 (deprecated):** Pulls in the database as a dependency of the associated
+ Helm chart. Only supports Kubernetes versions up to version 1.15.
+- **channel 2 (current):** Installs the database as an independent Helm chart. Required
+ for using the in-cluster database feature with Kubernetes versions 1.16 and greater.
+
+If you receive this error, you can do one of the following actions:
+
+- You can *safely* ignore the warning and continue using the channel 1 PostgreSQL
+ database by setting `AUTO_DEVOPS_POSTGRES_CHANNEL` to `1` and redeploying.
+
+- You can delete the channel 1 PostgreSQL database and install a fresh channel 2
+ database by setting `AUTO_DEVOPS_POSTGRES_DELETE_V1` to a non-empty value and
+ redeploying.
+
+ WARNING:
+ Deleting the channel 1 PostgreSQL database permanently deletes the existing
+ channel 1 database and all its data. See
+ [Upgrading PostgreSQL](upgrading_postgresql.md)
+ for more information on backing up and upgrading your database.
+
+- If you are not using the in-cluster database, you can set
+ `POSTGRES_ENABLED` to `false` and re-deploy. This option is especially relevant to
+ users of *custom charts without the in-chart PostgreSQL dependency*.
+ Database auto-detection is based on the `postgresql.enabled` Helm value for
+ your release. This value is set based on the `POSTGRES_ENABLED` CI/CD variable
+ and persisted by Helm, regardless of whether or not your chart uses the
+ variable.
+
+WARNING:
+Setting `POSTGRES_ENABLED` to `false` permanently deletes any existing
+channel 1 database for your environment.
+
+## Error: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
+
+After upgrading your Kubernetes cluster to [v1.16+](stages.md#kubernetes-116),
+you may encounter this message when deploying with Auto DevOps:
+
+```plaintext
+UPGRADE FAILED
+Error: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
+```
+
+This can occur if your current deployments on the environment namespace were deployed with a
+deprecated/removed API that doesn't exist in Kubernetes v1.16+. For example,
+if [your in-cluster PostgreSQL was installed in a legacy way](#detected-an-existing-postgresql-database),
+the resource was created via the `extensions/v1beta1` API. However, the deployment resource
+was moved to the `app/v1` API in v1.16.
+
+To recover such outdated resources, you must convert the current deployments by mapping legacy APIs
+to newer APIs. There is a helper tool called [`mapkubeapis`](https://github.com/hickeyma/helm-mapkubeapis)
+that works for this problem. Follow these steps to use the tool in Auto DevOps:
+
+1. Modify your `.gitlab-ci.yml` with:
+
+ ```yaml
+ include:
+ - template: Auto-DevOps.gitlab-ci.yml
+ - remote: https://gitlab.com/shinya.maeda/ci-templates/-/raw/master/map-deprecated-api.gitlab-ci.yml
+
+ variables:
+ HELM_VERSION_FOR_MAPKUBEAPIS: "v2" # If you're using auto-depoy-image v2 or above, please specify "v3".
+ ```
+
+1. Run the job `<environment-name>:map-deprecated-api`. Ensure that this job succeeds before moving
+ to the next step. You should see something like the following output:
+
+ ```shell
+ 2020/10/06 07:20:49 Found deprecated or removed Kubernetes API:
+ "apiVersion: extensions/v1beta1
+ kind: Deployment"
+ Supported API equivalent:
+ "apiVersion: apps/v1
+ kind: Deployment"
+ ```
+
+1. Revert your `.gitlab-ci.yml` to the previous version. You no longer need to include the
+ supplemental template `map-deprecated-api`.
+
+1. Continue the deployments as usual.
+
+## Error: error initializing: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached
+
+As [announced in the official CNCF blog post](https://www.cncf.io/blog/2020/10/07/important-reminder-for-all-helm-users-stable-incubator-repos-are-deprecated-and-all-images-are-changing-location/),
+the stable Helm chart repository was deprecated and removed on November 13th, 2020.
+You may encounter this error after that date.
+
+Some GitLab features had dependencies on the stable chart. To mitigate the impact, we changed them
+to use new official repositories or the [Helm Stable Archive repository maintained by GitLab](https://gitlab.com/gitlab-org/cluster-integration/helm-stable-archive).
+Auto Deploy contains [an example fix](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/127).
+
+In Auto Deploy, `v1.0.6+` of `auto-deploy-image` no longer adds the deprecated stable repository to
+the `helm` command. If you use a custom chart and it relies on the deprecated stable repository,
+specify an older `auto-deploy-image` like this example:
+
+```yaml
+include:
+ - template: Auto-DevOps.gitlab-ci.yml
+
+.auto-deploy:
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v1.0.5"
+```
+
+Keep in mind that this approach stops working when the stable repository is removed,
+so you must eventually fix your custom chart.
+
+To fix your custom chart:
+
+1. In your chart directory, update the `repository` value in your `requirements.yaml` file from :
+
+ ```yaml
+ repository: "https://kubernetes-charts.storage.googleapis.com/"
+ ```
+
+ to:
+
+ ```yaml
+ repository: "https://charts.helm.sh/stable"
+ ```
+
+1. In your chart directory, run `helm dep update .` using the same Helm major version as Auto DevOps.
+1. Commit the changes for the `requirements.yaml` file.
+1. If you previously had a `requirements.lock` file, commit the changes to the file.
+ If you did not previously have a `requirements.lock` file in your chart,
+ you do not need to commit the new one. This file is optional, but when present,
+ it's used to verify the integrity of the downloaded dependencies.
+
+You can find more information in
+[issue #263778, "Migrate PostgreSQL from stable Helm repository"](https://gitlab.com/gitlab-org/gitlab/-/issues/263778).
+
+## Error: release .... failed: timed out waiting for the condition
+
+When getting started with Auto DevOps, you may encounter this error when first
+deploying your application:
+
+```plaintext
+INSTALL FAILED
+PURGING CHART
+Error: release staging failed: timed out waiting for the condition
+```
+
+This is most likely caused by a failed liveness (or readiness) probe attempted
+during the deployment process. By default, these probes are run against the root
+page of the deployed application on port 5000. If your application isn't configured
+to serve anything at the root page, or is configured to run on a specific port
+*other* than 5000, this check fails.
+
+If it fails, you should see these failures in the events for the relevant
+Kubernetes namespace. These events look like the following example:
+
+```plaintext
+LAST SEEN TYPE REASON OBJECT MESSAGE
+3m20s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Readiness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
+3m32s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Liveness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
+```
+
+To change the port used for the liveness checks, pass
+[custom values to the Helm chart](customize.md#customize-values-for-helm-chart)
+used by Auto DevOps:
+
+1. Create a directory and file at the root of your repository named `.gitlab/auto-deploy-values.yaml`.
+
+1. Populate the file with the following content, replacing the port values with
+ the actual port number your application is configured to use:
+
+ ```yaml
+ service:
+ internalPort: <port_value>
+ externalPort: <port_value>
+ ```
+
+1. Commit your changes.
+
+After committing your changes, subsequent probes should use the newly-defined ports.
+The page that's probed can also be changed by overriding the `livenessProbe.path`
+and `readinessProbe.path` values (shown in the
+[default `values.yaml`](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml)
+file) in the same fashion.
diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
index 5f8dfcdfc05..0dabb80204a 100644
--- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
+++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Upgrading deployments for newer Auto Deploy dependencies (Auto Deploy template, auto-deploy-image and auto-deploy-app chart)
+# Upgrading deployments for newer Auto Deploy dependencies
[Auto Deploy](stages.md#auto-deploy) is a feature that deploys your application to a Kubernetes cluster.
It consists of several dependencies:
@@ -114,7 +114,7 @@ If your Auto DevOps project has an active environment that was deployed with the
job saves a backup for 1 week in a job artifact called `helm-2-release-backups`.
The backup is in a Kubernetes manifest file that can be restored using
`kubectl apply -f $backup`.
-1. Remove the `MIGRATE_HELM_2TO3` variable.
+1. Remove the `MIGRATE_HELM_2TO3` CI/CD variable.
#### In-Cluster PostgreSQL Channel 2
@@ -145,11 +145,11 @@ steps to upgrade to v2:
them to `production` first to delete the unstable tracks.
1. Verify your project is [using the v2 `auto-deploy-image`](#verify-dependency-versions).
If not, [specify the version](#use-a-specific-version-of-auto-deploy-dependencies).
-1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable with a value of `true`
+1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` CI/CD variable with a value of `true`
in the GitLab CI/CD settings.
1. Create a new pipeline and run the `production` job to renew the resource architecture
with the v2 `auto-deploy-app chart`.
-1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable.
+1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` variable.
### Use a specific version of Auto Deploy dependencies
@@ -167,7 +167,7 @@ include:
### Ignore warnings and continue deploying
If you are certain that the new chart version is safe to be deployed, you can add
-the `AUTO_DEVOPS_FORCE_DEPLOY_V<major-version-number>` [environment variable](customize.md#build-and-deployment)
+the `AUTO_DEVOPS_FORCE_DEPLOY_V<major-version-number>` [CI/CD variable](customize.md#build-and-deployment)
to force the deployment to continue.
For example, if you want to deploy the `v2.0.0` chart on a deployment that previously
diff --git a/doc/topics/autodevops/upgrading_postgresql.md b/doc/topics/autodevops/upgrading_postgresql.md
index a0c4a41f90d..35b9d2e055c 100644
--- a/doc/topics/autodevops/upgrading_postgresql.md
+++ b/doc/topics/autodevops/upgrading_postgresql.md
@@ -27,14 +27,14 @@ involves:
## Prerequisites
1. Install
- [`kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+ [`kubectl`](https://kubernetes.io/docs/tasks/tools/).
1. Ensure that you can access your Kubernetes cluster using `kubectl`.
This varies based on Kubernetes providers.
1. Prepare for downtime. The steps below include taking the application offline
so that the in-cluster database does not get modified after the database dump is created.
1. Ensure you have not set `POSTGRES_ENABLED` to `false`, as this setting deletes
any existing channel 1 database. For more information, see
- [Detected an existing PostgreSQL database](index.md#detected-an-existing-postgresql-database).
+ [Detected an existing PostgreSQL database](troubleshooting.md#detected-an-existing-postgresql-database).
NOTE:
If you have configured Auto DevOps to have staging,
diff --git a/doc/topics/git/cherry_picking.md b/doc/topics/git/cherry_picking.md
new file mode 100644
index 00000000000..5a0867371bb
--- /dev/null
+++ b/doc/topics/git/cherry_picking.md
@@ -0,0 +1,53 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+comments: false
+---
+
+# Cherry Pick
+
+Given an existing commit on one branch, apply the change to another branch.
+
+This can be useful for backporting bug fixes to previous release branches. Make
+the commit on the default branch, and then cherry pick it into the release branch.
+
+## Sample workflow
+
+1. Check out a new `stable` branch from the default branch:
+
+ ```shell
+ git checkout master
+ git checkout -b stable
+ ```
+
+1. Change back to the default branch:
+
+ ```shell
+ git checkout master
+ ```
+
+1. Make any required changes, then commit the changes:
+
+ ```shell
+ git add changed_file.rb
+ git commit -m 'Fix bugs in changed_file.rb'
+ ```
+
+1. Review the commit log and copy the SHA of the latest commit:
+
+ ```shell
+ git log
+ ```
+
+1. Check out the `stable` branch:
+
+ ```shell
+ git checkout stable
+ ```
+
+1. Cherry pick the commit by using the SHA copied previously:
+
+ ```shell
+ git cherry-pick <commit SHA>
+ ```
diff --git a/doc/topics/git/feature_branch_development.md b/doc/topics/git/feature_branch_development.md
index 842c39f0bfd..5f4b5632f33 100644
--- a/doc/topics/git/feature_branch_development.md
+++ b/doc/topics/git/feature_branch_development.md
@@ -56,7 +56,7 @@ In this case, the feature branch would be `release-X-Y`. Assuming the `release-X
![Create merge request](img/create_merge_request_v13_1.png)
-1. After you click **Create merge request**, you'll see an option to **Change branches**. Select that option.
+1. After you click **Create merge request**, an option to **Change branches** displays. Select that option.
1. In the **New Merge Request** screen, you can now select the **Source** and **Target** branches.
In the screenshot shown,
@@ -73,10 +73,10 @@ we have selected `test-branch` as the source, and `release-13-0` as the target.
From test-branch into release-13-0
```
- An entry like this confirms that your MR will **not** merge into master.
+ An entry like this confirms your merge request's destination.
1. Make any additional changes in the **New Merge Request** screen, and click **Submit merge request**.
-1. In the new merge request, look for **Request to merge**. You'll see an entry similar to:
+1. In the new merge request, look for **Request to merge**. An entry similar to this displays:
```plaintext
Request to merge test-branch into release-13-0
diff --git a/doc/topics/git/how_to_install_git/index.md b/doc/topics/git/how_to_install_git/index.md
index 17c5f31705f..8b097c4c1da 100644
--- a/doc/topics/git/how_to_install_git/index.md
+++ b/doc/topics/git/how_to_install_git/index.md
@@ -9,9 +9,9 @@ type: howto
# Installing Git **(FREE)**
To begin contributing to GitLab projects,
-you will need to install the Git client on your computer.
+you must install the Git client on your computer.
-This article will show you how to install Git on macOS, Ubuntu Linux and Windows.
+This article shows you how to install Git on macOS, Ubuntu Linux and Windows.
Information on [installing Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
is also available at the official Git website.
diff --git a/doc/topics/git/index.md b/doc/topics/git/index.md
index 52e8a42de76..2c28bdcb0ed 100644
--- a/doc/topics/git/index.md
+++ b/doc/topics/git/index.md
@@ -14,7 +14,7 @@ large projects with speed and efficiency.
[GitLab](https://about.gitlab.com) is a Git-based fully integrated platform for
software development. Besides Git's functionalities, GitLab has a lot of
powerful [features](https://about.gitlab.com/features/) to enhance your
-[workflow](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/).
+[workflow](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/).
We've gathered some resources to help you to get the best from Git with GitLab.
@@ -22,7 +22,7 @@ More information is also available on the [Git website](https://git-scm.com).
## Getting started
-The following resources will help you get started with Git:
+The following resources can help you get started with Git:
- [Git-ing started with Git](https://www.youtube.com/watch?v=Ce5nz5n41z4),
a video introduction to Git.
@@ -42,7 +42,7 @@ The following resources will help you get started with Git:
- [Git stash](../../university/training/topics/stash.md)
- [Git file blame](../../user/project/repository/git_blame.md)
- [Git file history](../../user/project/repository/git_history.md)
-- [Git tags](../../university/training/user_training.md#tags)
+- [Git tags](tags.md)
### Concepts
@@ -84,7 +84,7 @@ The following are advanced topics for those who want to get the most out of Git:
- [Introduction to Git rebase, force-push, and merge conflicts](git_rebase.md)
- [Server Hooks](../../administration/server_hooks.md)
- [Git Attributes](../../user/project/git_attributes.md)
-- Git Submodules: [Using Git submodules with GitLab CI](../../ci/git_submodules.md#using-git-submodules-with-gitlab-ci)
+- Git Submodules: [Using Git submodules with GitLab CI](../../ci/git_submodules.md)
- [Partial Clone](partial_clone.md)
## API
diff --git a/doc/topics/git/lfs/index.md b/doc/topics/git/lfs/index.md
index 14bb28d2477..11c0fcc2373 100644
--- a/doc/topics/git/lfs/index.md
+++ b/doc/topics/git/lfs/index.md
@@ -269,3 +269,46 @@ You might choose to do this if you are using an appliance like a <!-- vale gitla
GitLab can't verify LFS objects. Pushes then fail if you have GitLab LFS support enabled.
To stop push failure, LFS support can be disabled in the [Project settings](../../../user/project/settings/index.md), which also disables GitLab LFS value-adds (Verifying LFS objects, UI integration for LFS).
+
+### Missing LFS objects
+
+An error about a missing LFS object may occur in either of these situations:
+
+- When migrating LFS objects from disk to object storage, with error messages like:
+
+ ```plaintext
+ ERROR -- : Failed to transfer LFS object
+ 006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ with error: No such file or directory @ rb_sysopen -
+ /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ ```
+
+ (Line breaks have been added for legibility.)
+
+- When running the
+ [integrity check for LFS objects](../../../administration/raketasks/check.md#uploaded-files-integrity)
+ with the `VERBOSE=1` parameter.
+
+The database can have records for LFS objects which are not on disk. The database entry may
+[prevent a new copy of the object being pushed](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49241).
+To delete these references:
+
+1. [Start a rails console](../../../administration/operations/rails_console.md).
+1. Query the object that's reported as missing in the rails console, to return a file path:
+
+ ```ruby
+ lfs_object = LfsObject.find_by(oid: '006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7')
+ lfs_object.file.path
+ ```
+
+1. Check on disk if it exists:
+
+ ```shell
+ ls -al /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ ```
+
+1. If the file is not present, remove the database record via the rails console:
+
+ ```ruby
+ lfs_object.destroy
+ ```
diff --git a/doc/topics/git/numerous_undo_possibilities_in_git/index.md b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
index c263609125f..76fc9bc92b0 100644
--- a/doc/topics/git/numerous_undo_possibilities_in_git/index.md
+++ b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
@@ -64,7 +64,7 @@ To avoid chaos with
development workflows have to be followed. It depends on your internal
workflow how certain changes or commits can be undone or changed.
-[GitLab Flow](https://about.gitlab.com/blog/2014/09/29/gitlab-flow/) provides a good
+[GitLab Flow](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/) provides a good
balance between developers clashing with each other while
developing the same feature and cooperating seamlessly. However, it does not enable
joined development of the same feature by multiple developers by default.
diff --git a/doc/topics/git/partial_clone.md b/doc/topics/git/partial_clone.md
index d9c239486f5..7f2543f040a 100644
--- a/doc/topics/git/partial_clone.md
+++ b/doc/topics/git/partial_clone.md
@@ -23,13 +23,13 @@ Git 2.22.0 or later is required.
> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/2553) in GitLab 12.10.
Storing large binary files in Git is normally discouraged, because every large
-file added will be downloaded by everyone who clones or fetches changes
+file added is downloaded by everyone who clones or fetches changes
thereafter. This is slow, if not a complete obstruction when working from a slow
or unreliable internet connection.
Using partial clone with a file size filter solves this problem, by excluding
troublesome large files from clones and fetches. When Git encounters a missing
-file, it will be downloaded on demand.
+file, it's downloaded on demand.
When cloning a repository, use the `--filter=blob:limit=<size>` argument. For example,
to clone the repository excluding files larger than 1 megabyte:
@@ -58,7 +58,7 @@ Updating files: 100% (13008/13008), done.
Filtering content: 100% (3/3), 131.24 MiB | 4.65 MiB/s, done.
```
-The output will be longer because Git will first clone the repository excluding
+The output is longer because Git first clones the repository excluding
files larger than 1 megabyte, and second download any missing large files needed
to checkout the `master` branch.
@@ -109,8 +109,8 @@ For more details, see the Git documentation for
## Filter by file path
WARNING:
-Partial Clone using `sparse` filters is experimental, slow, and will
-significantly increase Gitaly resource utilization when cloning and fetching.
+Partial Clone using `sparse` filters is experimental, slow, and
+significantly increases Gitaly resource utilization when cloning and fetching.
Deeper integration between Partial Clone and Sparse Checkout is being explored
through the `--filter=sparse:oid=<blob-ish>` filter spec, but this is highly
@@ -143,7 +143,7 @@ For more details, see the Git documentation for
```
1. **Create a new Git repository and fetch.** Support for `--filter=sparse:oid`
- using the clone command is incomplete, so we will emulate the clone command
+ using the clone command is incomplete, so we emulate the clone command
by hand, using `git init` and `git fetch`. Follow
[issue tracking support for `--filter=sparse:oid`](https://gitlab.com/gitlab-org/git/-/issues/4)
for updates.
@@ -171,7 +171,7 @@ For more details, see the Git documentation for
WARNING:
Git integrations with `bash`, `zsh`, etc and editors that automatically
- show Git status information often run `git fetch` which will fetch the
+ show Git status information often run `git fetch` which fetches the
entire repository. You many need to disable or reconfigure these
integrations.
diff --git a/doc/topics/git/tags.md b/doc/topics/git/tags.md
new file mode 100644
index 00000000000..76e3cff3edc
--- /dev/null
+++ b/doc/topics/git/tags.md
@@ -0,0 +1,41 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Tags
+
+Tags are useful for marking certain deployments and releases for later
+reference. Git supports two types of tags:
+
+- Annotated tags: An unchangeable part of Git history.
+- Lightweight (soft) tags: Tags that can be set and removed as needed.
+
+Many projects combine an annotated release tag with a stable branch. Consider
+setting deployment or release tags automatically.
+
+## Tags sample workflow
+
+1. Create a lightweight tag.
+1. Create an annotated tag.
+1. Push the tags to the remote repository.
+
+```shell
+git checkout master
+
+# Lightweight tag
+git tag my_lightweight_tag
+
+# Annotated tag
+git tag -a v1.0 -m ‘Version 1.0’
+
+# Show list of the existing tags
+git tag
+
+git push origin --tags
+```
+
+## Additional resources
+
+- [Tagging](https://git-scm.com/book/en/v2/Git-Basics-Tagging) Git reference page
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index 528a9a4ba00..be4903e2cb9 100644
--- a/doc/topics/git/troubleshooting_git.md
+++ b/doc/topics/git/troubleshooting_git.md
@@ -45,7 +45,7 @@ set to 50MB. The default is 1MB.
**If pushing over SSH**, first check your SSH configuration as 'Broken pipe'
errors can sometimes be caused by underlying issues with SSH (such as
authentication). Make sure that SSH is correctly configured by following the
-instructions in the [SSH troubleshooting](../../ssh/README.md#troubleshooting) documentation.
+instructions in the [SSH troubleshooting](../../ssh/README.md#troubleshooting-ssh-connections) documentation.
If you're a GitLab administrator and have access to the server, you can also prevent
session timeouts by configuring SSH `keep alive` either on the client or on the server.
diff --git a/doc/topics/gitlab_flow.md b/doc/topics/gitlab_flow.md
index d02573a0e06..c238951be51 100644
--- a/doc/topics/gitlab_flow.md
+++ b/doc/topics/gitlab_flow.md
@@ -187,7 +187,7 @@ The name of a branch might be dictated by organizational standards.
When you are done or want to discuss the code, open a merge request.
A merge request is an online place to discuss the change and review the code.
-If you open the merge request but do not assign it to anyone, it is a [draft merge request](../user/project/merge_requests/work_in_progress_merge_requests.md).
+If you open the merge request but do not assign it to anyone, it is a [draft merge request](../user/project/merge_requests/drafts.md).
These are used to discuss the proposed implementation but are not ready for inclusion in the `master` branch yet.
Start the title of the merge request with `[Draft]`, `Draft:` or `(Draft)` to prevent it from being merged before it's ready.
diff --git a/doc/university/index.md b/doc/university/index.md
index 8b6c2d834f9..0d194c7708d 100644
--- a/doc/university/index.md
+++ b/doc/university/index.md
@@ -55,7 +55,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [Creating a Project in GitLab - Video](https://www.youtube.com/watch?v=7p0hrpNaJ14)
1. [How to Create Files and Directories](https://about.gitlab.com/blog/2016/02/10/feature-highlight-create-files-and-directories-from-files-page/)
1. [GitLab To-Do List](https://about.gitlab.com/blog/2016/03/02/gitlab-todos-feature-highlight/)
-1. [GitLab Work in Progress (WIP) Flag](https://about.gitlab.com/blog/2016/01/08/feature-highlight-wip/)
+1. [GitLab Draft Flag](https://about.gitlab.com/blog/2016/01/08/feature-highlight-wip/)
### 1.5. Migrating from other Source Control
@@ -120,7 +120,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [GitLab and Docker - Video](https://www.youtube.com/watch?v=ugOrCcbdHko&index=12&list=PLFGfElNsQthbQu_IWlNOxul0TbS_2JH-e)
1. [How we scale GitLab with built in Docker](https://about.gitlab.com/blog/2016/06/21/how-we-scale-gitlab-by-having-docker-built-in/)
1. [Continuous Integration, Delivery, and Deployment with GitLab](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/)
-1. [Deployments and Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
+1. [Deployments and Environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
1. [Sequential, Parallel or Custom Pipelines](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/)
1. [Setting up GitLab Runner For Continuous Integration](https://about.gitlab.com/blog/2016/03/01/gitlab-runner-with-docker/)
1. [Setting up GitLab Runner on DigitalOcean](https://about.gitlab.com/blog/2016/04/19/how-to-set-up-gitlab-runner-on-digitalocean/)
@@ -134,7 +134,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [GitLab Flow - Video](https://youtu.be/enMumwvLAug?list=PLFGfElNsQthZnwMUFi6rqkyUZkI00OxIV)
1. [GitLab Flow vs Forking in GitLab - Video](https://www.youtube.com/watch?v=UGotqAUACZA)
-1. [GitLab Flow Overview](https://about.gitlab.com/blog/2014/09/29/gitlab-flow/)
+1. [GitLab Flow Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/)
1. [Always Start with an Issue](https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/)
1. [GitLab Flow Documentation](../topics/gitlab_flow.md)
diff --git a/doc/university/training/gitlab_flow/feature_branches.png b/doc/university/training/gitlab_flow/feature_branches.png
deleted file mode 100644
index 612e0248222..00000000000
--- a/doc/university/training/gitlab_flow/feature_branches.png
+++ /dev/null
Binary files differ
diff --git a/doc/university/training/index.md b/doc/university/training/index.md
index 13cf4184560..f69bd51b341 100644
--- a/doc/university/training/index.md
+++ b/doc/university/training/index.md
@@ -34,7 +34,6 @@ This section contains the following topics:
- [Merge conflicts](topics/merge_conflicts.md).
- [Rollback commits](topics/rollback_commits.md).
- [Subtree](topics/subtree.md).
-- [Tags](topics/tags.md).
- [Unstage](topics/unstage.md).
## Additional Resources
diff --git a/doc/university/training/topics/cherry_picking.md b/doc/university/training/topics/cherry_picking.md
index 2f806ad2590..f0f815baa94 100644
--- a/doc/university/training/topics/cherry_picking.md
+++ b/doc/university/training/topics/cherry_picking.md
@@ -1,36 +1,8 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-comments: false
+redirect_to: '../../../topics/git/cherry_picking.md'
---
-# Cherry Pick
+This document was moved to [another location](../../../topics/git/cherry_picking.md).
-- Given an existing commit on one branch, apply the change to another branch
-- Useful for backporting bug fixes to previous release branches
-- Make the commit on the master branch and pick in to stable
-
-## Cherry Pick sample workflow
-
-1. Check out a new 'stable' branch from 'master'
-1. Change back to 'master'
-1. Edit '`cherry_pick.rb`' and commit the changes.
-1. Check commit log to get the commit SHA
-1. Check out the 'stable' branch
-1. Cherry pick the commit using the SHA obtained earlier
-
-```shell
-git checkout master
-git checkout -b stable
-git checkout master
-
-# Edit `cherry_pick.rb`
-git add cherry_pick.rb
-git commit -m 'Fix bugs in cherry_pick.rb'
-git log
-# Copy commit SHA
-git checkout stable
-
-git cherry-pick <commit SHA>
-```
+<!-- This redirect file can be deleted after <2021-06-01>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/university/training/topics/tags.md b/doc/university/training/topics/tags.md
index ca438e04a55..28fd8400d99 100644
--- a/doc/university/training/topics/tags.md
+++ b/doc/university/training/topics/tags.md
@@ -1,52 +1,8 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-comments: false
-type: reference
+redirect_to: '../../../topics/git/tags.md'
---
-# Tags
+This document was moved to [another location](../../../topics/git/tags.md).
-- Useful for marking deployments and releases
-- Annotated tags are an unchangeable part of Git history
-- Soft/lightweight tags can be set and removed at will
-- Many projects combine an annotated release tag with a stable branch
-- Consider setting deployment/release tags automatically
-
-## Tags sample workflow
-
-- Create a lightweight tag
-- Create an annotated tag
-- Push the tags to the remote repository
-
-```shell
-git checkout master
-
-# Lightweight tag
-git tag my_lightweight_tag
-
-# Annotated tag
-git tag -a v1.0 -m ‘Version 1.0’
-
-# Show list of the existing tags
-git tag
-
-git push origin --tags
-```
-
-**Additional resources**
-
-<https://git-scm.com/book/en/Git-Basics-Tagging>
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+<!-- This redirect file can be deleted after <2021-06-01>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/update/index.md b/doc/update/index.md
index a07a6f4b0b7..5c26ddb7ec6 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -138,16 +138,46 @@ pending_job_classes = scheduled_queue.select { |job| job["class"] == "Background
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }
```
+## Checking for pending Advanced Search migrations
+
+This section is only applicable if you have enabled the [Elasticsearch
+integration](../integration/elasticsearch.md).
+
+Major releases require all [Advanced Search
+migrations](../integration/elasticsearch.md#advanced-search-migrations) to
+be finished from the most recent minor release in your current version
+before the major version upgrade. You can find pending migrations by
+running the following command:
+
+**For Omnibus installations**
+
+```shell
+sudo gitlab-rake gitlab:elastic:list_pending_migrations
+```
+
+**For installations from source**
+
+```shell
+cd /home/git/gitlab
+sudo -u git -H bundle exec rake gitlab:elastic:list_pending_migrations
+```
+
+### What do I do if my Advanced Search migrations are stuck?
+
+See [how to retry a halted
+migration](../integration/elasticsearch.md#retry-a-halted-migration).
+
## Upgrade paths
-Although you can generally upgrade through multiple GitLab versions in one go,
+You can generally upgrade through multiple GitLab versions in one go,
+although this is discouraged for [zero downtime upgrades](#upgrading-without-downtime) and
sometimes this can cause issues.
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.x` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` - > `13.x (latest)`
+`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` - > [latest `13.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
The following table, while not exhaustive, shows some examples of the supported
upgrade paths.
@@ -174,13 +204,20 @@ Identify a [supported upgrade path](#upgrade-paths).
More significant migrations may occur during major release upgrades. To ensure these are successful:
-1. Increment to the first minor version (`x.0.x`) during the major version jump.
+1. Increment to the first minor version (`X.0.Z`) during the major version jump.
1. Proceed with upgrading to a newer release.
It's also important to ensure that any background migrations have been fully completed
before upgrading to a new major version. To see the current size of the `background_migration` queue,
[Check for background migrations before upgrading](#checking-for-background-migrations-before-upgrading).
+If you have enabled the [Elasticsearch
+integration](../integration/elasticsearch.md), then you will also need to ensure
+all Advanced Search migrations are completed in the last minor version within
+your current version. Be sure to [check for pending Advanced Search
+migrations](#checking-for-pending-advanced-search-migrations) before proceeding
+with the major version upgrade.
+
If your GitLab instance has any runners associated with it, it is very
important to upgrade GitLab Runner to match the GitLab minor version that was
upgraded to. This is to ensure [compatibility with GitLab versions](https://docs.gitlab.com/runner/#compatibility-with-gitlab-versions).
@@ -192,7 +229,8 @@ patch version of GitLab without having to take your GitLab instance offline.
However, for this to work there are the following requirements:
- You can only upgrade 1 minor release at a time. So from 9.1 to 9.2, not to
- 9.3.
+ 9.3. If you skip releases, database modifications may be run in the wrong
+ sequence [and leave the database schema in a broken state](https://gitlab.com/gitlab-org/gitlab/-/issues/321542).
- You have to use [post-deployment
migrations](../development/post_deployment_migrations.md) (included in
[zero downtime update steps below](#steps)).
@@ -235,7 +273,7 @@ which is the latest patch release of 9.4. When GitLab 9.5.0 is released this
installation can be safely upgraded to 9.5.0 without requiring downtime if the
requirements mentioned above are met. You can also skip 9.5.0 and upgrade to
9.5.1 after it's released, but you **can not** upgrade straight to 9.6.0; you
-_have_ to first upgrade to a 9.5.x release.
+_have_ to first upgrade to a 9.5.Z release.
**Example 2:** You are running a large GitLab installation using version 9.4.2,
which is the latest patch release of 9.4. GitLab 9.5 includes some background
@@ -243,7 +281,7 @@ migrations, and 10.0 will require these to be completed (processing any
remaining jobs for you). Skipping 9.5 is not possible without downtime, and due
to the background migrations would require potentially hours of downtime
depending on how long it takes for the background migrations to complete. To
-work around this you will have to upgrade to 9.5.x first, then wait at least a
+work around this you will have to upgrade to 9.5.Z first, then wait at least a
week before upgrading to 10.0.
**Example 3:** You use MySQL as the database for GitLab. Any upgrade to a new
@@ -361,9 +399,9 @@ with the older Rails version - which could cause non-GET requests to
fail for [multi-node GitLab installations](https://docs.gitlab.com/omnibus/update/#multi-node--ha-deployment).
So, if you are using multiple Rails servers and specifically upgrading from 13.0,
-all servers must first be upgraded to 13.1.X before upgrading to 13.2.0 or later:
+all servers must first be upgraded to 13.1.Z before upgrading to 13.2.0 or later:
-1. Ensure all GitLab web nodes are on GitLab 13.1.X.
+1. Ensure all GitLab web nodes are on GitLab 13.1.Z.
1. Optionally, enable the `global_csrf_token` feature flag to enable new
method of CSRF token generation:
@@ -383,33 +421,33 @@ any downgrades would result to all sessions being invalidated and users are logg
### 12.1.0
-If you are planning to upgrade from `12.0.x` to `12.10.x`, it is necessary to
-perform an intermediary upgrade to `12.1.x` before upgrading to `12.10.x` to
+If you are planning to upgrade from `12.0.Z` to `12.10.Z`, it is necessary to
+perform an intermediary upgrade to `12.1.Z` before upgrading to `12.10.Z` to
avoid issues like [#215141](https://gitlab.com/gitlab-org/gitlab/-/issues/215141).
### 12.0.0
In 12.0.0 we made various database related changes. These changes require that
-users first upgrade to the latest 11.11 patch release. After upgraded to 11.11.x,
-users can upgrade to 12.0.x. Failure to do so may result in database migrations
+users first upgrade to the latest 11.11 patch release. After upgraded to 11.11.Z,
+users can upgrade to 12.0.Z. Failure to do so may result in database migrations
not being applied, which could lead to application errors.
-It is also required that you upgrade to 12.0.x before moving to a later version
-of 12.x.
+It is also required that you upgrade to 12.0.Z before moving to a later version
+of 12.Y.
Example 1: you are currently using GitLab 11.11.8, which is the latest patch
-release for 11.11.x. You can upgrade as usual to 12.0.x.
+release for 11.11.Z. You can upgrade as usual to 12.0.Z.
-Example 2: you are currently using a version of GitLab 10.x. To upgrade, first
-upgrade to the last 10.x release (10.8.7) then the last 11.x release (11.11.8).
-After upgraded to 11.11.8 you can safely upgrade to 12.0.x.
+Example 2: you are currently using a version of GitLab 10.Y. To upgrade, first
+upgrade to the last 10.Y release (10.8.7) then the last 11.Y release (11.11.8).
+After upgraded to 11.11.8 you can safely upgrade to 12.0.Z.
See our [documentation on upgrade paths](../policy/maintenance.md#upgrade-recommendations)
for more information.
### Upgrades from versions earlier than 8.12
-- `8.11.x` and earlier: you might have to upgrade to `8.12.0` specifically before you can upgrade to `8.17.7`. This was [reported in an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/207259).
+- `8.11.Z` and earlier: you might have to upgrade to `8.12.0` specifically before you can upgrade to `8.17.7`. This was [reported in an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/207259).
- [CI changes prior to version 8.0](https://docs.gitlab.com/omnibus/update/README.html#updating-gitlab-ci-from-prior-540-to-version-714-via-omnibus-gitlab)
when it was merged into GitLab.
diff --git a/doc/update/upgrading_from_ce_to_ee.md b/doc/update/upgrading_from_ce_to_ee.md
index 36f0078a4f7..71fd4efb16d 100644
--- a/doc/update/upgrading_from_ce_to_ee.md
+++ b/doc/update/upgrading_from_ce_to_ee.md
@@ -63,7 +63,9 @@ sudo -u git -H git checkout EE_BRANCH
```shell
cd /home/git/gitlab
-sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
+sudo -u git -H bundle config set deployment 'true'
+sudo -u git -H bundle config set without 'development test mysql aws kerberos'
+sudo -u git -H bundle install
# Optional: clean up old gems
sudo -u git -H bundle clean
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index a76e9fb4504..42acb7552e4 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -127,49 +127,41 @@ Git v2.28 is recommended.
To check you are running the minimum required Git version, see
[Git versions](../install/requirements.md#git-versions).
-In Debian or Ubuntu:
-
-```shell
-# Make sure Git is version 2.29.0 or higher
-git --version
+From GitLab 13.6, we recommend you use the [Git version provided by
+Gitaly](https://gitlab.com/gitlab-org/gitaly/-/issues/2729)
+that:
-# Remove packaged Git
-sudo apt-get remove git-core
+- Is always at the version required by GitLab.
+- May contain custom patches required for proper operation.
+```shell
# Install dependencies
-sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev build-essential
-
-# Download and compile pcre2 from source
-curl --silent --show-error --location "https://ftp.pcre.org/pub/pcre/pcre2-10.33.tar.gz" --output pcre2.tar.gz
-tar -xzf pcre2.tar.gz
-cd pcre2-10.33
-chmod +x configure
-./configure --prefix=/usr --enable-jit
-make
-make install
-
-# Download and compile from source
-cd /tmp
-curl --remote-name --location --progress "https://www.kernel.org/pub/software/scm/git/git-2.29.0.tar.gz"
-echo 'fa08dc8424ef80c0f9bf307877f9e2e49f1a6049e873530d6747c2be770742ff git-2.29.0.tar.gz' | shasum -a256 -c - && tar -xzf git-2.29.0.tar.gz
-cd git-2.29.0/
-./configure --with-libpcre
-make prefix=/usr/local all
+sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev libpcre2-dev build-essential
-# Install into /usr/local/bin
-sudo make prefix=/usr/local install
+# Clone the Gitaly repository
+git clone https://gitlab.com/gitlab-org/gitaly.git -b <X-Y-stable> /tmp/gitaly
-# You should edit config/gitlab.yml, change the git -> bin_path to /usr/local/bin/git
+# Compile and install Git
+cd /tmp/gitaly
+sudo make git GIT_PREFIX=/usr/local
```
+Replace `<X-Y-stable>` with the stable branch that matches the GitLab version you want to
+install. For example, if you want to install GitLab 13.6, use the branch name `13-6-stable`.
+
+Remember to set `git -> bin_path` to `/usr/local/bin/git` in `config/gitlab.yml`.
+
### 7. Update PostgreSQL
WARNING:
From GitLab 13.0, you must use at least PostgreSQL 11.
-The latest version of GitLab might depend on a more recent PostgreSQL version than what you are currently running (see the [PostgreSQL requirements](../install/requirements.md#postgresql-requirements)).
+The latest version of GitLab might depend on a more recent PostgreSQL version
+than what you're currently running. You may also need to enable some
+extensions. For more information, see the
+[PostgreSQL requirements](../install/requirements.md#postgresql-requirements)
-In order to upgrade PostgreSQL, please refer to its [documentation](https://www.postgresql.org/docs/11/upgrading.html).
+To upgrade PostgreSQL, refer to its [documentation](https://www.postgresql.org/docs/11/upgrading.html).
### 8. Get latest code
@@ -177,8 +169,7 @@ In order to upgrade PostgreSQL, please refer to its [documentation](https://www.
cd /home/git/gitlab
sudo -u git -H git fetch --all --prune
-sudo -u git -H git checkout -- db/structure.sql # local changes will be restored automatically
-sudo -u git -H git checkout -- locale
+sudo -u git -H git checkout -- Gemfile.lock db/structure.sql locale
```
For GitLab Community Edition:
@@ -199,55 +190,7 @@ cd /home/git/gitlab
sudo -u git -H git checkout BRANCH-ee
```
-### 9. Update GitLab Shell
-
-```shell
-cd /home/git/gitlab-shell
-
-sudo -u git -H git fetch --all --tags --prune
-sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_SHELL_VERSION)
-sudo -u git -H make build
-```
-
-### 10. Update GitLab Workhorse
-
-Install and compile GitLab Workhorse.
-
-```shell
-cd /home/git/gitlab
-
-sudo -u git -H bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production
-```
-
-### 11. Update Gitaly
-
-#### Compile Gitaly
-
-```shell
-cd /home/git/gitaly
-sudo -u git -H git fetch --all --tags --prune
-sudo -u git -H git checkout v$(</home/git/gitlab/GITALY_SERVER_VERSION)
-sudo -u git -H make
-```
-
-### 12. Update GitLab Pages
-
-#### Only needed if you use GitLab Pages
-
-Install and compile GitLab Pages. GitLab Pages uses
-[GNU Make](https://www.gnu.org/software/make/).
-If you are not using Linux you may have to run `gmake` instead of
-`make` below.
-
-```shell
-cd /home/git/gitlab-pages
-
-sudo -u git -H git fetch --all --tags --prune
-sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
-sudo -u git -H make
-```
-
-### 13. Update configuration files
+### 9. Update configuration files
#### New configuration options for `gitlab.yml`
@@ -320,12 +263,17 @@ For Ubuntu 16.04.1 LTS:
sudo systemctl daemon-reload
```
-### 14. Install libraries, migrations, etc
+### 10. Install libraries, migrations, etc
```shell
cd /home/git/gitlab
-sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
+# If you haven't done so during installation or a previous upgrade already
+sudo -u git -H bundle config set deployment 'true'
+sudo -u git -H bundle config set without 'development test mysql aws kerberos'
+
+# Update gems
+sudo -u git -H bundle install
# Optional: clean up old gems
sudo -u git -H bundle clean
@@ -334,7 +282,6 @@ sudo -u git -H bundle clean
sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
# Compile GetText PO files
-
sudo -u git -H bundle exec rake gettext:compile RAILS_ENV=production
# Update node dependencies and recompile assets
@@ -344,6 +291,54 @@ sudo -u git -H bundle exec rake yarn:install gitlab:assets:clean gitlab:assets:c
sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
```
+### 11. Update GitLab Shell
+
+```shell
+cd /home/git/gitlab-shell
+
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_SHELL_VERSION)
+sudo -u git -H make build
+```
+
+### 12. Update GitLab Workhorse
+
+Install and compile GitLab Workhorse.
+
+```shell
+cd /home/git/gitlab
+
+sudo -u git -H bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production
+```
+
+### 13. Update Gitaly
+
+#### Compile Gitaly
+
+```shell
+cd /home/git/gitaly
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITALY_SERVER_VERSION)
+sudo -u git -H make
+```
+
+### 14. Update GitLab Pages
+
+#### Only needed if you use GitLab Pages
+
+Install and compile GitLab Pages. GitLab Pages uses
+[GNU Make](https://www.gnu.org/software/make/).
+If you are not using Linux you may have to run `gmake` instead of
+`make` below.
+
+```shell
+cd /home/git/gitlab-pages
+
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
+sudo -u git -H make
+```
+
### 15. Start application
```shell
diff --git a/doc/user/abuse_reports.md b/doc/user/abuse_reports.md
index 935fca8209f..e2f2038f240 100644
--- a/doc/user/abuse_reports.md
+++ b/doc/user/abuse_reports.md
@@ -4,7 +4,7 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Abuse reports
+# Abuse reports **(FREE)**
You can report abuse from other GitLab users to GitLab administrators.
@@ -12,7 +12,7 @@ A GitLab administrator [can then choose](admin_area/abuse_reports.md) to:
- Remove the user, which deletes them from the instance.
- Block the user, which denies them access to the instance.
-- Or remove the report, which retains the users access to the instance.
+- Or remove the report, which retains the user's access to the instance.
You can report a user through their:
diff --git a/doc/user/admin_area/analytics/index.md b/doc/user/admin_area/analytics/index.md
index 5cf5e33f2d2..bea22745e7b 100644
--- a/doc/user/admin_area/analytics/index.md
+++ b/doc/user/admin_area/analytics/index.md
@@ -14,4 +14,3 @@ There are several kinds of statistics:
- [DevOps Report](dev_ops_report.md): Provides an overview of your entire instance's feature usage. **(FREE)**
- [Usage Trends](usage_trends.md): Shows how much data your instance contains, and how that is changing. **(FREE)**
-- [User Cohorts](user_cohorts.md): Display the monthly cohorts of new users and their activities over time. **(FREE)**
diff --git a/doc/user/admin_area/analytics/instance_statistics.md b/doc/user/admin_area/analytics/instance_statistics.md
deleted file mode 100644
index e44dd891029..00000000000
--- a/doc/user/admin_area/analytics/instance_statistics.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'usage_trends.md'
----
-
-This document was moved to [another location](usage_trends.md).
-
-<!-- This redirect file can be deleted after <2022-03-20>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/admin_area/analytics/usage_trends.md b/doc/user/admin_area/analytics/usage_trends.md
index 0c0cae09c16..38cd2dee4e9 100644
--- a/doc/user/admin_area/analytics/usage_trends.md
+++ b/doc/user/admin_area/analytics/usage_trends.md
@@ -40,22 +40,3 @@ in the categories shown in [Total counts](#total-counts).
These charts help you visualize how rapidly these records are being created on your instance.
![Instance Activity Pipelines chart](img/instance_activity_pipelines_chart_v13_6.png)
-
-### Enable or disable Usage Trends
-
-In GitLab version 13.5 only, Usage Trends was under development and not ready for production use.
-It was deployed behind a feature flag that was **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:instance_statistics)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:instance_statistics)
-```
diff --git a/doc/user/admin_area/analytics/user_cohorts.md b/doc/user/admin_area/analytics/user_cohorts.md
index a7c93160b69..ca5dff85757 100644
--- a/doc/user/admin_area/analytics/user_cohorts.md
+++ b/doc/user/admin_area/analytics/user_cohorts.md
@@ -1,36 +1,8 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: '../user_cohorts.md'
---
-# Cohorts **(FREE)**
+This document was moved to [another location](../user_cohorts.md).
-As a benefit of having the [usage ping active](../settings/usage_statistics.md),
-you can analyze your users' GitLab activities over time.
-
-To see user cohorts, go to **Admin Area > Overview > Users**.
-
-## Overview
-
-How do you interpret the user cohorts table? Let's review an example with the
-following user cohorts:
-
-![User cohort example](img/cohorts_v13_9.png)
-
-For the cohort of March 2020, three users were added to this server and have
-been active since this month. One month later (April 2020), two users are still
-active. Five months later (August 2020), one user from this cohort is still
-active, or 33% of the original cohort of three that joined in March.
-
-The **Inactive users** column shows the number of users who were added during
-the month, but who never had any activity in the instance.
-
-How do we measure the activity of users? GitLab considers a user active if:
-
-- The user signs in.
-- The user has Git activity (whether push or pull).
-- The user visits pages related to dashboards, projects, issues, or merge
- requests ([introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/54947) in GitLab 11.8).
-- The user uses the API.
-- The user uses the GraphQL API.
+<!-- This redirect file can be deleted after <2021-06-01>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/admin_area/approving_users.md b/doc/user/admin_area/approving_users.md
index af4d4e86e69..9141d7f488d 100644
--- a/doc/user/admin_area/approving_users.md
+++ b/doc/user/admin_area/approving_users.md
@@ -7,30 +7,49 @@ type: howto
# Users pending approval
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
+A user in _pending approval_ state requires action by an administrator. A user sign up can be in a
+pending approval state because an administrator has enabled either, or both, of the following
+options:
-When [Require admin approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) is enabled, any user that signs up for an account using the registration form is placed under a **Pending approval** state.
+- [Require admin approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) setting.
+- [User cap](settings/sign_up_restrictions.md#user-cap).
-A user pending approval is functionally identical to a [blocked](blocking_unblocking_users.md) user.
+When a user registers for an account while this setting is enabled:
+
+- The user is placed in a **Pending approval** state.
+- The user sees a message telling them their account is awaiting approval by an administrator.
A user pending approval:
-- Will not be able to sign in.
-- Cannot access Git repositories or the API.
-- Will not receive any notifications from GitLab.
+- Is functionally identical to a [blocked](blocking_unblocking_users.md) user.
+- Cannot sign in.
+- Cannot access Git repositories or the GitLab API.
+- Does not receive any notifications from GitLab.
- Does not consume a [seat](../../subscriptions/self_managed/index.md#billable-users).
-## Approving a user
+An administrator must [approve their sign up](#approve-or-reject-a-user-sign-up) to allow them to
+sign in.
+
+## View user sign ups pending approval
+
+To view user sign ups pending approval:
+
+1. Go to **Admin Area > Overview > Users**.
+1. Select the **Pending approval** tab.
+
+## Approve or reject a user sign up
+
+A user sign up pending approval can be approved or rejected from the Admin Area.
-A user that is pending approval can be approved from the Admin Area. To do this:
+To approve or reject a user sign up:
-1. Navigate to **Admin Area > Overview > Users**.
-1. Click on the **Pending approval** tab.
-1. Select a user.
-1. Under the **Account** tab, click **Approve user**.
+1. Go to **Admin Area > Overview > Users**.
+1. Select the **Pending approval** tab.
+1. In the user's row select settings (**{settings}**).
+1. Select **Approve** or **Reject**.
Approving a user:
-1. Activates their account.
-1. Changes the user's state to active and it consumes a
-[seat](../../subscriptions/self_managed/index.md#billable-users).
+- Activates their account.
+- Changes the user's state to active.
+- Consumes a subscription [seat](../../subscriptions/self_managed/index.md#billable-users).
diff --git a/doc/user/admin_area/credentials_inventory.md b/doc/user/admin_area/credentials_inventory.md
index 02659276b53..053cee82634 100644
--- a/doc/user/admin_area/credentials_inventory.md
+++ b/doc/user/admin_area/credentials_inventory.md
@@ -11,7 +11,9 @@ type: howto
GitLab administrators are responsible for the overall security of their instance. To assist, GitLab provides a Credentials inventory to keep track of all the credentials that can be used to access their self-managed instance.
-Using Credentials inventory, you can see all the personal access tokens (PAT) and SSH keys that exist in your GitLab instance. In addition, you can [revoke](#revoke-a-users-personal-access-token) and [delete](#delete-a-users-ssh-key) and see:
+Using Credentials inventory, you can see all the personal access tokens (PAT), SSH keys, and GPG keys
+that exist in your GitLab instance. In addition, you can [revoke](#revoke-a-users-personal-access-token)
+and [delete](#delete-a-users-ssh-key) and see:
- Who they belong to.
- Their access scope.
@@ -23,7 +25,7 @@ To access the Credentials inventory, navigate to **Admin Area > Credentials**.
The following is an example of the Credentials inventory page:
-![Credentials inventory page](img/credentials_inventory_v13_4.png)
+![Credentials inventory page](img/credentials_inventory_v13_10.png)
## Revoke a user's personal access token
@@ -31,7 +33,7 @@ The following is an example of the Credentials inventory page:
If you see a **Revoke** button, you can revoke that user's PAT. Whether you see a **Revoke** button depends on the token state, and if an expiration date has been set. For more information, see the following table:
-| Token state | [Token expiry enforced?](settings/account_and_limit_settings.md#optional-enforcement-of-personal-access-token-expiry) | Show Revoke button? | Comments |
+| Token state | [Token expiration enforced?](settings/account_and_limit_settings.md#optional-non-enforcement-of-personal-access-token-expiration) | Show Revoke button? | Comments |
|-------------|------------------------|--------------------|----------------------------------------------------------------------------|
| Active | Yes | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
| Active | No | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
@@ -50,3 +52,39 @@ You can **Delete** a user's SSH key by navigating to the credentials inventory's
The instance then notifies the user.
![Credentials inventory page - SSH keys](img/credentials_inventory_ssh_keys_v13_5.png)
+
+## Review existing GPG keys
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282429) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-the-gpg-keys-view).
+
+You can view all existing GPG in your GitLab instance by navigating to the
+credentials inventory GPG Keys tab, as well as the following properties:
+
+- Who the GPG key belongs to.
+- The ID of the GPG key.
+- Whether the GPG key is [verified or unverified](../project/repository/gpg_signed_commits/index.md)
+
+![Credentials inventory page - GPG keys](img/credentials_inventory_gpg_keys_v13_10.png)
+
+### Enable or disable the GPG keys view
+
+Enabling or disabling the GPG keys view is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:credential_inventory_gpg_keys)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:credential_inventory_gpg_keys)
+```
diff --git a/doc/user/admin_area/analytics/img/cohorts_v13_9.png b/doc/user/admin_area/img/cohorts_v13_9.png
index 6a616b201c9..6a616b201c9 100644
--- a/doc/user/admin_area/analytics/img/cohorts_v13_9.png
+++ b/doc/user/admin_area/img/cohorts_v13_9.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png b/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png
new file mode 100644
index 00000000000..2486332c477
--- /dev/null
+++ b/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_v13_10.png b/doc/user/admin_area/img/credentials_inventory_v13_10.png
new file mode 100644
index 00000000000..e41bbf35a8e
--- /dev/null
+++ b/doc/user/admin_area/img/credentials_inventory_v13_10.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_v13_4.png b/doc/user/admin_area/img/credentials_inventory_v13_4.png
deleted file mode 100644
index 06925ea2f6f..00000000000
--- a/doc/user/admin_area/img/credentials_inventory_v13_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index b5e51e8d4c0..6877148bd6d 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -21,24 +21,24 @@ Only admin users can access the Admin Area.
The Admin Area is made up of the following sections:
-| Section | Description |
-|:-----------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Section | Description |
+|:-----------------------------------------------|:------------|
| **{overview}** [Overview](#overview-section) | View your GitLab [Dashboard](#admin-dashboard), and administer [projects](#administering-projects), [users](#administering-users), [groups](#administering-groups), [jobs](#administering-jobs), [runners](#administering-runners), and [Gitaly servers](#administering-gitaly-servers). |
-| **{monitor}** Monitoring | View GitLab [system information](#system-information), and information on [background jobs](#background-jobs), [logs](#logs), [health checks](monitoring/health_check.md), [requests profiles](#requests-profiles), and [audit events](#audit-events). |
-| **{messages}** Messages | Send and manage [broadcast messages](broadcast_messages.md) for your users. |
-| **{hook}** System Hooks | Configure [system hooks](../../system_hooks/system_hooks.md) for many events. |
-| **{applications}** Applications | Create system [OAuth applications](../../integration/oauth_provider.md) for integrations with other services. |
-| **{slight-frown}** Abuse Reports | Manage [abuse reports](abuse_reports.md) submitted by your users. |
-| **{license}** License **(STARTER ONLY)** | Upload, display, and remove [licenses](license.md). |
-| **{cloud-gear}** Kubernetes | Create and manage instance-level [Kubernetes clusters](../instance/clusters/index.md). |
-| **{push-rules}** Push rules **(STARTER ONLY)** | Configure pre-defined Git [push rules](../../push_rules/push_rules.md) for projects. Also, configure [merge requests approvers rules](merge_requests_approvals.md). **(PREMIUM SELF)** |
-| **{location-dot}** Geo **(PREMIUM SELF)** | Configure and maintain [Geo nodes](geo_nodes.md). |
-| **{key}** Deploy keys | Create instance-wide [SSH deploy keys](../../ssh/README.md#deploy-keys). |
-| **{lock}** Credentials **(ULTIMATE SELF)** | View [credentials](credentials_inventory.md) that can be used to access your instance. |
-| **{template}** Service Templates | Create [service templates](../project/integrations/services_templates.md) for projects. |
-| **{labels}** Labels | Create and maintain [labels](labels.md) for your GitLab instance. |
-| **{appearance}** Appearance | Customize [GitLab appearance](appearance.md). |
-| **{settings}** Settings | Modify the [settings](settings/index.md) for your GitLab instance. |
+| **{monitor}** Monitoring | View GitLab [system information](#system-information), and information on [background jobs](#background-jobs), [logs](#logs), [health checks](monitoring/health_check.md), [requests profiles](#requests-profiles), and [audit events](#audit-events). |
+| **{messages}** Messages | Send and manage [broadcast messages](broadcast_messages.md) for your users. |
+| **{hook}** System Hooks | Configure [system hooks](../../system_hooks/system_hooks.md) for many events. |
+| **{applications}** Applications | Create system [OAuth applications](../../integration/oauth_provider.md) for integrations with other services. |
+| **{slight-frown}** Abuse Reports | Manage [abuse reports](abuse_reports.md) submitted by your users. |
+| **{license}** License | Upload, display, and remove [licenses](license.md). |
+| **{cloud-gear}** Kubernetes | Create and manage instance-level [Kubernetes clusters](../instance/clusters/index.md). |
+| **{push-rules}** Push rules | Configure pre-defined Git [push rules](../../push_rules/push_rules.md) for projects. Also, configure [merge requests approvers rules](merge_requests_approvals.md). |
+| **{location-dot}** Geo | Configure and maintain [Geo nodes](geo_nodes.md). |
+| **{key}** Deploy keys | Create instance-wide [SSH deploy keys](../project/deploy_keys/index.md). |
+| **{lock}** Credentials | View [credentials](credentials_inventory.md) that can be used to access your instance. |
+| **{template}** Service Templates | Create [service templates](../project/integrations/services_templates.md) for projects. |
+| **{labels}** Labels | Create and maintain [labels](labels.md) for your GitLab instance. |
+| **{appearance}** Appearance | Customize [GitLab appearance](appearance.md). |
+| **{settings}** Settings | Modify the [settings](settings/index.md) for your GitLab instance. |
## Admin Dashboard
@@ -51,14 +51,14 @@ To access the Dashboard, either:
The Dashboard is the default view of the Admin Area, and is made up of the following sections:
-| Section | Description |
-|:-----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Projects | The total number of projects, up to 10 of the latest projects, and the option of creating a new project. |
-| Users | The total number of users, up to 10 of the latest users, the option of creating a new user, and a link to [**Users statistics**](#users-statistics). |
-| Groups | The total number of groups, up to 10 of the latest groups, and the option of creating a new group. |
-| Statistics | Totals of all elements of the GitLab instance. |
+| Section | Description |
+|:-----------|:------------|
+| Projects | The total number of projects, up to 10 of the latest projects, and the option of creating a new project. |
+| Users | The total number of users, up to 10 of the latest users, the option of creating a new user, and a link to [**Users statistics**](#users-statistics). |
+| Groups | The total number of groups, up to 10 of the latest groups, and the option of creating a new group. |
+| Statistics | Totals of all elements of the GitLab instance. |
| Features | All features available on the GitLab instance. Enabled features are marked with a green circle icon, and disabled features are marked with a power icon. |
-| Components | The major components of GitLab and the version number of each. A link to the Gitaly Servers is also included. |
+| Components | The major components of GitLab and the version number of each. A link to the Gitaly Servers is also included. |
## Overview section
@@ -157,6 +157,22 @@ All impersonation activities are [captured with audit events](../../administrati
![user impersonation button](img/impersonate_user_button_v13_8.png)
+#### User Permission Export **(PREMIUM SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1772) in GitLab 13.8.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292436) in GitLab 13.9.
+
+An administrator can export user permissions for all users in the GitLab instance from the Admin Area's Users page.
+The export lists direct membership the users have in groups and projects.
+
+The following data is included in the export:
+
+- Username
+- Email
+- Type
+- Path
+- Access level ([Project](../permissions.md#project-members-permissions) and [Group](../permissions.md#group-members-permissions))
+
#### Users statistics
The **Users statistics** page provides an overview of user accounts by role. These statistics are
@@ -170,6 +186,10 @@ The following totals are also included:
GitLab billing is based on the number of [**Billable users**](../../subscriptions/self_managed/index.md#billable-users).
+### User cohorts
+
+The [Cohorts](user_cohorts.md) tab displays the monthly cohorts of new users and their activities over time.
+
### Administering Groups
You can administer all groups in the GitLab instance from the Admin Area's Groups page.
@@ -187,7 +207,7 @@ sort order is by **Last created**.
To search for groups by name, enter your criteria in the search field. The group search is case
insensitive, and applies partial matching.
-To [Create a new group](../group/index.md#create-a-new-group) click **New group**.
+To [Create a new group](../group/index.md#create-a-group) click **New group**.
### Administering Jobs
@@ -202,7 +222,7 @@ Click the **All** tab to list all jobs. Click the **Pending**, **Running**, or *
For each job, the following details are listed:
| Field | Description |
-|--------- | ----------- |
+|----------|-------------|
| Status | Job status, either **passed**, **skipped**, or **failed**. |
| Job | Includes links to the job, branch, and the commit that started the job. |
| Pipeline | Includes a link to the specific pipeline. |
@@ -246,7 +266,7 @@ You can also filter runners by status, type, and tag. To filter:
For each runner, the following attributes are listed:
| Attribute | Description |
-| ------------ | ----------- |
+|--------------|-------------|
| Type | One or more of the following states: shared, group, specific, locked, or paused |
| Runner token | Token used to identify the runner, and which the runner uses to communicate with the GitLab instance |
| Description | Description given to the runner when it was created |
@@ -269,7 +289,7 @@ To access the **Gitaly Servers** page, go to **Admin Area > Overview > Gitaly Se
For each Gitaly server, the following details are listed:
| Field | Description |
-| -------------- | ----------- |
+|----------------|-------------|
| Storage | Repository storage |
| Address | Network address on which the Gitaly server is listening |
| Server version | Gitaly version |
@@ -285,7 +305,7 @@ The following topics document the **Monitoring** section of the Admin Area.
The **System Info** page provides the following statistics:
| Field | Description |
-| :----------- | :---------- |
+|:-------------|:------------|
| CPU | Number of CPU cores available |
| Memory Usage | Memory in use, and total memory available |
| Disk Usage | Disk space in use, and total disk space available |
@@ -318,7 +338,7 @@ Since GitLab 13.0, **Log** view has been removed from the admin dashboard since
For multi-node systems we recommend ingesting the logs into services like Elasticsearch and Splunk.
| Log file | Contents |
-| :---------------------- | :------- |
+|:------------------------|:---------|
| `application.log` | GitLab user activity |
| `git_json.log` | Failed GitLab interaction with Git repositories |
| `production.log` | Requests received from Unicorn, and the actions taken to serve those requests |
diff --git a/doc/user/admin_area/license.md b/doc/user/admin_area/license.md
index 505f54e9ae9..89417de4bab 100644
--- a/doc/user/admin_area/license.md
+++ b/doc/user/admin_area/license.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Activate GitLab EE with a license **(STARTER ONLY)**
+# Activate GitLab EE with a license **(PREMIUM SELF)**
To activate all GitLab Enterprise Edition (EE) functionality, you need to upload
a license. It's only possible to activate GitLab Enterprise Edition, so first verify which edition
diff --git a/doc/user/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md
index 70416c224c7..0f391118215 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -152,20 +152,20 @@ To set a limit on how long these sessions are valid:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3649) in GitLab Ultimate 12.6.
-Users can optionally specify an expiration date for
+Users can optionally specify a lifetime for
[personal access tokens](../../profile/personal_access_tokens.md).
-This expiration date is not a requirement, and can be set to any arbitrary date.
+This lifetime is not a requirement, and can be set to any arbitrary number of days.
Personal access tokens are the only tokens needed for programmatic access to GitLab.
However, organizations with security requirements may want to enforce more protection by
requiring the regular rotation of these tokens.
-### Setting a limit
+### Setting a lifetime
-Only a GitLab administrator can set a limit. Leaving it empty means
+Only a GitLab administrator can set a lifetime. Leaving it empty means
there are no restrictions.
-To set a limit on how long personal access tokens are valid:
+To set a lifetime on how long personal access tokens are valid:
1. Navigate to **Admin Area > Settings > General**.
1. Expand the **Account and limit** section.
@@ -180,24 +180,28 @@ Once a lifetime for personal access tokens is set, GitLab:
allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime,
or remove it, before revocation takes place.
-## Enforcement of SSH key expiration **(ULTIMATE SELF)**
+## Optional enforcement of SSH key expiration **(ULTIMATE SELF)**
-GitLab administrators can choose to enforce the expiration of SSH keys after their expiration dates.
-If you enable this feature, this disables all _expired_ SSH keys.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250480) in GitLab 13.9.
-To do this:
+By default, expired SSH keys **can still be used**.
+You can prevent the use of expired SSH keys with the following steps:
1. Navigate to **Admin Area > Settings > General**.
1. Expand the **Account and limit** section.
1. Select the **Enforce SSH key expiration** checkbox.
-## Optional enforcement of Personal Access Token expiry **(ULTIMATE SELF)**
+Enforcing SSH key expiration immediately disables all expired SSH keys.
+
+For more information, see the following issue on [SSH key expiration](https://gitlab.com/gitlab-org/gitlab/-/issues/320970).
+
+## Optional non-enforcement of Personal Access Token expiration **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214723) in GitLab Ultimate 13.1.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/296881) in GitLab 13.9.
-GitLab administrators can choose to prevent personal access tokens from expiring
-automatically. The tokens are usable after the expiry date, unless they are revoked explicitly.
+By default, expired personal access tokens (PATs) cannot be used.
+You can allow the use of expired PATs with the following steps:
To do this:
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 761fc6477d6..3d19bde9a26 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -27,7 +27,7 @@ From now on, every existing project and newly created ones that don't have a
`.gitlab-ci.yml`, will use the Auto DevOps pipelines.
If you want to disable it for a specific project, you can do so in
-[its settings](../../../topics/autodevops/index.md#enablingdisabling-auto-devops).
+[its settings](../../../topics/autodevops/index.md#enable-or-disable-auto-devops).
## Maximum artifacts size **(FREE SELF)**
@@ -50,15 +50,15 @@ To change it at the:
1. Change the value of maximum artifacts size (in MB).
1. Click **Save changes** for the changes to take effect.
-- [Group level](../../group/index.md#group-settings) (this will override the instance setting):
+- Group level (this will override the instance setting):
- 1. Go to the group's **Settings > CI / CD > General Pipelines**.
+ 1. Go to the group's **Settings > CI/CD > General Pipelines**.
1. Change the value of **maximum artifacts size (in MB)**.
1. Click **Save changes** for the changes to take effect.
-- [Project level](../../../ci/pipelines/settings.md) (this will override the instance and group settings):
+- Project level (this will override the instance and group settings):
- 1. Go to the project's **Settings > CI / CD > General Pipelines**.
+ 1. Go to the project's **Settings > CI/CD > General Pipelines**.
1. Change the value of **maximum artifacts size (in MB)**.
1. Click **Save changes** for the changes to take effect.
@@ -99,6 +99,13 @@ are allowed to expire.
This setting takes precedence over the [project level setting](../../../ci/pipelines/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
If disabled at the instance level, you cannot enable this per-project.
+To disable the setting:
+
+1. Go to **Admin Area > Settings > CI/CD**.
+1. Expand **Continuous Integration and Deployment**.
+1. Clear the **Keep the latest artifacts for all jobs in the latest successful pipelines** checkbox.
+1. Click **Save changes**
+
When you disable the feature, the latest artifacts do not immediately expire.
A new pipeline must run before the latest artifacts can expire and be deleted.
diff --git a/doc/user/admin_area/settings/email.md b/doc/user/admin_area/settings/email.md
index 2eaff417ba3..5deb71698ff 100644
--- a/doc/user/admin_area/settings/email.md
+++ b/doc/user/admin_area/settings/email.md
@@ -29,7 +29,7 @@ legal/auditing/compliance reasons.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22560) in GitLab 11.5.
-This configuration option sets the email hostname for [private commit emails](../../profile/index.md#private-commit-email).
+This configuration option sets the email hostname for [private commit emails](../../profile/index.md#use-an-automatically-generated-private-commit-email).
By default it is set to `users.noreply.YOUR_CONFIGURED_HOSTNAME`.
In order to change this option:
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index 3377b1674db..cbdc617d7d9 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -35,7 +35,7 @@ Access the default page for admin area settings by navigating to **Admin Area >
| ------ | ----------- |
| [Elasticsearch](../../../integration/elasticsearch.md#enabling-advanced-search) | Elasticsearch integration. Elasticsearch AWS IAM. |
| [Kroki](../../../administration/integration/kroki.md#enable-kroki-in-gitlab) | Allow rendering of diagrams in AsciiDoc and Markdown documents using [kroki.io](https://kroki.io). |
-| [PlantUML](../../../administration/integration/plantuml.md#gitlab) | Allow rendering of PlantUML diagrams in AsciiDoc and Markdown documents. |
+| [PlantUML](../../../administration/integration/plantuml.md) | Allow rendering of PlantUML diagrams in documents. |
| [Slack application](../../../user/project/integrations/gitlab_slack_application.md#configuration) **(FREE SAAS)** | Slack integration allows you to interact with GitLab via slash commands in a chat window. This option is only available on GitLab.com, though it may be [available for self-managed instances in the future](https://gitlab.com/gitlab-org/gitlab/-/issues/28164). |
| [Third party offers](third_party_offers.md) | Control the display of third party offers. |
| [Snowplow](../../../development/snowplow.md) | Configure the Snowplow integration. |
diff --git a/doc/user/admin_area/settings/instance_template_repository.md b/doc/user/admin_area/settings/instance_template_repository.md
index 7630f0c2fbd..600d99934aa 100644
--- a/doc/user/admin_area/settings/instance_template_repository.md
+++ b/doc/user/admin_area/settings/instance_template_repository.md
@@ -5,9 +5,9 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Instance template repository **(PREMIUM SELF)** **(FREE)**
+# Instance template repository **(PREMIUM SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5986) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.3.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5986) in GitLab Premium 11.3.
In hosted systems, enterprises often have a need to share their own templates
across teams. This feature allows an administrator to pick a project to be the
@@ -23,7 +23,7 @@ select the project to serve as the custom template repository.
![File templates in the Admin Area](img/file_template_admin_area.png)
After that, you can add custom templates to the selected repository and use them for the entire instance.
-They will be available on the [Web Editor's dropdown](../../project/repository/web_editor.md#template-dropdowns)
+They are available in the [Web Editor's dropdown](../../project/repository/web_editor.md#template-dropdowns)
and through the [API settings](../../../api/settings.md).
Templates must be added to a specific subdirectory in the repository,
@@ -60,12 +60,12 @@ extension and not be empty. So, the hierarchy should look like this:
|-- another_metrics-dashboard.yml
```
-Your custom templates will be displayed on the dropdown menu when a new file is added through the GitLab UI:
+Your custom templates are displayed on the dropdown menu when a new file is added through the GitLab UI:
![Custom template dropdown menu](img/file_template_user_dropdown.png)
-If this feature is disabled or no templates are present, there will be
-no "Custom" section in the selection dropdown.
+If this feature is disabled or no templates are present,
+no **Custom** section displays in the selection dropdown.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/settings/project_integration_management.md b/doc/user/admin_area/settings/project_integration_management.md
index 18491f92650..0b9f039880a 100644
--- a/doc/user/admin_area/settings/project_integration_management.md
+++ b/doc/user/admin_area/settings/project_integration_management.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project integration management
+# Project integration management **(FREE)**
Project integrations can be configured and enabled by project administrators. As a GitLab instance
administrator, you can set default configuration parameters for a given integration that all projects
diff --git a/doc/user/admin_area/settings/push_event_activities_limit.md b/doc/user/admin_area/settings/push_event_activities_limit.md
index 1d6424face0..7032c1031a9 100644
--- a/doc/user/admin_area/settings/push_event_activities_limit.md
+++ b/doc/user/admin_area/settings/push_event_activities_limit.md
@@ -14,7 +14,7 @@ allowed at once. If the number of events is greater than this, GitLab creates
bulk push event instead.
For example, if 4 branches are pushed and the limit is currently set to 3,
-you'll see the following in the activity feed:
+the activity feed displays:
![Bulk push event](img/bulk_push_event_v12_4.png)
diff --git a/doc/user/admin_area/settings/sign_up_restrictions.md b/doc/user/admin_area/settings/sign_up_restrictions.md
index 0945471b11b..0078db286a8 100644
--- a/doc/user/admin_area/settings/sign_up_restrictions.md
+++ b/doc/user/admin_area/settings/sign_up_restrictions.md
@@ -30,7 +30,7 @@ To disable sign ups:
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/267568) in GitLab 13.6.
-When this setting is enabled, any user visiting your GitLab domain and signing up for a new account must be explicitly [approved](../approving_users.md#approving-a-user) by an administrator before they can start using their account. This setting is enabled by default for newly created instances. This setting is only applicable if sign ups are enabled.
+When this setting is enabled, any user visiting your GitLab domain and signing up for a new account must be explicitly [approved](../approving_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using their account. In GitLab 13.6 and later, this setting is enabled by default for new GitLab instances. It is only applicable if sign ups are enabled.
To require administrator approval for new sign ups:
@@ -56,10 +56,29 @@ To enforce confirmation of the email address used for new sign ups:
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292600) in GitLab 13.9.
When the number of billable users reaches the user cap, any user who is added or requests access must be
-[approved](../approving_users.md#approving-a-user) by an administrator before they can start using
+[approved](../approving_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using
their account.
-If an administrator increases or removes the user cap, the users in pending approval state are
+If an administrator [increases](#set-the-user-cap-number) or [removes](#remove-the-user-cap) the
+user cap, the users in pending approval state are automatically approved in a background job.
+
+### Set the user cap number
+
+1. Go to **Admin Area > Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Enter a number in **User cap**.
+1. Select **Save changes**.
+
+New user sign ups are subject to the user cap restriction.
+
+## Remove the user cap
+
+1. Go to **Admin Area > Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Remove the number from **User cap**.
+1. Select **Save changes**.
+
+New users sign ups are not subject to the user cap restriction. Users in pending approval state are
automatically approved in a background job.
## Soft email confirmation
diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index 2bb6adbc32b..ada44115cec 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -61,7 +61,7 @@ sequenceDiagram
## Usage Ping **(FREE SELF)**
-See [Usage Ping guide](../../../development/usage_ping.md).
+See [Usage Ping guide](../../../development/usage_ping/index.md).
## Instance-level analytics availability
diff --git a/doc/user/admin_area/settings/visibility_and_access_controls.md b/doc/user/admin_area/settings/visibility_and_access_controls.md
index 0fcdbf3ca90..e335a9031d5 100644
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ b/doc/user/admin_area/settings/visibility_and_access_controls.md
@@ -29,7 +29,7 @@ To change the default branch protection:
For more details, see [Protected branches](../../project/protected_branches.md).
-To change this setting for a specific group, see [Default branch protection for groups](../../group/index.md#changing-the-default-branch-protection-of-a-group)
+To change this setting for a specific group, see [Default branch protection for groups](../../group/index.md#change-the-default-branch-protection-of-a-group)
### Disable group owners from updating default branch protection **(PREMIUM SELF)**
@@ -55,7 +55,7 @@ To change the default project creation protection:
1. Select the desired option.
1. Click **Save changes**.
-For more details, see [Default project-creation level](../../group/index.md#default-project-creation-level).
+For more details, see [Specify who can add projects to a group](../../group/index.md#specify-who-can-add-projects-to-a-group).
## Default project deletion protection **(PREMIUM SELF)**
@@ -79,7 +79,7 @@ The default behavior of [Delayed Project deletion](https://gitlab.com/gitlab-org
[Immediate deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) in GitLab 13.2.
Projects in a group (but not a personal namespace) can be deleted after a delayed period, by
-[configuring in Group Settings](../../group/index.md#enabling-delayed-project-removal).
+[configuring in Group Settings](../../group/index.md#enable-delayed-project-removal).
The default period is seven days, and can be changed. Setting this period to `0` enables immediate removal
of projects or groups.
diff --git a/doc/user/admin_area/user_cohorts.md b/doc/user/admin_area/user_cohorts.md
new file mode 100644
index 00000000000..f3c913b409a
--- /dev/null
+++ b/doc/user/admin_area/user_cohorts.md
@@ -0,0 +1,36 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Cohorts **(FREE)**
+
+As a benefit of having the [usage ping active](settings/usage_statistics.md),
+you can analyze your users' GitLab activities over time.
+
+To see user cohorts, go to **Admin Area > Overview > Users**.
+
+## Overview
+
+How do you interpret the user cohorts table? Let's review an example with the
+following user cohorts:
+
+![User cohort example](img/cohorts_v13_9.png)
+
+For the cohort of March 2020, three users were added to this server and have
+been active since this month. One month later (April 2020), two users are still
+active. Five months later (August 2020), one user from this cohort is still
+active, or 33% of the original cohort of three that joined in March.
+
+The **Inactive users** column shows the number of users who were added during
+the month, but who never had any activity in the instance.
+
+How do we measure the activity of users? GitLab considers a user active if:
+
+- The user signs in.
+- The user has Git activity (whether push or pull).
+- The user visits pages related to dashboards, projects, issues, or merge
+ requests ([introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/54947) in GitLab 11.8).
+- The user uses the API.
+- The user uses the GraphQL API.
diff --git a/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png b/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png
new file mode 100644
index 00000000000..ad108dabf73
--- /dev/null
+++ b/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png
Binary files differ
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index f5da373ee6d..fe35d575373 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -61,6 +61,6 @@ The following analytics features are available at the project level:
- [Insights](../project/insights/index.md). **(ULTIMATE)**
- [Issue](../group/issues_analytics/index.md). **(PREMIUM)**
- [Merge Request](merge_request_analytics.md), enabled with the `project_merge_request_analytics`
- [feature flag](../../development/feature_flags/development.md#enabling-a-feature-flag-locally-in-development). **(PREMIUM)**
+ [feature flag](../../development/feature_flags/index.md#enabling-a-feature-flag-locally-in-development). **(PREMIUM)**
- [Repository](repository_analytics.md). **(FREE)**
- [Value Stream](value_stream_analytics.md). **(FREE)**
diff --git a/doc/user/analytics/merge_request_analytics.md b/doc/user/analytics/merge_request_analytics.md
index 3edbe3e8aa4..909eb7e585f 100644
--- a/doc/user/analytics/merge_request_analytics.md
+++ b/doc/user/analytics/merge_request_analytics.md
@@ -39,6 +39,15 @@ Merge Request Analytics could be used when:
The following visualizations and data are available, representing all merge requests that were merged in the given date range.
+### Mean time to merge
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229389) in GitLab 13.9.
+
+The mean time to merge (MTTM) metric shows the average time between when a merge request is created,
+and when it is merged. To view how the MTTM changes over time, compare MTTM across different date ranges.
+
+![Mean time to merge](img/mr_mean_time_to_merge_metric_v13_9.png "Merge Request Analytics - MTTM metric showing the average time it takes from initiating a MR to being merged")
+
### Throughput chart
The throughput chart shows the number of merge requests merged per month.
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_configuration_snippet_v13.10.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_configuration_snippet_v13.10.png
new file mode 100644
index 00000000000..80c550a3ae7
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_configuration_snippet_v13.10.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png
new file mode 100644
index 00000000000..3a2799ecdc1
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png
new file mode 100644
index 00000000000..656ba7652cd
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png
new file mode 100644
index 00000000000..3750af8f455
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index 49311ccc7cd..036da0068b5 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -25,7 +25,7 @@ you can run fuzz tests as part your CI/CD workflow.
- GraphQL
- Form bodies, JSON, or XML
- One of the following assets to provide APIs to test:
- - OpenAPI v2 API definition
+ - OpenAPI v2 or v3 API definition
- HTTP Archive (HAR) of API requests to test
- Postman Collection v2.0 or v2.1
@@ -54,7 +54,7 @@ changes, other pipelines, or other scanners) during a scan could cause inaccurat
There are three ways to perform scans. See the configuration section for the one you wish to use:
-- [OpenAPI v2 specification](#openapi-specification)
+- [OpenAPI v2 or v3 specification](#openapi-specification)
- [HTTP Archive (HAR)](#http-archive-har)
- [Postman Collection v2.0 or v2.1](#postman-collection)
@@ -64,13 +64,80 @@ Examples of both configurations can be found here:
- [Example HTTP Archive (HAR) project](https://gitlab.com/gitlab-org/security-products/demos/api-fuzzing-example/-/tree/har)
- [Example Postman Collection project](https://gitlab.com/gitlab-org/security-products/demos/api-fuzzing/postman-api-fuzzing-example)
+WARNING:
+GitLab 14.0 will require that you place API fuzzing configuration files (for example,
+`gitlab-api-fuzzing-config.yml`) in your repository's `.gitlab` directory instead of your
+repository's root. You can continue using your existing configuration files as they are, but
+starting in GitLab 14.0, GitLab will not check your repository's root for configuration files.
+
+### Configuration form
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299234) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../../../user/feature_flags.md), enabled by default.
+> - It's enabled on GitLab.com.
+> - It's recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-api-fuzzing-configuration-form). **(ULTIMATE)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+The API fuzzing configuration form helps you create or modify your project's API fuzzing
+configuration. The form lets you choose values for the most common API fuzzing options and builds
+a YAML snippet that you can paste in your GitLab CI/CD configuration.
+
+To generate an API Fuzzing configuration snippet:
+
+1. From your project's home page, go to **Security & Compliance > Configuration** in the left
+ sidebar.
+1. Select **Configure** in the **API Fuzzing** row.
+1. Complete the form as needed. Read below for more information on available configuration options.
+1. Select **Generate code snippet**.
+
+A modal opens with the YAML snippet corresponding to the options you've selected in the form.
+
+![API Fuzzing configuration snippet](img/api_fuzzing_configuration_snippet_v13.10.png)
+
+Select **Copy code and open `.gitlab-ci.yml` file** to copy the snippet to your clipboard and be redirected
+to your project's `.gitlab-ci.yml` file where you can paste the YAML configuration.
+
+Select **Copy code only** to copy the snippet to your clipboard and close the modal.
+
+#### Enable or disable API Fuzzing configuration form **(ULTIMATE)**
+
+The API Fuzzing configuration form is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can opt to disable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:api_fuzzing_configuration_ui)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:api_fuzzing_configuration_ui)
+```
+
### OpenAPI Specification
+> Support for OpenAPI Specification v3 was
+> [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228652) in GitLab 13.9.
+
The [OpenAPI Specification](https://www.openapis.org/) (formerly the Swagger Specification) is an
API description format for REST APIs. This section shows you how to configure API fuzzing by using
an OpenAPI specification to provide information about the target API to test. OpenAPI specifications
are provided as a file system resource or URL.
+API fuzzing uses an OpenAPI document to generate the request body. When a request body is required,
+the body generation is limited to these body types:
+
+- `application/x-www-form-urlencoded`
+- `multipart/form-data`
+- `application/json`
+
Follow these steps to configure API fuzzing in GitLab with an OpenAPI specification:
1. To use API fuzzing, you must [include](../../../ci/yaml/README.md#includetemplate)
@@ -100,7 +167,7 @@ Follow these steps to configure API fuzzing in GitLab with an OpenAPI specificat
FUZZAPI_PROFILE: Quick-10
```
-1. Provide the location of the OpenAPI v2 specification. You can provide the specification as a file
+1. Provide the location of the OpenAPI specification. You can provide the specification as a file
or URL. Specify the location by adding the `FUZZAPI_OPENAPI` variable:
```yaml
@@ -193,7 +260,8 @@ target API to test:
FUZZAPI_PROFILE: Quick-10
```
-1. Add the `FUZZAPI_HAR` variable and set it to the HAR file's location:
+1. Provide the location of the HAR specification. You can provide the specification as a file
+ or URL. [URL support was introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285020) in GitLab 13.10 and later. Specify the location by adding the `FUZZAPI_HAR` variable:
```yaml
include:
@@ -284,7 +352,8 @@ information about the target API to test:
FUZZAPI_PROFILE: Quick-10
```
-1. Add the `FUZZAPI_POSTMAN_COLLECTION` variable and set it to the Postman Collection's location:
+1. Provide the location of the Postman Collection specification. You can provide the specification as a file
+ or URL. [URL support was introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285020) in GitLab 13.10 and later. Specify the location by adding the `FUZZAPI_POSTMAN_COLLECTION` variable:
```yaml
include:
@@ -327,6 +396,60 @@ WARNING:
the API can, it may also trigger bugs in the API. This includes actions like modifying and deleting
data. Only run fuzzing against a test server.
+#### Postman variables
+
+Postman allows the developer to define placeholders that can be used in different parts of the
+requests. These placeholders are called variables, as explained in [Using variables](https://learning.postman.com/docs/sending-requests/variables/).
+You can use variables to store and reuse values in your requests and scripts. For example, you can
+edit the collection to add variables to the document:
+
+![Edit collection variable tab View](img/api_fuzzing_postman_collection_edit_variable.png)
+
+You can then use the variables in sections such as URL, headers, and others:
+
+![Edit request using variables View](img/api_fuzzing_postman_request_edit.png)
+
+Variables can be defined at different [scopes](https://learning.postman.com/docs/sending-requests/variables/#variable-scopes)
+(for example, Global, Collection, Environment, Local, and Data). In this example, they're defined at
+the Environment scope:
+
+![Edit environment variables View](img/api_fuzzing_postman_environment_edit_variable.png)
+
+When you export a Postman collection, only Postman collection variables are exported into the
+Postman file. For example, Postman does not export environment-scoped variables into the Postman
+file.
+
+By default, the API fuzzer uses the Postman file to resolve Postman variable values. If a JSON file
+is set in a GitLab CI environment variable `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`, then the JSON
+file takes precedence to get Postman variable values.
+
+Although Postman can export environment variables into a JSON file, the format is not compatible
+with the JSON expected by `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`.
+
+Here is an example of using `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`:
+
+```yaml
+include:
+ - template: API-Fuzzing.gitlab-ci.yml
+
+variables:
+ FUZZAPI_PROFILE: Quick-10
+ FUZZAPI_POSTMAN_COLLECTION: postman-collection_serviceA.json
+ FUZZAPI_TARGET_URL: http://test-deployment/
+ FUZZAPI_POSTMAN_COLLECTION_VARIABLES: variable-collection-dictionary.json
+```
+
+The file `variable-collection-dictionary.json` is a JSON document. This JSON is an object with
+key-value pairs for properties. The keys are the variables' names, and the values are the variables'
+values. For example:
+
+ ```json
+ {
+ "base_url": "http://127.0.0.1/",
+ "token": "Token 84816165151"
+ }
+ ```
+
### Authentication
Authentication is handled by providing the authentication token as a header or cookie. You can
@@ -502,6 +625,7 @@ repository's root as `.gitlab-api-fuzzing.yml`.
|[`FUZZAPI_OPENAPI`](#openapi-specification) | OpenAPI specification file or URL. |
|[`FUZZAPI_HAR`](#http-archive-har) | HTTP Archive (HAR) file. |
|[`FUZZAPI_POSTMAN_COLLECTION`](#postman-collection) | Postman Collection file. |
+|[`FUZZAPI_POSTMAN_COLLECTION_VARIABLES`](#postman-variables) | Path to a JSON file to extract postman variable values. |
|[`FUZZAPI_OVERRIDES_FILE`](#overrides) | Path to a JSON file containing overrides. |
|[`FUZZAPI_OVERRIDES_ENV`](#overrides) | JSON string containing headers to override. |
|[`FUZZAPI_OVERRIDES_CMD`](#overrides) | Overrides command. |
@@ -523,11 +647,19 @@ repository's root as `.gitlab-api-fuzzing.yml`.
### Overrides
-API Fuzzing provides a method to add or override headers and cookies for all outbound HTTP requests.
+API Fuzzing provides a method to add or override specific items in your request, for example:
+
+- Headers
+- Cookies
+- Query string
+- Form data
+- JSON nodes
+- XML nodes
+
You can use this to inject semantic version headers, authentication, and so on. The
[authentication section](#authentication) includes examples of using overrides for that purpose.
-Overrides use a JSON document to define the headers and cookies:
+Overrides use a JSON document, where each type of override is represented by a JSON object:
```json
{
@@ -538,6 +670,22 @@ Overrides use a JSON document to define the headers and cookies:
"cookies": {
"cookie1": "value",
"cookie2": "value"
+ },
+ "query": {
+ "query-string1": "value",
+ "query-string2": "value"
+ },
+ "body-form": {
+ "form-param1": "value",
+ "form-param1": "value",
+ },
+ "body-json": {
+ "json-path1": "value",
+ "json-path2": "value",
+ },
+ "body-xml" : {
+ "xpath1": "value",
+ "xpath2": "value",
}
}
```
@@ -565,7 +713,94 @@ Example of setting both a header and cookie:
}
```
-You can provide this JSON document as a file or CI/CD variable. You may also provide a command
+Example usage for setting a `body-form` override:
+
+```json
+{
+ "body-form": {
+ "username": "john.doe"
+ }
+}
+```
+
+The override engine uses `body-form` when the request body has only form-data content.
+
+Example usage for setting a `body-json` override:
+
+```json
+{
+ "body-json": {
+ "$.credentials.access-token": "iddqd!42.$"
+ }
+}
+```
+
+Note that each JSON property name in the object `body-json` is set to a [JSON Path](https://goessner.net/articles/JsonPath/)
+expression. The JSON Path expression `$.credentials.access-token` identifies the node to be
+overridden with the value `iddqd!42.$`. The override engine uses `body-json` when the request body
+has only [JSON](https://www.json.org/json-en.html) content.
+
+For example, if the body is set to the following JSON:
+
+```json
+{
+ "credentials" : {
+ "username" :"john.doe",
+ "access-token" : "non-valid-password"
+ }
+}
+```
+
+It is changed to:
+
+```json
+{
+ "credentials" : {
+ "username" :"john.doe",
+ "access-token" : "iddqd!42.$"
+ }
+}
+```
+
+Here's an example for setting a `body-xml` override. The first entry overrides an XML attribute and
+the second entry overrides an XML element:
+
+```json
+{
+ "body-xml" : {
+ "/credentials/@isEnabled": "true",
+ "/credentials/access-token/text()" : "iddqd!42.$"
+ }
+}
+```
+
+Note that each JSON property name in the object `body-xml` is set to an
+[XPath v2](https://www.w3.org/TR/xpath20/)
+expression. The XPath expression `/credentials/@isEnabled` identifies the attribute node to override
+with the value `true`. The XPath expression `/credentials/access-token/text()` identifies the
+element node to override with the value `iddqd!42.$`. The override engine uses `body-xml` when the
+request body has only [XML](https://www.w3.org/XML/)
+content.
+
+For example, if the body is set to the following XML:
+
+```xml
+<credentials isEnabled="false">
+ <username>john.doe</username>
+ <access-token>non-valid-password</access-token>
+</credentials>
+```
+
+It is changed to:
+
+```xml
+<credentials isEnabled="true">
+ <username>john.doe</username>
+ <access-token>iddqd!42.$</access-token>
+</credentials>
+```
+
+You can provide this JSON document as a file or environment variable. You may also provide a command
to generate the JSON document. The command can run at intervals to support values that expire.
#### Using a file
@@ -762,7 +997,7 @@ pipelines. For more information, see the [Security Dashboard documentation](../s
Fuzzing faults show up as vulnerabilities with a severity of Unknown.
Once a fault is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
## Handling False Positives
diff --git a/doc/user/application_security/configuration/index.md b/doc/user/application_security/configuration/index.md
index fe21fdc1f15..4d5e3529762 100644
--- a/doc/user/application_security/configuration/index.md
+++ b/doc/user/application_security/configuration/index.md
@@ -5,14 +5,17 @@ group: Static Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Security Configuration **(ULTIMATE)**
+# Security Configuration **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
-> - SAST configuration was [enabled](https://gitlab.com/groups/gitlab-org/-/epics/3659) in 13.3 and [improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in 13.4.
-> - DAST Profiles feature was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40474) in 13.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6. **(ULTIMATE)**
+> - SAST configuration was [enabled](https://gitlab.com/groups/gitlab-org/-/epics/3659) in 13.3 and [improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in 13.4. **(ULTIMATE)**
+> - DAST Profiles feature was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40474) in 13.4. **(ULTIMATE)**
+> - A simplified version was made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/294076) in GitLab 13.9.
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
-The Security Configuration page displays the configuration state of each security control in the
-current project.
+The Security Configuration page displays what security scans are available, links to documentation and also simple enablement tools for the current project.
To view a project's security configuration, go to the project's home page,
then in the left sidebar go to **Security & Compliance > Configuration**.
@@ -20,10 +23,11 @@ then in the left sidebar go to **Security & Compliance > Configuration**.
For each security control the page displays:
- **Security Control:** Name, description, and a documentation link.
-- **Status:** The security control's status (enabled, not enabled, or available).
- **Manage:** A management option or a documentation link.
-## Status
+## Status **(ULTIMATE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
The status of each security control is determined by the project's latest default branch
[CI pipeline](../../../ci/pipelines/index.md).
@@ -35,7 +39,7 @@ all security features are configured by default.
For SAST, click **View history** to see the `.gitlab-ci.yml` file's history.
-## Manage
+## Manage **(ULTIMATE)**
You can configure the following security controls:
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 6eec1418ef0..909065d7907 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -32,7 +32,7 @@ To integrate security scanners other than Clair and Klar into GitLab, see
You can enable container scanning by doing one of the following:
- [Include the CI job](#configuration) in your existing `.gitlab-ci.yml` file.
-- Implicitly use [Auto Container Scanning](../../../topics/autodevops/stages.md#auto-container-scanning)
+- Implicitly use [Auto Container Scanning](../../../topics/autodevops/stages.md#auto-container-scanning),
provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab compares the found vulnerabilities between the source and target branches, and shows the
@@ -455,7 +455,7 @@ For more information about the vulnerabilities database update, check the
## Interacting with the vulnerabilities
-After a vulnerability is found, you can [interact with it](../index.md#interacting-with-the-vulnerabilities).
+After a vulnerability is found, you can [address it](../index.md#addressing-vulnerabilities).
## Solutions for vulnerabilities (auto-remediation)
@@ -469,7 +469,7 @@ file, it's necessary to set [`GIT_STRATEGY: fetch`](../../../ci/runners/README.m
your `.gitlab-ci.yml` file by following the instructions described in this document's
[overriding the container scanning template](#overriding-the-container-scanning-template) section.
-Read more about the [solutions for vulnerabilities](../index.md#automatic-remediation-for-vulnerabilities).
+Read more about the [solutions for vulnerabilities](../index.md#apply-an-automatic-remediation-for-a-vulnerability).
## Troubleshooting
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index 9e42b3e403a..94a7d5268b7 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -237,7 +237,7 @@ The `covfuzz-ci.yml` is the same as that in the [original synchronous example](h
## Interacting with the vulnerabilities
-After a vulnerability is found, you can [interact with it](../index.md#interacting-with-the-vulnerabilities).
+After a vulnerability is found, you can [address it](../index.md#addressing-vulnerabilities).
The merge request widget lists the vulnerability and contains a button for downloading the fuzzing
artifacts. By clicking one of the detected vulnerabilities, you can see its details.
diff --git a/doc/user/application_security/dast/img/dast_single_v13_0.png b/doc/user/application_security/dast/img/dast_single_v13_0.png
deleted file mode 100644
index 1d528fa0ace..00000000000
--- a/doc/user/application_security/dast/img/dast_single_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 3950c856b40..209dd7ad251 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -9,98 +9,82 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4348) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.4.
-Running [static checks](../sast/index.md) on your code is the first step to detect
-vulnerabilities that can put the security of your code at risk. Yet, once
-deployed, your application is exposed to a new category of possible attacks,
-such as cross-site scripting or broken authentication flaws. This is where
-Dynamic Application Security Testing (DAST) comes into place.
+Your application may be exposed to a new category of attacks once deployed into a new environment. For
+example, application server misconfigurations or incorrect assumptions about security controls may
+not be visible from source code alone. Dynamic Application Security Testing (DAST) checks an
+application for these types of vulnerabilities in a deployed environment. GitLab DAST uses the
+popular open source tool [OWASP Zed Attack Proxy](https://www.zaproxy.org/) to analyze your running
+web application.
NOTE:
The whitepaper ["A Seismic Shift in Application Security"](https://about.gitlab.com/resources/whitepaper-seismic-shift-application-security/)
explains how 4 of the top 6 attacks were application based. Download it to learn how to protect your
organization.
-## Overview
-
-If you're using [GitLab CI/CD](../../../ci/README.md), you can analyze your running web applications
-for known vulnerabilities using Dynamic Application Security Testing (DAST).
-You can take advantage of DAST by either [including the CI job](#configuration) in
-your existing `.gitlab-ci.yml` file or by implicitly using
-[Auto DAST](../../../topics/autodevops/stages.md#auto-dast),
-provided by [Auto DevOps](../../../topics/autodevops/index.md).
-
-GitLab checks the DAST report, compares the found vulnerabilities between the source and target
-branches, and shows the information on the merge request.
+In GitLab, DAST is commonly initiated by a merge request and runs as a job in the CI/CD pipeline.
+You can also run a DAST scan on demand, outside the CI/CD pipeline. Your running web application is
+analyzed for known vulnerabilities. GitLab checks the DAST report, compares the vulnerabilities
+found between the source and target branches, and shows any relevant findings on the merge request.
Note that this comparison logic uses only the latest pipeline executed for the target branch's base
commit. Running the pipeline on any other commit has no effect on the merge request.
-![DAST Widget](img/dast_v13_4.png)
+![DAST widget, showing the vulnerability statistics and a list of vulnerabilities](img/dast_v13_4.png)
-By clicking on one of the detected linked vulnerabilities, you can
-see the details and the URL(s) affected.
+## Enable DAST
-![DAST Widget Clicked](img/dast_single_v13_0.png)
+### Prerequisites
-[Dynamic Application Security Testing (DAST)](https://en.wikipedia.org/wiki/Dynamic_Application_Security_Testing)
-uses the popular open source tool [OWASP Zed Attack Proxy](https://www.zaproxy.org/)
-to perform an analysis on your running web application.
+- GitLab Runner with the [`docker` executor](https://docs.gitlab.com/runner/executors/docker.html).
-By default, DAST executes [ZAP Baseline Scan](https://www.zaproxy.org/docs/docker/baseline-scan/)
-and performs passive scanning only. It doesn't actively attack your application.
-However, DAST can be [configured](#full-scan)
-to also perform an *active scan*: attack your application and produce a more extensive security report.
-It can be very useful combined with [Review Apps](../../../ci/review_apps/index.md).
+To enable DAST, either:
-Note that a pipeline may consist of multiple jobs, including SAST and DAST scanning. If any job
-fails to finish for any reason, the security dashboard doesn't show DAST scanner output. For
-example, if the DAST job finishes but the SAST job fails, the security dashboard doesn't show DAST
-results. On failure, the analyzer outputs an
-[exit code](../../../development/integrations/secure.md#exit-code).
+- Enable [Auto DAST](../../../topics/autodevops/stages.md#auto-dast), provided by
+ [Auto DevOps](../../../topics/autodevops/index.md).
+- [Include the DAST template](#dast-cicd-template) in your existing `.gitlab-ci.yml` file.
-## Use cases
+### DAST CI/CD template
-It helps you automatically find security vulnerabilities in your running web
-applications while you're developing and testing your applications.
+The DAST job is defined in a CI/CD template file you reference in your CI/CD configuration file. The
+template is included with GitLab. Updates to the template are provided with GitLab upgrades. You
+benefit from any improvements and additions.
-## Requirements
+The following templates are available:
-To run a DAST job, you need GitLab Runner with the
-[`docker` executor](https://docs.gitlab.com/runner/executors/docker.html).
+- [`DAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml):
+ Stable version of the DAST CI/CD template.
+- [`DAST.latest.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml):
+ Latest version of the DAST template. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254325)
+ in GitLab 13.8). Please note that the latest version may include breaking changes. Check the
+ [DAST troubleshooting guide](#troubleshooting) if you experience problems.
-## Configuration
+Use the stable template unless you need a feature provided only in the latest template.
-For GitLab 11.9 and later, to enable DAST, you must
-[include](../../../ci/yaml/README.md#includetemplate) the
-[`DAST.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml)
-that's provided as a part of your GitLab installation. For GitLab versions earlier
-than 11.9, you can copy and use the job as defined in that template.
+See the CI/CD [documentation](../../../development/cicd/templates.md#latest-version)
+on template versioning for more information.
-Add the following to your `.gitlab-ci.yml` file:
+#### Include the DAST template
-```yaml
-include:
- - template: DAST.gitlab-ci.yml
+The method of including the DAST template depends on the GitLab version:
-variables:
- DAST_WEBSITE: https://example.com
-```
+- In GitLab 11.9 and later, [include](../../../ci/yaml/README.md#includetemplate) the
+ `DAST.gitlab-ci.yml` template.
-### Latest template
+ Add the following to your `.gitlab-ci.yml` file:
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254325) in GitLab 13.8
+ ```yaml
+ include:
+ - template: DAST.gitlab-ci.yml
-To use the latest version of the DAST template, include
-`DAST.latest.gitlab-ci.yml` instead of `DAST.gitlab-ci.yml`.
-See the CI/CD [documentation](../../../development/cicd/templates.md#latest-version)
-on template versioning for more information.
+ variables:
+ DAST_WEBSITE: https://example.com
+ ```
-Please note that the latest version may include breaking changes. Check the
-[DAST troubleshooting guide](#troubleshooting) if you experience problems.
+- In GitLab 11.8 and earlier, copy the template's content into your `.gitlab_ci.yml` file.
-### Template options
+#### Template options
-There are two ways to define the URL to be scanned by DAST:
+Running a DAST scan requires a URL. There are two ways to define the URL to be scanned by DAST:
1. Set the `DAST_WEBSITE` [CI/CD variable](../../../ci/yaml/README.md#variables).
@@ -125,7 +109,7 @@ There are two ways to define the URL to be scanned by DAST:
If both values are set, the `DAST_WEBSITE` value takes precedence.
The included template creates a `dast` job in your CI/CD pipeline and scans
-your project's source code for possible vulnerabilities.
+your project's running application for possible vulnerabilities.
The results are saved as a
[DAST report artifact](../../../ci/pipelines/job_artifacts.md#artifactsreportsdast)
@@ -143,9 +127,93 @@ image. Using the `DAST_VERSION` variable, you can choose how DAST updates:
Find the latest DAST versions on the [Releases](https://gitlab.com/gitlab-org/security-products/dast/-/releases) page.
-### When DAST scans run
+## Deployment options
+
+Depending on the complexity of the target application, there are a few options as to how to deploy and configure
+the DAST template. A set of example applications with their configurations have been made available in our
+[DAST demonstrations](https://gitlab.com/gitlab-org/security-products/demos/dast/) project.
+
+### Review Apps
+
+Review Apps are the most involved method of deploying your DAST target application. To assist in the process,
+we created a Review App deployment using Google Kubernetes Engine (GKE). This example can be found in our
+[Review Apps - GKE](https://gitlab.com/gitlab-org/security-products/demos/dast/review-app-gke) project along with detailed
+instructions in the [README.md](https://gitlab.com/gitlab-org/security-products/demos/dast/review-app-gke/-/blob/master/README.md)
+on how to configure Review Apps for DAST.
+
+### Docker Services
+
+If your application utilizes Docker containers you have another option for deploying and scanning with DAST.
+After your Docker build job completes and your image is added to your container registry, you can utilize the image as a
+[service](../../../ci/docker/using_docker_images.md#what-is-a-service).
+
+By using service definitions in your `gitlab-ci.yml`, you can scan services with the DAST analyzer.
+
+```yaml
+stages:
+ - build
+ - dast
+
+include:
+ - template: DAST.gitlab-ci.yml
+
+# Deploys the container to the GitLab container registry
+deploy:
+ services:
+ - name: docker:dind
+ alias: dind
+ image: docker:19.03.5
+ stage: build
+ script:
+ - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
+ - docker pull $CI_REGISTRY_IMAGE:latest || true
+ - docker build --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
+ - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ - docker push $CI_REGISTRY_IMAGE:latest
+
+services: # use services to link your app container to the dast job
+ - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ alias: yourapp
+
+variables:
+ DAST_FULL_SCAN_ENABLED: "true" # do a full scan
+ DAST_ZAP_USE_AJAX_SPIDER: "true" # use the ajax spider
+```
+
+Most applications depend on multiple services such as databases or caching services. By default, services defined in the services fields cannot communicate
+with each another. To allow communication between services, enable the `FF_NETWORK_PER_BUILD` [feature flag](https://docs.gitlab.com/runner/configuration/feature-flags.html#available-feature-flags).
+
+```yaml
+variables:
+ FF_NETWORK_PER_BUILD: "true" # enable network per build so all services can communicate on the same network
+
+services: # use services to link the container to the dast job
+ - name: mongo:latest
+ alias: mongo
+ - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ alias: yourapp
+```
+
+### DAST application analysis
+
+DAST can analyze applications in two ways:
+
+- Passive scan only (DAST default). DAST executes
+ [ZAP's Baseline Scan](https://www.zaproxy.org/docs/docker/baseline-scan/) and doesn't
+ actively attack your application.
+- Passive and active scan. DAST can be [configured](#full-scan) to also perform an active scan
+ to attack your application and produce a more extensive security report. It can be very
+ useful when combined with [Review Apps](../../../ci/review_apps/index.md).
+
+Note that a pipeline may consist of multiple jobs, including SAST and DAST scanning. If any job
+fails to finish for any reason, the security dashboard doesn't show DAST scanner output. For
+example, if the DAST job finishes but the SAST job fails, the security dashboard doesn't show DAST
+results. On failure, the analyzer outputs an
+[exit code](../../../development/integrations/secure.md#exit-code).
+
+#### DAST job order
-When using `DAST.gitlab-ci.yml` template, the `dast` job is run last as shown in
+When using the `DAST.gitlab-ci.yml` template, the `dast` job is run last as shown in
the example below. To ensure DAST is scanning the latest code, your CI pipeline
should deploy changes to the web server in one of the jobs preceding the `dast` job.
@@ -247,6 +315,9 @@ tips for optimizing DAST scans in a [blog post](https://about.gitlab.com/blog/20
#### Domain validation
+WARNING:
+In GitLab 13.8, domain validation, outside of the new on-demand scan site profile validation, was deprecated. In GitLab 14.0, domain validation in CI/CD jobs will be permanently removed.
+
The DAST job can be run anywhere, which means you can accidentally hit live web servers
and potentially damage them. You could even take down your production environment.
For that reason, you should use domain validation.
@@ -472,7 +543,7 @@ URLs to scan can be specified by either of the following methods:
To define the URLs to scan in a file, create a plain text file with one path per line.
-```txt
+```plaintext
page1.html
/page2.html
category/shoes/page1.html
@@ -676,7 +747,7 @@ successfully run. For more information, see [Offline environments](../offline_de
To use DAST in an offline environment, you need:
-- GitLab Runner with the [`docker` or `kubernetes` executor](#requirements).
+- GitLab Runner with the [`docker` or `kubernetes` executor](#prerequisites).
- Docker Container Registry with a locally available copy of the DAST
[container image](https://gitlab.com/gitlab-org/security-products/dast), found in the
[DAST container registry](https://gitlab.com/gitlab-org/security-products/dast/container_registry).
@@ -831,7 +902,7 @@ To delete an on-demand scan:
1. In the saved scan's row select **More actions** (**{ellipsis_v}**), then select **Delete**.
1. Select **Delete** to confirm the deletion.
-## Site profile
+### Site profile
A site profile describes the attributes of a web site to scan on demand with DAST. A site profile is
required for an on-demand DAST scan.
@@ -841,7 +912,7 @@ A site profile contains the following:
- **Profile name**: A name you assign to the site to be scanned.
- **Target URL**: The URL that DAST runs against.
-### Site profile validation
+#### Site profile validation
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233020) in GitLab 13.8.
@@ -858,7 +929,7 @@ follows:
Both methods are equivalent in functionality. Use whichever is feasible.
-### Create a site profile
+#### Create a site profile
To create a site profile:
@@ -869,7 +940,7 @@ To create a site profile:
The site profile is created.
-### Edit a site profile
+#### Edit a site profile
To edit an existing site profile:
@@ -881,7 +952,7 @@ To edit an existing site profile:
The site profile is updated with the edited details.
-### Delete a site profile
+#### Delete a site profile
To delete an existing site profile:
@@ -893,7 +964,7 @@ To delete an existing site profile:
The site profile is deleted.
-### Validate a site profile
+#### Validate a site profile
Prerequisites:
@@ -921,7 +992,7 @@ The site is validated and an active scan can run against it.
If a validated site profile's target URL is edited, the site's validation status is revoked.
-### Revoke a site profile's validation status
+#### Revoke a site profile's validation status
Note that all site profiles with the same URL have their validation status revoked.
@@ -977,7 +1048,7 @@ app.get('/dast-website-target', function(req, res) {
})
```
-## Scanner profile
+### Scanner profile
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/222767) in GitLab 13.4.
> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/225804) in GitLab 13.5: scan mode, AJAX spider, debug messages.
@@ -992,7 +1063,7 @@ A scanner profile defines the scanner settings used to run an on-demand scan:
- **AJAX spider:** Run the AJAX spider, in addition to the traditional spider, to crawl the target site.
- **Debug messages:** Include debug messages in the DAST console output.
-### Create a scanner profile
+#### Create a scanner profile
To create a scanner profile:
@@ -1002,7 +1073,7 @@ To create a scanner profile:
1. Complete the form. For details of each field, see [Scanner profile](#scanner-profile).
1. Click **Save profile**.
-### Edit a scanner profile
+#### Edit a scanner profile
To edit a scanner profile:
@@ -1015,7 +1086,7 @@ To edit a scanner profile:
The scanner profile is updated with the edited details.
-### Delete a scanner profile
+#### Delete a scanner profile
To delete a scanner profile:
@@ -1099,7 +1170,7 @@ variables:
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
## Vulnerabilities database update
diff --git a/doc/user/application_security/dependency_list/index.md b/doc/user/application_security/dependency_list/index.md
index d5f4ce9cc6a..6ed3b15d829 100644
--- a/doc/user/application_security/dependency_list/index.md
+++ b/doc/user/application_security/dependency_list/index.md
@@ -5,54 +5,56 @@ group: Composition Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Dependency List **(ULTIMATE)**
+# Dependency list **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10075) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10075) in GitLab Ultimate 12.0.
-The dependency list allows you to see your project's dependencies, and key
-details about them, including their known vulnerabilities. To see it,
-navigate to **Security & Compliance > Dependency List** in your project's
-sidebar. This information is sometimes referred to as a Software Bill of Materials or SBoM / BOM.
+Use the dependency list to review your project's dependencies and key
+details about those dependencies, including their known vulnerabilities. To see the dependency list,
+in your project, go to **Security & Compliance > Dependency List**.
+This information is sometimes referred to as a Software Bill of Materials or SBoM / BOM.
-## Requirements
+## Prerequisites
-1. The [Dependency Scanning](../dependency_scanning/index.md) CI job must be
- configured for your project.
-1. Your project uses at least one of the
- [languages and package managers](../dependency_scanning/index.md#supported-languages-and-package-managers)
- supported by Gemnasium.
+To view your project's dependencies, ensure you meet the following requirements:
-## Viewing dependencies
+- The [Dependency Scanning](../dependency_scanning/index.md) CI job must be
+ configured for your project.
+- Your project uses at least one of the
+ [languages and package managers](../dependency_scanning/index.md#supported-languages-and-package-managers)
+ supported by Gemnasium.
-![Dependency List](img/dependency_list_v12_10.png)
+## View a project's dependencies
-Dependencies are displayed with the following information:
+![Dependency list](img/dependency_list_v12_10.png)
+
+GitLab displays dependencies with the following information:
| Field | Description |
-| --------- | ----------- |
-| Component | The dependency's name and version |
-| Packager | The packager used to install the dependency |
+|-----------|-------------|
+| Component | The dependency's name and version. |
+| Packager | The packager used to install the dependency. |
| Location | A link to the packager-specific lock file in your project that declared the dependency. It also shows the [dependency path](#dependency-paths) to a top-level dependency, if any, and if supported. |
-| License | Links to dependency's software licenses |
+| License | Links to dependency's software licenses. |
-Dependencies shown are initially sorted by the severity of their known vulnerabilities, if any. They
+Displayed dependencies are initially sorted by the severity of their known vulnerabilities, if any. They
can also be sorted by name or by the packager that installed them.
### Vulnerabilities
-If a dependency has known vulnerabilities, you can view them by clicking the arrow next to the
+If a dependency has known vulnerabilities, view them by clicking the arrow next to the
dependency's name or the badge that indicates how many known vulnerabilities exist. For each
-vulnerability, its severity and description then appears below it.
+vulnerability, its severity and description appears below it.
-### Dependency Paths
+### Dependency paths
The dependency list shows the path between a dependency and a top-level dependency it's connected
to, if any. There are many possible paths connecting a transient dependency to top-level
-dependencies, but the UI only shows one of the shortest paths.
+dependencies, but the user interface shows only one of the shortest paths.
-![Dependency Path](img/yarn_dependency_path_v13_6.png)
+![Dependency path](img/yarn_dependency_path_v13_6.png)
-Dependency Paths are supported for the following package managers:
+Dependency paths are supported for the following package managers:
- [NuGet](https://www.nuget.org/)
- [Yarn 1.x](https://classic.yarnpkg.com/lang/en/)
@@ -62,9 +64,9 @@ Dependency Paths are supported for the following package managers:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10536) in GitLab Ultimate 12.3.
If the [License Compliance](../../compliance/license_compliance/index.md) CI job is configured,
-the [discovered licenses](../../compliance/license_compliance/index.md#supported-languages-and-package-managers) are displayed on this page.
+[discovered licenses](../../compliance/license_compliance/index.md#supported-languages-and-package-managers) are displayed on this page.
-## Downloading the Dependency List
+## Downloading the dependency list
-Your project's full list of dependencies and their details can be downloaded in
-`JSON` format by clicking on the download button.
+You can download your project's full list of dependencies and their details in
+`JSON` format by selecting the download button.
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index 11d27140e42..f87ea8edc7b 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -19,10 +19,13 @@ vulnerable. You can then take action to protect your application.
If you're using [GitLab CI/CD](../../../ci/README.md), you can use dependency scanning to analyze
your dependencies for known vulnerabilities. GitLab scans all dependencies, including transitive
dependencies (also known as nested dependencies). You can take advantage of dependency scanning by
-either [including the dependency scanning template](#configuration)
-in your existing `.gitlab-ci.yml` file, or by implicitly using
-the [auto dependency scanning](../../../topics/autodevops/stages.md#auto-dependency-scanning)
-provided by [Auto DevOps](../../../topics/autodevops/index.md).
+either:
+
+- [Including the dependency scanning template](#configuration)
+ in your existing `.gitlab-ci.yml` file.
+- Implicitly using
+ the [auto dependency scanning](../../../topics/autodevops/stages.md#auto-dependency-scanning)
+ provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab checks the dependency scanning report, compares the found vulnerabilities
between the source and target branches, and shows the information on the
@@ -59,16 +62,16 @@ The following languages and dependency managers are supported:
| Package Managers | Languages | Supported files | Scan tools |
| ------------------- | --------- | --------------- | ------------ |
-| [Bundler](https://bundler.io/) | Ruby | `Gemfile.lock`, `gems.locked` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium), [bundler-audit](https://github.com/rubysec/bundler-audit) |
-| [Composer](https://getcomposer.org/) | PHP | `composer.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [Conan](https://conan.io/) | C, C++ | [`conan.lock`](https://docs.conan.io/en/latest/versioning/lockfiles.html) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [Golang](https://golang.org/) | Go | `go.sum` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/) | Java | `build.gradle`, `build.gradle.kts`, `pom.xml` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [npm](https://www.npmjs.com/), [yarn](https://classic.yarnpkg.com/en/) 1.x | JavaScript | `package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
+| [Bundler](https://bundler.io/) | Ruby | `Gemfile.lock`, `gems.locked` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium), [bundler-audit](https://github.com/rubysec/bundler-audit) |
+| [Composer](https://getcomposer.org/) | PHP | `composer.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [Conan](https://conan.io/) | C, C++ | [`conan.lock`](https://docs.conan.io/en/latest/versioning/lockfiles.html) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [Golang](https://golang.org/) | Go | `go.sum` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/) | Java | `build.gradle`, `build.gradle.kts`, `pom.xml` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [npm](https://www.npmjs.com/), [yarn](https://classic.yarnpkg.com/en/) 1.x | JavaScript | `package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
| [npm](https://www.npmjs.com/) (7 and earlier), [yarn](https://classic.yarnpkg.com/en/) 1.x | JavaScript | `package.json` | [Retire.js](https://retirejs.github.io/retire.js/) |
-| [NuGet](https://www.nuget.org/) 4.9+ | .NET, C# | [`packages.lock.json`](https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#enabling-lock-file) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [`setuptools`](https://setuptools.readthedocs.io/en/latest/), [pip](https://pip.pypa.io/en/stable/), [Pipenv](https://pipenv.pypa.io/en/latest/) (*1*) | Python | `setup.py`, `requirements.txt`, `requirements.pip`, `requires.txt`, `Pipfile`, `Pipfile.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [sbt](https://www.scala-sbt.org/) (*2*) | Scala | `build.sbt` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
+| [NuGet](https://www.nuget.org/) 4.9+ | .NET, C# | [`packages.lock.json`](https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#enabling-lock-file) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [`setuptools`](https://setuptools.readthedocs.io/en/latest/), [pip](https://pip.pypa.io/en/stable/), [Pipenv](https://pipenv.pypa.io/en/latest/) (*1*) | Python | `setup.py`, `requirements.txt`, `requirements.pip`, `requires.txt`, `Pipfile`, `Pipfile.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [sbt](https://www.scala-sbt.org/) (*2*) | Scala | `build.sbt` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
1. [Pipenv](https://pipenv.pypa.io/en/latest/) projects are scanned when a `Pipfile` is present.
1. Support for [sbt](https://www.scala-sbt.org/) 1.3 and above was added in GitLab 13.9.
@@ -77,7 +80,7 @@ Plans are underway for supporting the following languages, dependency managers,
| Package Managers | Languages | Supported files | Scan tools | Issue |
| ------------------- | --------- | --------------- | ---------- | ----- |
-| [Poetry](https://python-poetry.org/) | Python | `poetry.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) | [GitLab#7006](https://gitlab.com/gitlab-org/gitlab/-/issues/7006) |
+| [Poetry](https://python-poetry.org/) | Python | `poetry.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) | [GitLab#7006](https://gitlab.com/gitlab-org/gitlab/-/issues/7006) |
## Contribute your scanner
@@ -223,13 +226,13 @@ Read more on [how to use private Maven repositories](../index.md#using-private-m
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
## Solutions for vulnerabilities (auto-remediation)
Some vulnerabilities can be fixed by applying the solution that GitLab
automatically generates. Read more about the
-[solutions for vulnerabilities](../index.md#automatic-remediation-for-vulnerabilities).
+[solutions for vulnerabilities](../index.md#apply-an-automatic-remediation-for-a-vulnerability).
## Security Dashboard
@@ -507,7 +510,7 @@ ensure that it can reach your private repository. Here is an example configurati
### Referencing local dependencies using a path in JavaScript projects
The [Retire.js](https://gitlab.com/gitlab-org/security-products/analyzers/retire.js) analyzer
-doesn't support dependency references made with [local paths](https://docs.npmjs.com/cli/v6/configuring-npm/package-json#local-paths)
+doesn't support dependency references made with [local paths](https://docs.npmjs.com/cli/v6/configuring-npm/package-json/#local-paths)
in the `package.json` of JavaScript projects. The dependency scan outputs the following error for
such references:
diff --git a/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png b/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png
index a914c2996f7..54ccfa24374 100644
--- a/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png
+++ b/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.png b/doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.png
deleted file mode 100644
index a3034a7db04..00000000000
--- a/doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png b/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png
deleted file mode 100644
index 10d9effb811..00000000000
--- a/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gif b/doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gif
deleted file mode 100644
index 22acba5fe1e..00000000000
--- a/doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index 4a23cd874be..b0457ec0690 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -5,17 +5,20 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, howto
---
-# GitLab Secure **(ULTIMATE)**
+# Application security **(ULTIMATE)**
GitLab can check your application for security vulnerabilities that may lead to unauthorized access,
data leaks, denial of services, and more. GitLab reports vulnerabilities in the merge request so you
-can fix them before merging. The [Security Dashboard](security_dashboard/index.md) provides a
-high-level view of vulnerabilities detected in your projects, pipeline, and groups. The [Threat Monitoring](threat_monitoring/index.md)
-page provides runtime security metrics for application environments. With the information provided,
-you can immediately begin risk analysis and remediation.
+can fix them before you merge.
+
+- The [Security Dashboard](security_dashboard/index.md) provides a
+ high-level view of vulnerabilities detected in your projects, pipeline, and groups.
+- The [Threat Monitoring](threat_monitoring/index.md) page provides runtime security metrics
+ for application environments. With the information provided,
+ you can immediately begin risk analysis and remediation.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview of application security with GitLab, see
+For an overview of GitLab application security, see
[Security Deep Dive](https://www.youtube.com/watch?v=k4vEJnGYy84).
## Quick start
@@ -123,7 +126,7 @@ latest versions of the scanning tools without having to do anything. There are s
with this approach, however, and there is a
[plan to resolve them](https://gitlab.com/gitlab-org/gitlab/-/issues/9725).
-## Viewing security scan information in merge requests **(FREE)**
+## View security scan information in merge requests **(FREE)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4393) in GitLab Free 13.5.
> - Made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/273205) in 13.6.
@@ -136,25 +139,7 @@ reports are available to download. To download a report, click on the
![Security widget](img/security_widget_v13_7.png)
-## Interacting with the vulnerabilities
-
-> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.8.
-
-Each security vulnerability in the merge request report or the
-[Vulnerability Report](vulnerability_report/index.md) is actionable. Click an entry to view detailed
-information with several options:
-
-- [Dismiss vulnerability](#dismissing-a-vulnerability): Dismissing a vulnerability styles it in
- strikethrough.
-- [Create issue](vulnerabilities/index.md#create-a-gitlab-issue-for-a-vulnerability): Create a new issue with the title and
- description pre-populated with information from the vulnerability report. By default, such issues
- are [confidential](../project/issues/confidential_issues.md).
-- [Automatic Remediation](#automatic-remediation-for-vulnerabilities): For some vulnerabilities,
- a solution is provided for how to fix the vulnerability.
-
-![Interacting with security reports](img/interacting_with_vulnerability_v13_3.png)
-
-### View details of a DAST vulnerability
+## View details of a DAST vulnerability
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36332) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
@@ -165,11 +150,10 @@ investigate and rectify the underlying cause.
To view details of DAST vulnerabilities:
1. To see all vulnerabilities detected:
-
- In a project, go to the project's **{shield}** **Security & Compliance** page.
- Only in a merge request, go the merge request's **Security** tab.
-1. Click on the vulnerability's description. The following details are provided:
+1. Select the vulnerability's description. The following details are provided:
| Field | Description |
|:-----------------|:------------------------------------------------------------------ |
@@ -187,14 +171,14 @@ To view details of DAST vulnerabilities:
| Links | Links to further details of the detected vulnerability. |
| Solution | Details of a recommended solution to the vulnerability (optional). |
-#### Hide sensitive information in headers
+### Hide sensitive information in headers
HTTP request and response headers may contain sensitive information, including cookies and
authorization credentials. By default, content of specific headers are masked in DAST vulnerability
reports. You can specify the list of all headers to be masked. For details, see
[Hide sensitive information](dast/index.md#hide-sensitive-information).
-### View details of an API Fuzzing vulnerability
+## View details of an API Fuzzing vulnerability
> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.7.
@@ -231,65 +215,79 @@ Follow these steps to view details of a fuzzing fault:
| Severity | Severity of the finding is always Unknown. |
| Scanner Type | Scanner used to perform testing. |
-### Dismissing a vulnerability
+## Addressing vulnerabilities
-To dismiss a vulnerability, you must set its status to Dismissed. This dismisses the vulnerability
-for the entire project. Follow these steps to do so:
+> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.8.
-1. Select the vulnerability in the Security Dashboard.
-1. Select **Dismissed** from the **Status** selector menu at the top-right.
+For each security vulnerability in a merge request or [Vulnerability Report](vulnerability_report/index.md),
+you can:
+
+- [Dismiss the vulnerability](#dismiss-a-vulnerability).
+- Create a [confidential](../project/issues/confidential_issues.md)
+ [issue](vulnerabilities/index.md#create-a-gitlab-issue-for-a-vulnerability).
+- Apply an [automatically remediation](#apply-an-automatic-remediation-for-a-vulnerability).
-You can undo this action by selecting a different status from the same menu.
+### Dismiss a vulnerability
-#### Adding a dismissal reason
+> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0, a dismissal reason.
-> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
+You can dismiss a vulnerability for the entire project.
-When dismissing a vulnerability, it's often helpful to provide a reason for doing so. Upon setting a
-vulnerability's status to Dismissed, a text box appears for you to add a comment with your
-dismissal. Once added, you can edit or delete it. This allows you to add and update context for a
-vulnerability as you learn more over time.
+1. Select the vulnerability in the Security Dashboard.
+1. In the top-right, from the **Status** selector menu, select **Dismissed**.
+1. Optional. Add a reason for the dismissal and select **Save comment**.
-![Dismissed vulnerability comment](img/adding_a_dismissal_reason_v13_4.png)
+To undo this action, select a different status from the same menu.
-#### Dismissing multiple vulnerabilities
+#### Dismiss multiple vulnerabilities
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35816) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.9.
-You can dismiss multiple vulnerabilities at once, providing an optional reason.
-Selecting the checkboxes on the side of each vulnerability in the list selects that individual vulnerability.
-Alternatively, you can select all the vulnerabilities in the list by selecting the checkbox in the table header.
-Deselecting the checkbox in the header deselects all the vulnerabilities in the list.
-After you have selected some vulnerabilities, a menu appears at the top of the table that allows you to select a dismissal reason.
-Pressing the "Dismiss Selected" button dismisses all the selected vulnerabilities at once, with the reason you chose.
+You can dismiss multiple vulnerabilities at once.
-![Multiple vulnerability dismissal](img/multi_select_v12_9.png)
+1. In the list of vulnerabilities, select the checkbox for each vulnerability you want to dismiss.
+ To select all, select the checkbox in the table header.
+1. Above the table, select a dismissal reason.
+1. Select **Dismiss Selected**.
### Create an issue for a vulnerability
-You can create a GitLab issue, or a Jira issue (if it's enabled) for a vulnerability. For more
-details, see [Vulnerability Pages](vulnerabilities/index.md).
+You can create a GitLab or Jira issue for a vulnerability. For details, see [Vulnerability Pages](vulnerabilities/index.md).
+
+#### Link to an existing issue
+
+If you already have an open issue, you can link to it from the vulnerability.
+
+- The vulnerability page shows related issues, but the issue page doesn't show the vulnerability it's related to.
+- An issue can only be related to one vulnerability at a time.
+- Issues can be linked across groups and projects.
+
+To link to an existing issue:
+
+1. Open the vulnerability.
+1. In the **Related Issues** section, select the plus (**{plus}**) icon.
+1. In the text box that appears, type an issue number or paste an issue link.
+ - Type `#` followed by a number to show an autocomplete menu.
+ - You can enter multiple issues at once. Press the space bar after each issue number or link to converts them to tags.
+1. Select **Add**.
-### Automatic remediation for vulnerabilities
+To remove an issue, to the right of the issue number, select **{close}**.
+
+![Vulnerability related issues text box tags animation](img/vulnerability_related_issues_text_box_tags_v13_2.gif)
+
+### Apply an automatic remediation for a vulnerability
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5656) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.7.
Some vulnerabilities can be fixed by applying the solution that GitLab automatically generates.
-Although the feature name is Automatic Remediation, this feature is also commonly called
-Auto-Remediation, Auto Remediation, or Suggested Solutions. The following scanners are supported:
+The following scanners are supported:
-- [Dependency Scanning](dependency_scanning/index.md):
+- [Dependency Scanning](dependency_scanning/index.md).
Automatic Patch creation is only available for Node.js projects managed with
`yarn`.
-- [Container Scanning](container_scanning/index.md)
-
-When an automatic solution is available, the button in the header shows **Resolve with merge request**:
+- [Container Scanning](container_scanning/index.md).
-![Resolve with Merge Request button](img/vulnerability_page_merge_request_button_v13_1.png)
-
-Selecting the button creates a merge request with the solution.
-
-#### Manually applying the suggested patch
+#### Manually apply the suggested patch
To manually apply the patch that GitLab generated for a vulnerability:
@@ -301,49 +299,22 @@ To manually apply the patch that GitLab generated for a vulnerability:
1. Run `git apply remediation.patch`.
1. Verify and commit the changes to your branch.
-#### Creating a merge request from a vulnerability
+#### Create a merge request with the suggested patch
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9224) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.9.
-In certain cases, GitLab allows you to create a merge request that automatically remediates the
+In some cases, you can create a merge request that automatically remediates the
vulnerability. Any vulnerability that has a
-[solution](#automatic-remediation-for-vulnerabilities) can have a merge
+[solution](#apply-an-automatic-remediation-for-a-vulnerability) can have a merge
request created to automatically solve the issue.
-If this action is available, the vulnerability page or modal contains a **Create merge request** button.
-Click this button to create a merge request to apply the solution onto the source branch.
-
-![Create merge request from vulnerability](img/create_mr_from_vulnerability_v13_4.png)
-
-### Managing related issues for a vulnerability
-
-Issues can be linked to a vulnerability using the related issues block on the vulnerability page.
-The relationship is uni-directional. The vulnerability page shows related issues, but the issue page
-doesn't show the vulnerability it's related to. An issue can only be related to one vulnerability at
-a time. Issues can be linked across groups and projects.
-
-#### Adding a related issue
-
-You can link an issue by clicking the **{plus}** button in the **Related Issues** block.
-
-![Vulnerability related issues add button](img/vulnerability_related_issues_add_button_v13_2.png)
-
-A text box appears that lets you type an issue number or paste an issue link. You can enter multiple
-issues at once. Pressing the space bar after each issue number or link converts them to tags that
-you can remove by clicking the **{close}** icon to the tag's right. Typing `#` followed by a number
-shows an autocomplete menu. Click an issue in the menu to add it as a tag. When you're finished
-entering issues, click the **Add** button to link the issues to the vulnerability. Alternatively,
-click **Cancel** to exit without linking any issues.
-
-![Vulnerability related issues text box tags animation](img/vulnerability_related_issues_text_box_tags_v13_2.gif)
-
-### Removing a related issue
+If this action is available:
-Click the **{close}** icon to right of an issue to remove it as a related issue. Note that this only
-removes it as a related issue of the vulnerability; it doesn't modify or remove the issue itself.
-You can link it to the vulnerability again if desired.
+1. Select the **Resolve with merge request** dropdown, then select **Resolve with merge request**.
+
+ ![Create merge request from vulnerability](img/create_mr_from_vulnerability_v13_4.png)
-![Vulnerability related issues remove issue animation](img/vulnerability_related_issues_remove_v13_2.gif)
+A merge request is created. It that applies the solution to the source branch.
## Security approvals in merge requests
diff --git a/doc/user/application_security/offline_deployments/index.md b/doc/user/application_security/offline_deployments/index.md
index 9d16fb75410..7c013a2a9de 100644
--- a/doc/user/application_security/offline_deployments/index.md
+++ b/doc/user/application_security/offline_deployments/index.md
@@ -59,14 +59,14 @@ mirroring the packages inside your own offline network.
### Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
Please note that in some cases the reported vulnerabilities provide metadata that can contain
external links exposed in the UI. These links might not be accessible within an offline environment.
### Automatic remediation for vulnerabilities
-The [automatic remediation for vulnerabilities](../index.md#automatic-remediation-for-vulnerabilities) feature is available for offline Dependency Scanning and Container Scanning, but may not work
+The [automatic remediation for vulnerabilities](../index.md#apply-an-automatic-remediation-for-a-vulnerability) feature is available for offline Dependency Scanning and Container Scanning, but may not work
depending on your instance's configuration. We can only suggest solutions, which are generally more
current versions that have been patched, when we are able to access up-to-date registry services
hosting the latest versions of that dependency or image.
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 880edebfeda..b71cefbc7fe 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, howto
---
-# Static Application Security Testing (SAST)
+# Static Application Security Testing (SAST) **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3775) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.3.
> - All open source (OSS) analyzers were moved to GitLab Free in GitLab 13.3.
@@ -83,8 +83,9 @@ You can also [view our language roadmap](https://about.gitlab.com/direction/secu
| Objective-C (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
| PHP | [phpcs-security-audit](https://github.com/FloeDesignTechnologies/phpcs-security-audit) | 10.8 |
| Python ([pip](https://pip.pypa.io/en/stable/)) | [bandit](https://github.com/PyCQA/bandit) | 10.3 |
-| Python | [semgrep](https://semgrep.dev) | 13.9 |
+| Python | [Semgrep](https://semgrep.dev) | 13.9 |
| React | [ESLint react plugin](https://github.com/yannickcr/eslint-plugin-react) | 12.5 |
+| Ruby | [brakeman](https://brakemanscanner.org) | 13.9 |
| Ruby on Rails | [brakeman](https://brakemanscanner.org) | 10.3 |
| Scala ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.0 (SBT) & 11.9 (Ant, Gradle, Maven) |
| Swift (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
@@ -130,16 +131,16 @@ All open source (OSS) analyzers have been moved to the GitLab Free tier as of Gi
Different features are available in different [GitLab tiers](https://about.gitlab.com/pricing/),
as shown in the following table:
-| Capability | In Free | In Ultimate |
-|:-----------------------------------------------------------------------------------|:--------------------|:-------------------|
-| [Configure SAST Scanners](#configuration) | **{check-circle}** | **{check-circle}** |
-| [Customize SAST Settings](#customizing-the-sast-settings) | **{check-circle}** | **{check-circle}** |
-| View [JSON Report](#reports-json-format) | **{check-circle}** | **{check-circle}** |
-| Presentation of JSON Report in Merge Request | **{dotted-circle}** | **{check-circle}** |
-| [Interaction with Vulnerabilities](#interacting-with-the-vulnerabilities) | **{dotted-circle}** | **{check-circle}** |
-| [Access to Security Dashboard](#security-dashboard) | **{dotted-circle}** | **{check-circle}** |
-| [Configure SAST in the UI](#configure-sast-in-the-ui) | **{dotted-circle}** | **{check-circle}** |
-| [Customize SAST Rulesets](#customize-rulesets) | **{dotted-circle}** | **{check-circle}** |
+| Capability | In Free | In Ultimate |
+|:-------------------------------------------------------------------------------------------------------------|:--------------------|:-------------------|
+| [Configure SAST Scanners](#configuration) | **{check-circle}** | **{check-circle}** |
+| [Customize SAST Settings](#customizing-the-sast-settings) | **{check-circle}** | **{check-circle}** |
+| View [JSON Report](#reports-json-format) | **{check-circle}** | **{check-circle}** |
+| Presentation of JSON Report in Merge Request | **{dotted-circle}** | **{check-circle}** |
+| [Address vulnerabilities](../../application_security/index.md#addressing-vulnerabilities) | **{dotted-circle}** | **{check-circle}** |
+| [Access to Security Dashboard](../../application_security/security_dashboard/index.md) | **{dotted-circle}** | **{check-circle}** |
+| [Configure SAST in the UI](#configure-sast-in-the-ui) | **{dotted-circle}** | **{check-circle}** |
+| [Customize SAST Rulesets](#customize-rulesets) | **{dotted-circle}** | **{check-circle}** |
## Contribute your scanner
@@ -149,7 +150,7 @@ The [Security Scanner Integration](../../../development/integrations/secure.md)
To configure SAST for a project you can:
-- Use [Auto SAST](../../../topics/autodevops/stages.md#auto-sast) provided by
+- Use [Auto SAST](../../../topics/autodevops/stages.md#auto-sast), provided by
[Auto DevOps](../../../topics/autodevops/index.md).
- [Configure SAST manually](#configure-sast-manually).
- [Configure SAST using the UI](#configure-sast-in-the-ui) (introduced in GitLab 13.3).
@@ -374,8 +375,6 @@ If all dependencies are present, the `COMPILE=false` CI/CD variable can be provi
analyzer and compilation is skipped:
```yaml
-image: maven:3.6-jdk-8-alpine
-
stages:
- build
- test
@@ -384,6 +383,7 @@ include:
- template: Security/SAST.gitlab-ci.yml
build:
+ image: maven:3.6-jdk-8-slim
stage: build
script:
- mvn package -Dmaven.repo.local=./.m2/repository
@@ -610,31 +610,6 @@ Here's an example SAST report:
}
```
-## Secret detection
-
-Learn more about [Secret Detection](../secret_detection).
-
-## Security Dashboard **(ULTIMATE)**
-
-The Security Dashboard is a good place to get an overview of all the security
-vulnerabilities in your groups, projects and pipelines. Read more about the
-[Security Dashboard](../security_dashboard/index.md).
-
-## Interacting with the vulnerabilities **(ULTIMATE)**
-
-Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
-
-## Vulnerabilities database
-
-Vulnerabilities contained in the vulnerability database can be searched
-and viewed at the [GitLab vulnerability advisory database](https://advisories.gitlab.com).
-
-### Vulnerabilities database update
-
-For more information about the vulnerabilities database update, check the
-[maintenance table](../index.md#maintenance-and-update-of-the-vulnerabilities-database).
-
## Running SAST in an offline environment
For self-managed GitLab instances in an environment with limited, restricted, or intermittent access
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index 98177e804f3..d2a576e9e03 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -5,7 +5,7 @@ group: Static Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Secret Detection
+# Secret Detection **(FREE)**
> - [Introduced](https://about.gitlab.com/releases/2019/03/22/gitlab-11-9-released/#detect-secrets-and-credentials-in-the-repository) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.9.
> - Made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/222788) in 13.3.
@@ -102,8 +102,7 @@ as shown in the following table:
Secret Detection is performed by a [specific analyzer](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml)
during the `secret-detection` job. It runs regardless of your app's programming language.
-The Secret Detection analyzer includes [Gitleaks](https://github.com/zricethezav/gitleaks) and
-[TruffleHog](https://github.com/dxa4481/truffleHog) checks.
+The Secret Detection analyzer includes [Gitleaks](https://github.com/zricethezav/gitleaks) checks.
Note that the Secret Detection analyzer ignores Password-in-URL vulnerabilities if the password
begins with a dollar sign (`$`), as this likely indicates the password is an environment variable.
@@ -112,7 +111,7 @@ For example, `https://username:$password@example.com/path/to/repo` isn't detecte
NOTE:
You don't have to configure Secret Detection manually as shown in this section if you're using
-[Auto Secret Detection](../../../topics/autodevops/stages.md#auto-secret-detection)
+[Auto Secret Detection](../../../topics/autodevops/stages.md#auto-secret-detection),
provided by [Auto DevOps](../../../topics/autodevops/index.md).
To enable Secret Detection for GitLab 13.1 and later, you must include the
@@ -200,7 +199,7 @@ Secret Detection can be customized by defining available CI/CD variables:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211387) in GitLab 13.5.
You can customize the default secret detection rules provided with GitLab.
-Customization allows you to exclude rules and add new rules.
+Customization allows replace the default secret detection rules with rules that you define.
To create a custom ruleset:
@@ -258,7 +257,7 @@ want to perform a full secret scan. Running a secret scan on the full history ca
especially for larger repositories with lengthy Git histories. We recommend not setting this CI/CD variable
as part of your normal job definition.
-A new configuration variable ([`SECRET_DETECTION_HISTORIC_SCAN`](../sast/#vulnerability-filters))
+A new configuration variable ([`SECRET_DETECTION_HISTORIC_SCAN`](#available-variables))
can be set to change the behavior of the GitLab Secret Detection scan to run on the entire Git history of a repository.
We have created a [short video walkthrough](https://youtu.be/wDtc_K00Y0A) showcasing how you can perform a full history secret scan.
diff --git a/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png
new file mode 100644
index 00000000000..72b24a3fd28
--- /dev/null
+++ b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/security_center_dashboard_empty_v13_4.png b/doc/user/application_security/security_dashboard/img/security_center_dashboard_empty_v13_4.png
deleted file mode 100644
index 5edceb32e5c..00000000000
--- a/doc/user/application_security/security_dashboard/img/security_center_dashboard_empty_v13_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md
index b08c19bee47..8a2c40406e2 100644
--- a/doc/user/application_security/security_dashboard/index.md
+++ b/doc/user/application_security/security_dashboard/index.md
@@ -35,9 +35,7 @@ The security dashboard and vulnerability report displays information about vulne
- [Static Application Security Testing](../sast/index.md)
- And [others](../index.md#security-scanning-tools)!
-## Requirements
-
-To use the security dashboards and vulnerability reports:
+## Prerequisites
1. At least one project inside a group must be configured with at least one of
the [supported reports](#supported-reports).
@@ -52,7 +50,7 @@ To use the security dashboards and vulnerability reports:
At the pipeline level, the Security section displays the vulnerabilities present in the branch of
the project the pipeline ran against.
-![Pipeline Security Dashboard](img/pipeline_security_dashboard_v13_3.png)
+![Pipeline Security Dashboard](img/pipeline_security_dashboard_v13_10.png)
Visit the page for any pipeline that ran any of the [supported reports](#supported-reports). To view
the pipeline's security findings, select the **Security** tab when viewing the pipeline.
@@ -63,13 +61,21 @@ job finishes but the DAST job fails, the security dashboard doesn't show SAST re
the analyzer outputs an
[exit code](../../../development/integrations/secure.md#exit-code).
+### Scan details
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3728) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.10.
+
+The **Scan details** section lists the scans run in the pipeline and the total number of
+vulnerabilities per scan. For the DAST scan, select **Download scanned resources** to download a
+CSV file containing details of the resources scanned.
+
## Project Security Dashboard
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235558) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.6.
At the project level, the Security Dashboard displays a chart with the number of vulnerabilities over time.
Access it by navigating to **Security & Compliance > Security Dashboard**. We display historical
-data up to 365 days.
+data up to 365 days. The chart's data is updated daily.
![Project Security Dashboard](img/project_security_dashboard_chart_v13_6.png)
@@ -130,10 +136,6 @@ bar at the top of the page. Under **More**, select **Security**.
![Security Center navigation link](img/security_center_dashboard_link_v12_4.png)
-The dashboard and vulnerability report are empty before you add projects.
-
-![Uninitialized Security Center](img/security_center_dashboard_empty_v13_4.png)
-
### Adding projects to the Security Center
To add projects to the Security Center:
@@ -175,7 +177,7 @@ lock files. Python projects can have lock files, but GitLab Secure tools don't s
## Security scans using Auto DevOps
When using [Auto DevOps](../../../topics/autodevops/index.md), use
-[special environment variables](../../../topics/autodevops/customize.md#environment-variables)
+[special environment variables](../../../topics/autodevops/customize.md#cicd-variables)
to configure daily security scans.
<!-- ## Troubleshooting
@@ -190,4 +192,4 @@ Each scenario can be a third-level heading, e.g. `### Getting error message X`.
If you have none to add when creating a doc, leave this section in place
but commented out to help encourage others to add to it in the future. -->
-Read more on how to [interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+Read more on how to [address the vulnerabilities](../index.md#addressing-vulnerabilities).
diff --git a/doc/user/application_security/threat_monitoring/index.md b/doc/user/application_security/threat_monitoring/index.md
index 13bde2ed38b..747d31df356 100644
--- a/doc/user/application_security/threat_monitoring/index.md
+++ b/doc/user/application_security/threat_monitoring/index.md
@@ -186,7 +186,7 @@ There are two ways to create policy alerts:
Once added, the UI updates and displays a warning about the dangers of too many alerts.
-#### Enable or disable Policy Alerts **(FREE SELF)**
+#### Enable or disable Policy Alerts **(ULTIMATE)**
Policy Alerts is under development but ready for production use.
It is deployed behind a feature flag that is **enabled by default**.
@@ -223,4 +223,6 @@ checkbox **Hide dismissed alerts**.
![Policy Alert List](img/threat_monitoring_policy_alert_list_v13_9.png)
+Clicking an alert's name takes the user to the [alert details page](../../../operations/incident_management/alerts.md#alert-details-page).
+
For information on work in progress for the alerts dashboard, see [this epic](https://gitlab.com/groups/gitlab-org/-/epics/5041).
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index 50f05b687f7..416db5b07fc 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -19,8 +19,7 @@ Each security vulnerability in a project's [Vulnerability Report](../vulnerabili
On the vulnerability's page, you can:
- [Change the vulnerability's status](#change-vulnerability-status).
-- [Create a GitLab issue](#create-a-gitlab-issue-for-a-vulnerability).
-- [Create a Jira issue](#create-a-jira-issue-for-a-vulnerability).
+- [Create an issue](#create-an-issue-for-a-vulnerability).
- [Link issues to the vulnerability](#link-gitlab-issues-to-the-vulnerability).
- [Automatically remediate the vulnerability](#automatically-remediate-the-vulnerability), if an
automatic solution is available.
@@ -40,7 +39,21 @@ the following values:
A timeline shows you when the vulnerability status has changed
and allows you to comment on a change.
-## Create a GitLab issue for a vulnerability
+## Create an issue for a vulnerability
+
+From a vulnerability's page you can create an issue to track all action taken to resolve or
+mitigate it.
+
+From a vulnerability you can create either:
+
+- [A GitLab issue](#create-a-gitlab-issue-for-a-vulnerability) (default).
+- [A Jira issue](#create-a-jira-issue-for-a-vulnerability).
+
+Creating a Jira issue requires that
+[Jira integration](../../project/integrations/jira_integrations.md) is enabled on the project. Note
+that when Jira integration is enabled, the GitLab issue feature is not available.
+
+### Create a GitLab issue for a vulnerability
To create a GitLab issue for a vulnerability:
@@ -50,7 +63,7 @@ To create a GitLab issue for a vulnerability:
An issue is created in the project, prepopulated with information from the vulnerability report.
The issue is then opened so you can take further action.
-## Create a Jira issue for a vulnerability
+### Create a Jira issue for a vulnerability
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4677) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../../user/feature_flags.md), enabled by default.
@@ -64,16 +77,18 @@ This feature might not be available to you. Check the **version history** note a
Prerequisites:
-- [Enable Jira integration for vulnerabilities](../../project/integrations/jira.md). Select
- **Enable Jira issues creation from vulnerabilities** when configuring the integration.
+- [Enable Jira integration](../../project/integrations/jira.md).
+ The **Enable Jira issues creation from vulnerabilities** option must be selected as part of the configuration.
+- Each user must have a personal Jira user account with permission to create issues in the target project.
To create a Jira issue for a vulnerability:
1. Go to the vulnerability's page.
1. Select **Create Jira issue**.
+1. If you're not already logged in to Jira, log in.
-An issue is created in the linked Jira project, with the **Summary** and **Description** fields
-pre-populated. The Jira issue is then opened in a new browser tab.
+The Jira issue is created and opened in a new browser tab. The **Summary** and **Description**
+fields are pre-populated from the vulnerability's details.
### Enable or disable Jira integration for vulnerabilities **(ULTIMATE SELF)**
@@ -108,4 +123,4 @@ Linked issues are shown in the Vulnerability Report and the vulnerability's page
## Automatically remediate the vulnerability
You can fix some vulnerabilities by applying the solution that GitLab automatically
-generates for you. [Read more about the automatic remediation for vulnerabilities feature](../index.md#automatic-remediation-for-vulnerabilities).
+generates for you. [Read more about the automatic remediation for vulnerabilities feature](../index.md#apply-an-automatic-remediation-for-a-vulnerability).
diff --git a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.png b/doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.png
deleted file mode 100644
index ef96cf31fa4..00000000000
--- a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.png b/doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.png
new file mode 100644
index 00000000000..f9f60810f20
--- /dev/null
+++ b/doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.png
Binary files differ
diff --git a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_v13_9.png b/doc/user/application_security/vulnerability_report/img/project_security_dashboard_v13_9.png
deleted file mode 100644
index 83e67a24b78..00000000000
--- a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.png b/doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.png
deleted file mode 100644
index 5184ad85fa9..00000000000
--- a/doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index 28083e09f1c..583859e2541 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -5,91 +5,147 @@ group: Threat Insights
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Vulnerability Reports **(ULTIMATE)**
+# Vulnerability Report **(ULTIMATE)**
-Each vulnerability report contains vulnerabilities from the scans of the most recent branch merged into the default branch.
+The Vulnerability Report provides information about vulnerabilities from scans of the branch most
+recently merged into the default branch. It is available at the instance, group, and project level.
-The vulnerability reports display the total number of vulnerabilities by severity (for example,
-Critical, High, Medium, Low, Info, Unknown). Below this, a table shows each vulnerability's detected date, status, severity, description, identifier, the scanner where it was detected, and activity (including related issues or available solutions). By default, the vulnerability report is filtered to display all detected and confirmed vulnerabilities.
+At all levels, the Vulnerability Report contains:
+
+- Totals of vulnerabilities per severity level.
+- Filters for common vulnerability attributes.
+- Details of each vulnerability, presented in tabular layout.
![Vulnerability Report](img/group_vulnerability_report_v13_9.png)
-You can filter which vulnerabilities display by:
+## Project-level Vulnerability Report
-| Filter | Available Options |
-| --- | --- |
-| Status | Detected, Confirmed, Dismissed, Resolved |
-| Severity | Critical, High, Medium, Low, Info, Unknown |
-| Scanner | [Available Scanners](../index.md#security-scanning-tools) |
-| Project | Projects configured in the Security Center settings, or all projects in the group for the group level report. This filter is not displayed on the project level vulnerability report |
-| Activity | Vulnerabilities with issues and vulnerabilities that are no longer detected in the default branch |
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6165) in GitLab 11.1.
-The Activity filter behaves differently from the other Vulnerability Report filters. The other filter options all OR together to show results from any vulnerability matching one of the filter criteria. With the Activity filter, the selected values form mutually exclusive sets to allow for precisely locating the desired vulnerability records. Additionally, not all options can be selected in combination. Selection behavior when using the Activity filter:
+The project-level Vulnerability Report also contains:
-| Activity Selection | Results Displayed |
-| --- | --- |
-| All | Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this will deselect any other Activity filter options. |
-| No activity | Only vulnerabilities without either an associated Issue or that are no longer detected. Selecting this will deselect any other Activity filter options. |
-| With issues | Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected. |
-| No longer detected | Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues. |
-| With issues and No longer detected | Only vulnerabilities that have one or more associated issues and also are no longer detected in the latest pipeline scan of the `default` branch. |
+- A time stamp showing when it was updated, including a link to the latest pipeline.
+- The number of failures that occurred in the most recent pipeline. Select the failure
+ notification to view the **Failed jobs** tab of the pipeline's page.
-Clicking any vulnerability in the table takes you to its
-[vulnerability details](../vulnerabilities) page to see more information on that vulnerability.
+To access the report, navigate to **Security & Compliance > Vulnerability Report**.
-The **Activity** column indicates the number of issues that have been created for the vulnerability.
-Hover over an **Activity** entry and select a link go to that issue.
+## Vulnerability Report actions
-![Display attached issues](img/vulnerability_list_table_v13_9.png)
+From the Vulnerability Report you can:
-Contents of the unfiltered vulnerability report can be exported using our [export feature](#export-vulnerabilities).
+- [Filter the list of vulnerabilities](#filter-the-list-of-vulnerabilities).
+- [View more details about a vulnerability](#view-details-of-a-vulnerability).
+- [View an issue raised for a vulnerability](#view-issues-raised-for-a-vulnerability).
+- [Change the status of vulnerabilities](#change-status-of-vulnerabilities).
+- [Export details of vulnerabilities](#export-vulnerability-details).
-You can also dismiss vulnerabilities in the table:
+## Vulnerability Report filters
-1. Select the checkbox for each vulnerability you want to dismiss.
-1. In the menu that appears, select the reason for dismissal and click **Dismiss Selected**.
+You can filter the vulnerabilities table by:
-![Project Vulnerability Report](img/project_security_dashboard_dismissal_v13_9.png)
+| Filter | Available options |
+|:---------|:------------------|
+| Status | Detected, Confirmed, Dismissed, Resolved. |
+| Severity | Critical, High, Medium, Low, Info, Unknown. |
+| Scanner | [Available scanners](../index.md#security-scanning-tools). |
+| Project | For more details, see [Project filter](#project-filter). |
+| Activity | For more details, see [Activity filter](#activity-filter). |
-## Project Vulnerability Report
+### Filter the list of vulnerabilities
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6165) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.1.
+To filter the list of vulnerabilities:
-The vulnerabilities that exist in your project's
-[default branch](../../project/repository/branches/index.md#default-branch) are accessed by navigating to
-**Security & Compliance > Vulnerability Report**.
+1. Select a filter.
+1. Select values from the dropdown.
+1. Repeat the above steps for each desired filter.
-The project vulnerability report first displays the time at which the last pipeline completed on the project's
-default branch. There's also a link to view this in more detail. In the case of any pipeline failures,
-the number of failures is indicated. The failure notification takes you directly to
-the **Failed jobs** tab of the pipeline page.
+The vulnerability table is applied immediately. The vulnerability severity totals are also updated.
-![Project Vulnerability Report](img/project_security_dashboard_v13_9.png)
+The filters' criteria are combined to show only vulnerabilities matching all criteria.
+An exception to this behavior is the Activity filter. For more details about how it works, see
+[Activity filter](#activity-filter).
-## Export vulnerabilities
+### Project filter
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213014) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10.
+The content of the Project filter depends on the current level:
-You can export all your vulnerabilities in CSV (comma separated values) format by clicking the
-**{upload}** **Export** button located at top right of the Security Dashboard. When the report is
-ready, the CSV report downloads to your local machine. The report contains all vulnerabilities for
-the projects defined in the Security Dashboard, as filters don't apply to the export function.
+| Level | Content of the Project filter |
+|:---------------|:------------------------------|
+| Instance level | Only projects you've [added to the instance-level Security Center](../security_dashboard/index.md#adding-projects-to-the-security-center). |
+| Group level | All projects in the group. |
+| Project level | Not applicable. |
-NOTE:
-It may take several minutes for the download to start if your project contains
-thousands of vulnerabilities. Don't close the page until the download finishes.
+### Activity filter
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259255) in GitLab 13.9
-The fields in the export include:
+The Activity filter behaves differently from the other filters. The selected values form mutually
+exclusive sets to allow for precisely locating the desired vulnerability records. Additionally, not
+all options can be selected in combination.
+
+Selection behavior when using the Activity filter:
+
+| Activity selection | Results displayed |
+|:------------------------------------|:------------------|
+| All | Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this will deselect any other Activity filter options. |
+| No activity | Only vulnerabilities without either an associated Issue or that are no longer detected. Selecting this will deselect any other Activity filter options. |
+| With issues | Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected. |
+| No longer detected | Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues. |
+| With issues and No longer detected | Only vulnerabilities that have one or more associated issues and also are no longer detected in the latest pipeline scan of the `default` branch. |
+
+## View details of a vulnerability
+
+To view more details of a vulnerability, select the vulnerability's **Description**. The
+[vulnerability's details](../vulnerabilities) page is opened.
+
+## View issues raised for a vulnerability
+
+The **Activity** column indicates the number of issues that have been created for the vulnerability.
+Hover over an **Activity** entry and select a link go to that issue.
-- Group Name
-- Project Name
-- Scanner Type
-- Scanner Name
+![Display attached issues](img/vulnerability_list_table_v13_9.png)
+
+## Change status of vulnerabilities
+
+To change the status of vulnerabilities in the table:
+
+1. Select the checkbox for each vulnerability you want to update the status of.
+1. In the dropdown that appears select the desired status, then select **Change status**.
+
+![Project Vulnerability Report](img/project_security_dashboard_status_change_v13_9.png)
+
+## Export vulnerability details
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213014) in the Security Center (previously known as the Instance Security Dashboard) and project-level Vulnerability Report (previously known as the Project Security Dashboard) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.0.
+> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/213013) to the group-level Vulnerability Report in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
+
+You can export details of the vulnerabilities listed in the Vulnerability Report. The export format
+is CSV (comma separated values). Note that all vulnerabilities are included because filters don't
+apply to the export.
+
+Fields included are:
+
+- Group name
+- Project name
+- Scanner type
+- Scanner name
- Status
- Vulnerability
- Details
-- Additional Information
+- Additional information
- Severity
- [CVE](https://cve.mitre.org/) (Common Vulnerabilities and Exposures)
- [CWE](https://cwe.mitre.org/) (Common Weakness Enumeration)
-- Other Identifiers
+- Other identifiers
+
+### Export details in CSV format
+
+To export details of all vulnerabilities listed in the Vulnerability Report, select **Export**.
+
+The details are retrieved from the database, then the CSV file is downloaded to your local
+computer.
+
+NOTE:
+It may take several minutes for the download to start if your project contains
+thousands of vulnerabilities. Don't close the page until the download finishes.
diff --git a/doc/user/asciidoc.md b/doc/user/asciidoc.md
index 07593c98da9..6d6460ca50f 100644
--- a/doc/user/asciidoc.md
+++ b/doc/user/asciidoc.md
@@ -30,7 +30,7 @@ Line comments, which are lines that start with `//`, are skipped:
A blank line separates paragraphs.
-A paragraph with the `[%hardbreaks]` option will preserve line breaks:
+A paragraph with the `[%hardbreaks]` option preserves line breaks:
```plaintext
[%hardbreaks]
@@ -381,7 +381,7 @@ Supported formats (named colors are not supported):
- RGB: `` `RGB[A](R, G, B[, A])` ``
- HSL: `` `HSL[A](H, S, L[, A])` ``
-Color written inside backticks will be followed by a color "chip":
+Color written inside backticks is followed by a color "chip":
```plaintext
- `#F00`
@@ -399,7 +399,7 @@ Color written inside backticks will be followed by a color "chip":
To activate equation and formula support,
set the `stem` attribute in the document's header to `latexmath`.
-Equations and formulas will be rendered using [KaTeX](https://katex.org/):
+Equations and formulas are rendered using [KaTeX](https://katex.org/):
```plaintext
:stem: latexmath
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index 6f3d1e197f5..9af339b20c6 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -21,6 +21,7 @@ tasks in a secure and cloud-native way. It enables:
- Pull-based GitOps deployments by leveraging the
[GitOps Engine](https://github.com/argoproj/gitops-engine).
- Real-time access to API endpoints in a cluster.
+- Alert generation based on [Container network policy](../../application_security/threat_monitoring/index.md#container-network-policy).
Many more features are planned. Please review [our roadmap](https://gitlab.com/groups/gitlab-org/-/epics/3329)
and [our development documentation](../../../development/agent/index.md).
@@ -36,7 +37,7 @@ sequenceDiagram
participant D as Developer
participant A as Application code repository
participant M as Manifest repository
- participant K as Kubernetes agent
+ participant K as Kubernetes Agent
participant C as Agent configuration repository
K->C: Grab the configuration
D->>+A: Pushing code changes
@@ -49,19 +50,17 @@ sequenceDiagram
There are several components that work in concert for the Agent to accomplish GitOps deployments:
-- A properly-configured Kubernetes cluster.
+- A properly-configured Kubernetes cluster where the Agent is running.
- A configuration repository that contains a `config.yaml` file, which tells the
- Agent which repositories to synchronize with.
-- A manifest repository that contains a `manifest.yaml`, which is tracked by the
- Agent and can be auto-generated. Any changes to `manifest.yaml` are applied to the cluster.
+ Agent which repositories to synchronize with the cluster.
+- A manifest repository that contains manifest files. Any changes to manifest files are applied to the cluster.
-These repositories might be the same GitLab project or separate projects.
+You can use the same GitLab project or separate projects for configuration and manifest files, as follows:
-NOTE:
-GitLab recommends you use the same GitLab project for the agent configuration
-and manifest repositories. Our backlog contains issues for adding support for
+- Single GitLab project (recommended): when you use a single repository to hold both the manifest and the configuration files, these projects can be either private or public, as you prefer.
+- Two GitLab projects: when you opt to use two different GitLab projects, one for manifest files, and another for configuration files, the manifests project must be private, while the configuration project can be either private or public. Our backlog contains issues for adding support for
[private manifest repositories outside of the configuration project](https://gitlab.com/gitlab-org/gitlab/-/issues/220912) and
-[group level agents](https://gitlab.com/gitlab-org/gitlab/-/issues/283885).
+[group level agents](https://gitlab.com/gitlab-org/gitlab/-/issues/283885) in the future.
For more details, please refer to our [full architecture documentation](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md#high-level-architecture) in the Agent project.
@@ -69,12 +68,12 @@ For more details, please refer to our [full architecture documentation](https://
The setup process involves a few steps to enable GitOps deployments:
-1. [Install the Agent server](#install-the-kubernetes-agent-server).
+1. [Install the Agent server](#install-the-kubernetes-agent-server) for your GitLab instance.
1. [Define a configuration repository](#define-a-configuration-repository).
1. [Create an Agent record in GitLab](#create-an-agent-record-in-gitlab).
1. [Generate and copy a Secret token used to connect to the Agent](#create-the-kubernetes-secret).
1. [Install the Agent into the cluster](#install-the-agent-into-the-cluster).
-1. [Create a `manifest.yaml`](#create-a-manifestyaml).
+1. [Create manifest files](#create-manifest-files).
### Upgrades and version compatibility
@@ -92,7 +91,13 @@ Upgrade your agent installations together with GitLab upgrades. To decide which
The available `agentk` and `kas` versions can be found in
[the container registry](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/container_registry/).
-### Install the Kubernetes Agent Server
+### Install the Kubernetes Agent Server **(FREE SELF)**
+
+[Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3834) in GitLab 13.10,
+the GitLab Kubernetes Agent Server (KAS) is available on GitLab.com under `wss://kas.gitlab.com`.
+If you are a GitLab.com user, skip this step and directly
+[set up the configuration repository](#define-a-configuration-repository)
+for your agent.
The GitLab Kubernetes Agent Server (KAS) can be deployed using [Omnibus
GitLab](https://docs.gitlab.com/omnibus/) or the [GitLab
@@ -100,9 +105,6 @@ chart](https://gitlab.com/gitlab-org/charts/gitlab). If you don't already have
GitLab installed, please refer to our [installation
documentation](https://docs.gitlab.com/ee/install/README.html).
-NOTE:
-GitLab plans to include the KAS on [GitLab.com](https://gitlab.com/groups/gitlab-org/-/epics/3834).
-
#### Install with Omnibus
When using the [Omnibus GitLab](https://docs.gitlab.com/omnibus/) package:
@@ -205,7 +207,13 @@ the Agent in subsequent steps. You can create an Agent record either:
}
mutation createToken {
- clusterAgentTokenCreate(input: { clusterAgentId: <cluster-agent-id-taken-from-the-previous-mutation> }) {
+ clusterAgentTokenCreate(
+ input: {
+ clusterAgentId: "<cluster-agent-id-taken-from-the-previous-mutation>"
+ description: "<optional-description-of-token>"
+ name: "<required-name-given-to-token>"
+ }
+ ) {
secret # This is the value you need to use on the next step
token {
createdAt
@@ -223,7 +231,34 @@ the Agent in subsequent steps. You can create an Agent record either:
[Getting started with the GraphQL API page](../../../api/graphql/getting_started.md),
or the [GraphQL Explorer](https://gitlab.com/-/graphql-explorer).
-### Create the Kubernetes secret
+### Install the Agent into the cluster
+
+Next, install the in-cluster component of the Agent.
+
+NOTE:
+For GitLab.com users, the KAS is available at `wss://kas.gitlab.com`.
+
+#### One-liner installation
+
+Replace the value of `agent-token` below with the token received from the previous step. Also, replace `kas-address` with the configured access of the Kubernetes Agent Server:
+
+```shell
+docker run --rm registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:latest generate --agent-token=your-agent-token --kas-address=wss://kas.gitlab.example.com --agent-version latest | kubectl apply -f -
+```
+
+To find out the various options the above Docker container supports, run:
+
+```shell
+docker run --rm -it registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:latest generate --help
+```
+
+#### Advanced installation
+
+For more advanced configurations, we recommend to use [the `kpt` based installation method](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/tree/master/build/deployment/gitlab-agent).
+
+Otherwise, you can follow below for fully manual, detailed installation steps.
+
+##### Create the Kubernetes secret
After generating the token, you must apply it to the Kubernetes cluster.
@@ -239,9 +274,7 @@ After generating the token, you must apply it to the Kubernetes cluster.
kubectl create secret generic -n <YOUR-DESIRED-NAMESPACE> gitlab-agent-token --from-literal=token='YOUR_AGENT_TOKEN'
```
-### Install the Agent into the cluster
-
-Next, install the in-cluster component of the Agent. This example file contains the
+The following example file contains the
Kubernetes resources required for the Agent to be installed. You can modify this
example [`resources.yml` file](#example-resourcesyml-file) in the following ways:
@@ -253,7 +286,7 @@ example [`resources.yml` file](#example-resourcesyml-file) in the following ways
after you install the `gitlab-kas` sub-chart, or enable `gitlab-kas` for Omnibus GitLab.
When using the sub-chart, you must set `wss://kas.host.tld:443` as
`kas-address`, where `host.tld` is the domain you've setup for your GitLab installation.
- When using Omnibus GitLab, you must set `wss://GitLab.host.tld:443/-/kubernetes-agent` as
+ When using Omnibus GitLab, you must set `wss://GitLab.host.tld:443/-/kubernetes-agent/` as
`kas-address`, where `GitLab.host.tld` is your GitLab hostname.
- When using the sub-chart, specify the `ws` scheme (such as `ws://kas.host.tld:80`)
to use an unencrypted WebSockets connection.
@@ -288,7 +321,7 @@ NAMESPACE NAME READY STATUS RESTARTS AG
gitlab-agent gitlab-agent-77689f7dcb-5skqk 1/1 Running 0 51s
```
-#### Example `resources.yml` file
+##### Example `resources.yml` file
```yaml
apiVersion: v1
@@ -318,7 +351,7 @@ spec:
- --token-file=/config/token
- --kas-address
- wss://kas.host.tld:443 # change this line for the one below if using Omnibus GitLab
- # - wss://gitlab.host.tld:443/-/kubernetes-agent
+ # - wss://gitlab.host.tld:443/-/kubernetes-agent/
volumeMounts:
- name: token-volume
mountPath: /config
@@ -388,11 +421,10 @@ subjects:
namespace: gitlab-agent
```
-### Create a `manifest.yaml`
+### Create manifest files
In a previous step, you configured a `config.yaml` to point to the GitLab projects
-the Agent should synchronize. In each of those projects, you must create a `manifest.yaml`
-file for the Agent to monitor. You can auto-generate this `manifest.yaml` with a
+the Agent should synchronize. Agent monitors each of those projects for changes to the manifest files it contains. You can auto-generate manifest files with a
templating engine or other means.
The agent is authorized to download manifests for the configuration
@@ -400,13 +432,13 @@ project, and public projects. Support for other private projects is
planned in the issue [Agent authorization for private manifest
projects](https://gitlab.com/gitlab-org/gitlab/-/issues/220912).
-Each time you commit and push a change to this file, the Agent logs the change:
+Each time you push a change to a monitored manifest repository, the Agent logs the change:
```plaintext
2020-09-15_14:09:04.87946 gitlab-k8s-agent : time="2020-09-15T10:09:04-04:00" level=info msg="Config: new commit" agent_id=1 commit_id=e6a3651f1faa2e928fe6120e254c122451be4eea
```
-#### Example `manifest.yaml` file
+#### Example manifest file
This file creates an NGINX deployment.
@@ -443,7 +475,52 @@ The following example projects can help you get started with the Kubernetes Agen
### Deploying GitLab Runner with the Agent
You can use the Kubernetes Agent to
-[deploy GitLab Runner in a Kubernetes cluster](http://docs.gitlab.com/runner/install/kubernetes-agent.html).
+[deploy GitLab Runner in a Kubernetes cluster](https://docs.gitlab.com/runner/install/kubernetes-agent.html).
+
+## Kubernetes Network Security Alerts
+
+The GitLab Agent also provides an integration with Cilium. This integration provides a simple way to
+generate network policy-related alerts and to surface those alerts in GitLab.
+
+There are several components that work in concert for the Agent to generate the alerts:
+
+- A working Kubernetes cluster.
+- Cilium integration through either of these options:
+ - Installation through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd).
+ - Enablement of [hubble-relay](https://docs.cilium.io/en/v1.8/concepts/overview/#hubble) on an
+ existing installation.
+- One or more network policies through any of these options:
+ - Use the [Container Network Policy editor](../../application_security/threat_monitoring/index.md#container-network-policy-editor) to create and manage policies.
+ - Use an [AutoDevOps](../../application_security/threat_monitoring/index.md#container-network-policy-management) configuration.
+ - Add the required labels and annotations to existing network policies.
+- Use a configuration repository to inform the Agent through a `config.yaml` file, which
+ repositories can synchronize with. This repository might be the same, or a separate GitLab
+ project.
+
+The setup process follows the same steps as [GitOps](#get-started-with-gitops-and-the-gitlab-agent),
+with the following differences:
+
+- When you define a configuration repository, you must do so with [Cilium settings](#define-a-configuration-repository-with-cilium-settings).
+- You do not need to create a `manifest.yaml`.
+
+### Define a configuration repository with Cilium settings
+
+You need a GitLab repository to contain your Agent configuration. The minimal repository layout
+looks like this:
+
+```plaintext
+.gitlab/agents/<agent-name>/config.yaml
+```
+
+Your `config.yaml` file must specify the `host` and `port` of your Hubble Relay service. If your
+Cilium integration was performed through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd),
+you can use `hubble-relay.gitlab-managed-apps.svc.cluster.local:80`:
+
+```yaml
+cilium:
+ hubble_relay_address: "<hubble-relay-host>:<hubble-relay-port>"
+ ...
+```
## Management interfaces
@@ -497,15 +574,15 @@ This error is shown if there are some connectivity issues between the address
specified as `kas-address`, and your Agent pod. To fix it, make sure that you
specified the `kas-address` correctly.
-### Agent logs - ValidationError(Deployment.metadata
+### Agent logs - ValidationError(Deployment.metadata)
```plaintext
{"level":"info","time":"2020-10-30T08:56:54.329Z","msg":"Synced","project_id":"root/kas-manifest001","resource_key":"apps/Deployment/kas-test001/nginx-deployment","sync_result":"error validating data: [ValidationError(Deployment.metadata): unknown field \"replicas\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"selector\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"template\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta]"}
```
-This error is shown if your `manifest.yaml` file is malformed, and Kubernetes can't
-create specified objects. Make sure that your `manifest.yaml` file is valid. You
-may try using it to create objects in Kubernetes directly for more troubleshooting.
+This error is shown if a manifest file is malformed, and Kubernetes can't
+create specified objects. Make sure that your manifest files are valid. You
+may try using them to create objects in Kubernetes directly for more troubleshooting.
### Agent logs - Error while dialing failed to WebSocket dial: failed to send handshake request
@@ -531,3 +608,72 @@ issue is in progress, directly edit the deployment with the
This error is shown if the version of the agent is newer that the version of KAS.
To fix it, make sure that both `agentk` and KAS use the same versions.
+
+### Agent logs - Certificate signed by unknown authority
+
+```plaintext
+{"level":"error","time":"2021-02-25T07:22:37.158Z","msg":"Reverse tunnel","mod_name":"reverse_tunnel","error":"Connect(): rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent/\\\": x509: certificate signed by unknown authority\""}
+```
+
+This error is shown if your GitLab instance is using a certificate signed by an internal CA that
+is unknown to the agent. One approach to fixing it is to present the CA certificate file to the agent
+via a Kubernetes `configmap` and mount the file in the agent `/etc/ssl/certs` directory from where it
+will be picked up automatically.
+
+For example, if your internal CA certifciate is `myCA.pem`:
+
+```plaintext
+kubectl -n gitlab-agent create configmap ca-pemstore --from-file=myCA.pem
+```
+
+Then in `resources.yml`:
+
+```plaintext
+ spec:
+ serviceAccountName: gitlab-agent
+ containers:
+ - name: agent
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:latest"
+ args:
+ - --token-file=/config/token
+ - --kas-address
+ - wss://kas.host.tld:443 # change this line for the one below if using Omnibus GitLab
+ # - wss://gitlab.host.tld:443/-/kubernetes-agent
+ volumeMounts:
+ - name: token-volume
+ mountPath: /config
+ - name: ca-pemstore-volume
+ mountPath: /etc/ssl/certs/myCA.pem
+ subPath: myCA.pem
+ volumes:
+ - name: token-volume
+ secret:
+ secretName: gitlab-agent-token
+ - name: ca-pemstore-volume
+ configMap:
+ name: ca-pemstore
+ items:
+ - key: myCA.pem
+ path: myCA.pem
+```
+
+Alternatively, you can mount the certificate file at a different location and include it using the
+`--ca-cert-file` agent parameter:
+
+```plaintext
+ containers:
+ - name: agent
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:latest"
+ args:
+ - --ca-cert-file=/tmp/myCA.pem
+ - --token-file=/config/token
+ - --kas-address
+ - wss://kas.host.tld:443 # change this line for the one below if using Omnibus GitLab
+ # - wss://gitlab.host.tld:443/-/kubernetes-agent
+ volumeMounts:
+ - name: token-volume
+ mountPath: /config
+ - name: ca-pemstore-volume
+ mountPath: /tmp/myCA.pem
+ subPath: myCA.pem
+```
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index ad92cf9b4ed..5c3b276b90c 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -86,10 +86,9 @@ is saved as a [CI job artifact](../../ci/pipelines/job_artifacts.md).
#### Usage in GitLab versions earlier than 13.5
-For GitLab versions 13.5 and below, the Ingress, Fluentd, Prometheus,
-and Sentry apps are fetched from the central Helm
-[stable repository](https://kubernetes-charts.storage.googleapis.com/). This repository
-[was deleted](https://github.com/helm/charts#deprecation-timeline)
+For GitLab versions 13.5 and earlier, the Ingress, Fluentd, Prometheus, and Sentry
+apps were fetched from the central Helm stable repository (`https://kubernetes-charts.storage.googleapis.com/`).
+This repository [was deleted](https://github.com/helm/charts#deprecation-timeline)
on November 13, 2020. This causes the installation CI/CD pipeline to
fail. Upgrade to GitLab 13.6, or alternatively, you can
use the following `.gitlab-ci.yml`, which has been tested on GitLab 13.5:
@@ -372,7 +371,7 @@ For GitLab Runner to function, you _must_ specify the following:
- `runnerRegistrationToken`: The registration token for adding new runners to GitLab.
This must be [retrieved from your GitLab instance](../../ci/runners/README.md).
-These values can be specified using [CI variables](../../ci/variables/README.md):
+These values can be specified using [CI/CD variables](../../ci/variables/README.md):
- `GITLAB_RUNNER_GITLAB_URL` is used for `gitlabUrl`.
- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken`
@@ -730,7 +729,7 @@ Set:
- "Redirect URI" to `http://<JupyterHub Host>/hub/oauth_callback`.
- "Scope" to `api read_repository write_repository`.
-In addition, the following variables must be specified using [CI variables](../../ci/variables/README.md):
+In addition, the following variables must be specified using [CI/CD variables](../../ci/variables/README.md):
- `JUPYTERHUB_PROXY_SECRET_TOKEN` - Secure string used for signing communications
from the hub. Read [`proxy.secretToken`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#proxy-secrettoken).
@@ -1469,7 +1468,7 @@ Kubernetes API, giving you access to more advanced querying capabilities. Log
data is deleted after 30 days, using [Curator](https://www.elastic.co/guide/en/elasticsearch/client/curator/5.5/about.html).
The Elastic Stack cluster application is intended as a log aggregation solution
-and is not related to our [Advanced Search](../search/advanced_global_search.md)
+and is not related to our [Advanced Search](../search/advanced_search.md)
functionality, which uses a separate Elasticsearch cluster.
To enable log shipping:
@@ -1655,3 +1654,17 @@ Error: Could not get apiVersions from Kubernetes: unable to retrieve the complet
This is a bug that was introduced in Helm `2.15` and fixed in `3.0.2`. As a workaround,
ensure [`cert-manager`](#cert-manager) is installed successfully prior to installing Prometheus.
+
+### Unable to create a Persistent Volume Claim with DigitalOcean
+
+Trying to create additional block storage volumes might lead to the following error when using DigitalOcean:
+
+```plaintext
+Server requested
+[Warning] pod has unbound immediate PersistentVolumeClaims (repeated 2 times)
+[Normal] pod didn't trigger scale-up (it wouldn't fit if a new node is added):
+Spawn failed: Timeout
+```
+
+This is due to DigitalOcean imposing a few limits with regards to creating additional block storage volumes.
+[Learn more about DigitalOcean Block Storage Volumes limits.](https://www.digitalocean.com/docs/volumes/#limits)
diff --git a/doc/user/clusters/management_project.md b/doc/user/clusters/management_project.md
index ef1b3ce44f2..da9bacc9788 100644
--- a/doc/user/clusters/management_project.md
+++ b/doc/user/clusters/management_project.md
@@ -20,7 +20,7 @@ privileges.
This can be useful for:
-- Creating pipelines to install cluster-wide applications into your cluster, see [Install using GitLab CI/CD (alpha)](applications.md#install-using-gitlab-cicd) for details.
+- Creating pipelines to install cluster-wide applications into your cluster, see [Install using GitLab CI/CD (beta)](applications.md#install-using-gitlab-cicd) for details.
- Any jobs that require `cluster-admin` privileges.
## Permissions
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index 74c608fcc38..6c734a76059 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -14,10 +14,13 @@ project's dependencies for their licenses. You can then decide whether to allow
each license. For example, if your application uses an external (open source) library whose license
is incompatible with yours, then you can deny the use of that license.
-You can take advantage of License Compliance by either [including the job](#configuration)
-in your existing `.gitlab-ci.yml` file or by implicitly using
-[Auto License Compliance](../../../topics/autodevops/stages.md#auto-license-compliance)
-that is provided by [Auto DevOps](../../../topics/autodevops/index.md).
+You can take advantage of License Compliance by either:
+
+- [Including the job](#configuration)
+ in your existing `.gitlab-ci.yml` file.
+- Implicitly using
+ [Auto License Compliance](../../../topics/autodevops/stages.md#auto-license-compliance),
+ provided by [Auto DevOps](../../../topics/autodevops/index.md).
The [License Finder](https://github.com/pivotal/LicenseFinder) scan tool runs as part of the CI/CD
pipeline, and detects the licenses in use. GitLab checks the License Compliance report, compares the
@@ -76,7 +79,7 @@ The reported licenses might be incomplete or inaccurate.
| Elixir | [Mix](https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html) |
| C++/C | [Conan](https://conan.io/) |
| Scala | [sbt](https://www.scala-sbt.org/) |
-| Rust | [Cargo](https://crates.io/) |
+| Rust | [Cargo](https://crates.io) |
| PHP | [Composer](https://getcomposer.org/) |
## Requirements
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index 9320dbba1b8..0ac79a011ca 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference, howto
---
@@ -38,27 +38,26 @@ There is a limit of 5,000 comments for every object, for example: issue, epic, a
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5022) in GitLab 8.11.
> - Resolvable threads can be added only to merge request diffs.
+> - Resolving comments individually was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/28750) in GitLab 13.6.
Thread resolution helps keep track of progress during planning or code review.
-Every standard comment or thread in merge requests, commits, commit diffs, and
+Every thread in merge requests, commits, commit diffs, and
snippets is initially displayed as unresolved. They can then be individually resolved by anyone
with at least Developer access to the project or by the author of the change being reviewed.
If the thread has been resolved and a non-member un-resolves their own response,
-this will also unresolve the discussion thread.
-If the non-member then resolves this same response, this will resolve the discussion thread.
+this also unresolves the discussion thread.
+If the non-member then resolves this same response, this resolves the discussion thread.
-The need to resolve all standard comments or threads prevents you from forgetting
-to address feedback and lets you hide threads that are no longer relevant.
+The need to resolve threads prevents you from forgetting to address feedback and lets you
+hide threads that are no longer relevant.
!["A thread between two people on a piece of code"](img/thread_view.png)
### Commit threads in the context of a merge request
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/31847) in GitLab 10.3.
-
For reviewers with commit-based workflow, it may be useful to add threads to
-specific commit diffs in the context of a merge request. These threads will
+specific commit diffs in the context of a merge request. These threads
persist through a commit ID change when:
- force-pushing after a rebase
@@ -67,27 +66,27 @@ persist through a commit ID change when:
To create a commit diff thread:
1. Navigate to the merge request **Commits** tab. A list of commits that
- constitute the merge request will be shown.
+ constitute the merge request are shown.
![Merge request commits tab](img/merge_request_commits_tab.png)
-1. Navigate to a specific commit, click on the **Changes** tab (where you
- will only be presented diffs from the selected commit), and leave a comment.
+1. Navigate to a specific commit, select the **Changes** tab (where you
+ are only be presented diffs from the selected commit), and leave a comment.
![Commit diff discussion in merge request context](img/commit_comment_mr_context.png)
-1. Any threads created this way will be shown in the merge request's
+1. Any threads created this way are shown in the merge request's
**Discussions** tab and are resolvable.
![Merge request Discussions tab](img/commit_comment_mr_discussions_tab.png)
-Threads created this way will only appear in the original merge request
+Threads created this way only appear in the original merge request
and not when navigating to that commit under your project's
**Repository > Commits** page.
NOTE:
When a link of a commit reference is found in a thread inside a merge
-request, it will be automatically converted to a link in the context of the
+request, it is automatically converted to a link in the context of the
current merge request.
### Marking a comment or thread as resolved
@@ -103,8 +102,6 @@ Alternatively, you can mark each comment as resolved individually.
### Move all unresolved threads in a merge request to an issue
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8266) in GitLab 9.1
-
To continue all open threads from a merge request in a new issue, click the
**Resolve all threads in new issue** button.
@@ -112,17 +109,17 @@ To continue all open threads from a merge request in a new issue, click the
Alternatively, when your project only accepts merge requests [when all threads
are resolved](#only-allow-merge-requests-to-be-merged-if-all-threads-are-resolved),
-there will be an **open an issue to resolve them later** link in the merge
+an **open an issue to resolve them later** link displays in the merge
request widget.
![Link in merge request widget](img/resolve_thread_open_issue_v13_9.png)
-This will prepare an issue with its content referring to the merge request and
+This prepares an issue with its content referring to the merge request and
the unresolved threads.
![Issue mentioning threads in a merge request](img/preview_issue_for_threads.png)
-Hitting **Submit issue** will cause all threads to be marked as resolved and
+Hitting **Submit issue** causes all threads to be marked as resolved and
add a note referring to the newly created issue.
![Mark threads as resolved notice](img/resolve_thread_issue_notice.png)
@@ -131,24 +128,20 @@ You can now proceed to merge the merge request from the UI.
### Moving a single thread to a new issue
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8266) in GitLab 9.1
-
To create a new issue for a single thread, you can use the **Resolve this
thread in a new issue** button.
![Create issue for thread](img/new_issue_for_thread.png)
-This will direct you to a new issue prefilled with the content of the
+This directs you to a new issue prefilled with the content of the
thread, similar to the issues created for delegating multiple
-threads at once. Saving the issue will mark the thread as resolved and
+threads at once. Saving the issue marks the thread as resolved and
add a note to the merge request thread referencing the new issue.
![New issue for a single thread](img/preview_issue_for_thread.png)
### Only allow merge requests to be merged if all threads are resolved
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7125) in GitLab 8.14.
-
You can prevent merge requests from being merged until all threads are
resolved.
@@ -158,15 +151,13 @@ box and hit **Save** for the changes to take effect.
![Only allow merge if all the threads are resolved settings](img/only_allow_merge_if_all_threads_are_resolved.png)
-From now on, you will not be able to merge from the UI until all threads
+From now on, you can't merge from the UI until all threads
are resolved.
![Only allow merge if all the threads are resolved message](img/resolve_thread_open_issue_v13_9.png)
### Automatically resolve merge request diff threads when they become outdated
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14053) in GitLab 10.0.
-
You can automatically resolve merge request diff threads on lines modified
with a new push.
@@ -176,7 +167,7 @@ merge request diffs threads on lines changed with a push** check box and hit
![Automatically resolve merge request diff threads when they become outdated](img/automatically_resolve_outdated_discussions.png)
-From now on, any threads on a diff will be resolved by default if a push
+From now on, any threads on a diff are resolved by default if a push
makes that diff section outdated. Threads on lines that don't change and
top-level resolvable threads are not automatically resolved.
@@ -186,33 +177,29 @@ You can add comments and threads to a particular commit under your
project's **Repository > Commits**.
WARNING:
-Threads created this way will be lost if the commit ID changes after a
+Threads created this way are lost if the commit ID changes after a
force push.
## Threaded discussions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7527) in GitLab 9.1.
-
While resolvable threads are only available to merge request diffs,
threads can also be added without a diff. You can start a specific
-thread which will look like a thread, on issues, commits, snippets, and
+thread which looks like a thread, on issues, commits, snippets, and
merge requests.
-To start a threaded discussion, click on the **Comment** button toggle dropdown,
-select **Start thread** and click **Start thread** when you're ready to
+To start a threaded discussion, select the **Comment** button toggle dropdown,
+select **Start thread**, and then select **Start thread** when you're ready to
post the comment.
![Comment type toggle](img/comment_type_toggle.gif)
-This will post a comment with a single thread to allow you to discuss specific
+This posts a comment with a single thread to allow you to discuss specific
comments in greater detail.
![Thread comment](img/discussion_comment.png)
## Image threads
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14061) in GitLab 10.1.
-
Sometimes a thread is revolved around an image. With image threads,
you can easily target a specific coordinate of an image and start a thread
around it. Image threads are available in merge requests and commit detail views.
@@ -223,33 +210,31 @@ Simply click anywhere on the image to create a new thread.
![Start image thread](img/start_image_discussion.gif)
-After you click on the image, a comment form will be displayed that would be the start
-of your thread. Once you save your comment, you will see a new badge displayed on
+After you select the image, a comment form is displayed that would be the start
+of your thread. After you save your comment, a new badge is displayed on
top of your image. This badge represents your thread.
NOTE:
This thread badge is typically associated with a number that is only used as a visual
reference for each thread. In the merge request thread tab,
-this badge will be indicated with a comment icon since each thread will render a new
+this badge is indicated with a comment icon, because each thread renders a new
image section.
Image threads also work on diffs that replace an existing image. In this diff view
mode, you can toggle the different view modes and still see the thread point badges.
-| 2-up | Swipe | Onion Skin |
-| :-----------: | :----------: | :----------: |
+| 2-up | Swipe | Onion Skin |
+|:-----------:|:----------:|:----------:|
| ![2-up view](img/two_up_view.png) | ![swipe view](img/swipe_view.png) | ![onion skin view](img/onion_skin_view.png) |
Image threads also work well with resolvable threads. Resolved threads
-on diffs (not on the merge request discussion tab) will appear collapsed on page
-load and will have a corresponding badge counter to match the counter on the image.
+on diffs (not on the merge request discussion tab) appear collapsed on page
+load and have a corresponding badge counter to match the counter on the image.
![Image resolved thread](img/image_resolved_discussion.png)
## Lock discussions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14531) in GitLab 10.1.
-
For large projects with many contributors, it may be useful to stop threads
in issues or merge requests in these scenarios:
@@ -279,7 +264,7 @@ edit existing comments. Non-team members are restricted from adding or editing c
| :-----------: | :----------: |
| ![Comment form member](img/lock_form_member.png) | ![Comment form non-member](img/lock_form_non_member.png) |
-Additionally, locked issues and merge requests can not be reopened.
+Additionally, locked issues and merge requests can't be reopened.
## Confidential Comments
@@ -292,29 +277,29 @@ Additionally, locked issues and merge requests can not be reopened.
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-When creating a comment, you can decide to make it visible only to the project members (users with Reporter and higher permissions).
+When creating a comment, you can make it visible only to the project members (users with Reporter and higher permissions).
-To create a confidential comment, select the **Make this comment confidential** checkbox before you submit it.
+To create a confidential comment, select the **Make this comment confidential** check box before you submit it.
![Confidential comments](img/confidential_comments_v13_9.png)
-## Merge Request Reviews
+## Merge request reviews
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4213) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.4.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/28154) to GitLab Free in 13.1.
-When looking at a Merge Request diff, you are able to start a review.
-This allows you to create comments inside a Merge Request that are **only visible to you** until published,
+When looking at a merge request diff, you are able to start a review.
+This allows you to create comments inside a merge request that are **only visible to you** until published,
in order to allow you to submit them all as a single action.
### Starting a review
-In order to start a review, simply write a comment on a diff as normal under the **Changes** tab
-in an MR and click on the **Start a review** button.
+To start a review, write a comment on a diff as normal under the **Changes** tab
+in a merge request, and then select **Start a review**.
![Starting a review](img/mr_review_start.png)
-Once a review is started, you will see any comments that are part of this review marked `Pending`.
+After a review is started, any comments that are part of this review are marked `Pending`.
All comments that are part of a review show two buttons:
- **Finish review**: Submits all comments that are part of the review, making them visible to other users.
@@ -322,7 +307,7 @@ All comments that are part of a review show two buttons:
![A comment that is part of a review](img/pending_review_comment.png)
-You can use [quick actions](../project/quick_actions.md) inside review comments. The comment will show the actions that will be performed once published.
+You can use [quick actions](../project/quick_actions.md) inside review comments. The comment shows the actions to perform after publication.
![A review comment with quick actions](img/review_comment_quickactions.png)
@@ -330,19 +315,19 @@ To add more comments to a review, start writing a comment as normal and click th
![Adding a second comment to a review](img/mr_review_second_comment.png)
-This will add the comment to the review.
+This adds the comment to the review.
![Second review comment](img/mr_review_second_comment_added.png)
### Resolving/Unresolving threads
Review comments can also resolve/unresolve [resolvable threads](#resolvable-comments-and-threads).
-When replying to a comment, you will see a checkbox that you can click in order to resolve or unresolve
-the thread once published.
+When replying to a comment, a checkbox is displayed that you can click to resolve or unresolve
+the thread after publication.
![Resolve checkbox](img/mr_review_resolve.png)
-If a particular pending comment will resolve or unresolve the thread, this will be shown on the pending
+If a particular pending comment resolves or unresolves the thread, this is shown on the pending
comment itself.
![Resolve status](img/mr_review_resolve2.png)
@@ -351,12 +336,12 @@ comment itself.
### Submitting a review
-If you have any comments that have not been submitted, you will see a bar at the
+If you have any comments that have not been submitted, a bar displays at the
bottom of the screen with two buttons:
- **Discard**: Discards all comments that have not been submitted.
- **Finish review**: Opens a list of comments ready to be submitted for review.
- Clicking **Submit review** will publish all comments. Any quick actions
+ Clicking **Submit review** publishes all comments. Any quick actions
submitted are performed at this time.
Alternatively, to finish the entire review from a pending comment:
@@ -366,14 +351,14 @@ Alternatively, to finish the entire review from a pending comment:
![Review submission](img/review_preview.png)
-Submitting the review will send a single email to every notifiable user of the
+Submitting the review sends a single email to every notifiable user of the
merge request with all the comments associated to it.
Replying to this email will, consequentially, create a new comment on the associated merge request.
## Filtering notes
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26723) in GitLab 11.5.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26723) in GitLab 11.5.
For issues with many comments like activity notes and user comments, sometimes
finding useful information can be hard. There is a way to filter comments from single notes and threads for merge requests and issues.
@@ -387,24 +372,21 @@ From a merge request's **Discussion** tab, or from an epic/issue overview, find
![Notes filters dropdown options](img/index_notes_filters.png)
-After you select one of the filters in a given issue or MR, GitLab will save
-your preference, so that it will persist when you visit the same page again
+After you select one of the filters in a given issue or merge request, GitLab saves
+your preference, so that it persists when you visit the same page again
from any device you're logged into.
## Suggest Changes
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/18008) in GitLab 11.6.
-> - Custom commit messages for suggestions was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9.
-> - Custom commit messages for suggestions was deployed behind a [feature flag](../feature_flags.md), disabled by default.
-> - Custom commit messages for suggestions became enabled by default on GitLab 13.9.
-> - Custom commit messages for suggestions is enabled on GitLab.com and is recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disabled it](#enable-or-disable-custom-commit-messages-for-suggestions). **(FREE SELF)**
-
-As a reviewer, you're able to suggest code changes with a simple
-Markdown syntax in Merge Request Diff threads. Then, the
-Merge Request author (or other users with appropriate
+> - Custom commit messages for suggestions was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9 behind a [feature flag](../feature_flags.md), disabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/297404) in GitLab 13.10.
+
+As a reviewer, you're able to suggest code changes with a
+Markdown syntax in merge request diff threads. Then, the
+merge request author (or other users with appropriate
[permission](../permissions.md)) is able to apply these
-Suggestions with a click, which will generate a commit in
+Suggestions with a click, which generates a commit in
the merge request authored by the user that applied them.
1. Choose a line of code to be changed, add a new comment, then click
@@ -425,19 +407,18 @@ the merge request authored by the user that applied them.
1. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9,
you can opt to add a custom commit message to describe your change. If you don't
- specify it, the default commit message will be used. Note that [this feature may not be available to you](#enable-or-disable-custom-commit-messages-for-suggestions).
- Also, it is not supported for [batch suggestions](#batch-suggestions).
+ specify it, the default commit message is used. It is not supported for [batch suggestions](#batch-suggestions).
![Custom commit](img/custom_commit_v13_9.png)
-After the author applies a Suggestion, it will be marked with the **Applied** label,
-the thread will be automatically resolved, and GitLab will create a new commit
+After the author applies a Suggestion, it is marked with the **Applied** label,
+the thread is automatically resolved, and GitLab creates a new commit
and push the suggested change directly into the codebase in the merge request's
branch. [Developer permission](../permissions.md) is required to do so.
### Multi-line Suggestions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53310) in GitLab 11.10.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53310) in GitLab 11.10.
Reviewers can also suggest changes to multiple lines with a single Suggestion
within merge request diff threads by adjusting the range offsets. The
@@ -469,12 +450,12 @@ instead of the usual three.
### Configure the commit message for applied Suggestions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13086) in GitLab 12.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13086) in GitLab 12.7.
GitLab uses a default commit message
when applying Suggestions: `Apply %{suggestions_count} suggestion(s) to %{files_count} file(s)`
-For example, consider that a user applied 3 suggestions to 2 different files, the default commit message will be: **Apply 3 suggestion(s) to 2 file(s)**
+For example, consider that a user applied 3 suggestions to 2 different files, the default commit message is: **Apply 3 suggestion(s) to 2 file(s)**
These commit messages can be customized to follow any guidelines you might have. To do so, expand the **Merge requests**
tab within your project's **General** settings and change the
@@ -484,23 +465,23 @@ tab within your project's **General** settings and change the
You can also use following variables besides static text:
-| Variable | Description | Output example |
-|---|---|---|
-| `%{branch_name}` | The name of the branch the Suggestion(s) was(were) applied to. | `my-feature-branch` |
-| `%{files_count}` | The number of file(s) to which Suggestion(s) was(were) applied.| **2** |
-| `%{file_paths}` | The path(s) of the file(s) Suggestion(s) was(were) applied to. Paths are separated by commas.| `docs/index.md, docs/about.md` |
-| `%{project_path}` | The project path. | `my-group/my-project` |
-| `%{project_name}` | The human-readable name of the project. | **My Project** |
+| Variable | Description | Output example |
+|------------------------|-------------|----------------|
+| `%{branch_name}` | The name of the branch the Suggestion(s) was(were) applied to. | `my-feature-branch` |
+| `%{files_count}` | The number of file(s) to which Suggestion(s) was(were) applied.| **2** |
+| `%{file_paths}` | The path(s) of the file(s) Suggestion(s) was(were) applied to. Paths are separated by commas.| `docs/index.md, docs/about.md` |
+| `%{project_path}` | The project path. | `my-group/my-project` |
+| `%{project_name}` | The human-readable name of the project. | **My Project** |
| `%{suggestions_count}` | The number of Suggestions applied.| **3** |
-| `%{username}` | The username of the user applying Suggestion(s). | `user_1` |
-| `%{user_full_name}` | The full name of the user applying Suggestion(s). | **User 1** |
+| `%{username}` | The username of the user applying Suggestion(s). | `user_1` |
+| `%{user_full_name}` | The full name of the user applying Suggestion(s). | **User 1** |
For example, to customize the commit message to output
**Addresses user_1's review**, set the custom text to
`Addresses %{username}'s review`.
NOTE:
-Custom commit messages for each applied Suggestion (and for batch Suggestions) will be
+Custom commit messages for each applied Suggestion is
introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381).
### Batch Suggestions
@@ -514,7 +495,7 @@ introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381).
You can apply multiple suggestions at once to reduce the number of commits added
to your branch to address your reviewers' requests.
-1. To start a batch of suggestions that will be applied with a single commit, click **Add suggestion to batch**:
+1. To start a batch of suggestions to apply with a single commit, click **Add suggestion to batch**:
![A code change suggestion displayed, with the button to add the suggestion to a batch highlighted.](img/add_first_suggestion_to_batch_v13_1.jpg "Add a suggestion to a batch")
@@ -532,7 +513,7 @@ to your branch to address your reviewers' requests.
## Start a thread by replying to a standard comment
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30299) in GitLab 11.9
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30299) in GitLab 11.9
To reply to a standard (non-thread) comment, you can use the **Reply to comment** button.
@@ -540,20 +521,20 @@ To reply to a standard (non-thread) comment, you can use the **Reply to comment*
The **Reply to comment** button is only displayed if you have permissions to reply to an existing thread, or start a thread from a standard comment.
-Clicking on the **Reply to comment** button will bring the reply area into focus and you can type your reply.
+Clicking on the **Reply to comment** button brings the reply area into focus and you can type your reply.
![Reply to comment feature](img/reply_to_comment.gif)
-Replying to a non-thread comment will convert the non-thread comment to a
+Replying to a non-thread comment converts the non-thread comment to a
thread after the reply is submitted. This conversion is considered an edit
-to the original comment, so a note about when it was last edited will appear underneath it.
+to the original comment, so a note about when it was last edited appears underneath it.
-This feature only exists for Issues, Merge requests, and Epics. Commits, Snippets and Merge request diff threads are
+This feature exists only for issues, merge requests, and epics. Commits, snippets, and merge request diff threads are
not supported yet.
## Assign an issue to the commenting user
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
You can assign an issue to a user who made a comment.
@@ -582,25 +563,6 @@ To disable it:
Feature.disable(:confidential_notes)
```
-## Enable or disable Custom commit messages for suggestions **(FREE SELF)**
-
-Custom commit messages for suggestions is under development but ready for production use. It is
-deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can opt to disable it.
-
-To disable custom commit messages for suggestions:
-
-```ruby
-Feature.disable(:suggestions_custom_commit)
-```
-
-To enable custom commit messages for suggestions:
-
-```ruby
-Feature.enable(:suggestions_custom_commit)
-```
-
## Enable or disable Batch Suggestions **(FREE SELF)**
Batch Suggestions is
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index f988d825c9f..c61e49993e6 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -4,7 +4,7 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab.com settings
+# GitLab.com settings **(FREE SAAS)**
This page contains information about the settings that are used on
[GitLab.com](https://about.gitlab.com/pricing/).
diff --git a/doc/user/group/custom_project_templates.md b/doc/user/group/custom_project_templates.md
index a59b1f2e9b2..813d2b8e265 100644
--- a/doc/user/group/custom_project_templates.md
+++ b/doc/user/group/custom_project_templates.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Custom project templates are useful for organizations that need to create many similar types of [projects](../project/index.md) and want to start from the same jumping-off point.
-## Setting up Group-level Project Templates
+## Setting up group-level project templates
To use a custom project template for a new project you need to:
@@ -30,7 +30,7 @@ To use a custom project template for a new project you need to:
Here is a sample group/project structure for a hypothetical "Acme Co" for project templates:
-```txt
+```plaintext
# GitLab instance and group
gitlab.com/acmeco/
# Subgroups
diff --git a/doc/user/group/epics/index.md b/doc/user/group/epics/index.md
index c76b07481b2..1cb024ceb01 100644
--- a/doc/user/group/epics/index.md
+++ b/doc/user/group/epics/index.md
@@ -154,7 +154,7 @@ You can also consult the [group permissions table](../../permissions.md#group-me
- Comments: collaborate on that epic by posting comments in its thread.
These text fields also fully support
- [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+ [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
## Comment or start a thread
diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md
index d4c1a5fc768..3c5e140965a 100644
--- a/doc/user/group/epics/manage_epics.md
+++ b/doc/user/group/epics/manage_epics.md
@@ -75,6 +75,9 @@ A modal appears to confirm your action.
Deleting an epic releases all existing issues from their associated epic in the system.
+WARNING:
+If you delete an epic, all its child epics and their descendants are deleted as well. If needed, you can [remove child epics](#remove-a-child-epic-from-a-parent-epic) from the parent epic before you delete it.
+
## Close an epic
Whenever you decide that there is no longer need for that epic,
@@ -243,7 +246,7 @@ To move an issue to another epic:
If you have the necessary [permissions](../../permissions.md) to close an issue and create an
epic in the immediate parent group, you can promote an issue to an epic with the `/promote`
-[quick action](../../project/quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+[quick action](../../project/quick_actions.md#issues-merge-requests-and-epics).
Only issues from projects that are in groups can be promoted. When you attempt to promote a confidential
issue, a warning is displayed. Promoting a confidential issue to an epic makes all information
related to the issue public as epics are public to group members.
diff --git a/doc/user/group/img/access_requests_management.png b/doc/user/group/img/access_requests_management.png
deleted file mode 100644
index 7de6a1c0a5e..00000000000
--- a/doc/user/group/img/access_requests_management.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/add_new_members_v13_7.png b/doc/user/group/img/add_new_members_v13_7.png
deleted file mode 100644
index 7e06bdf8fd1..00000000000
--- a/doc/user/group/img/add_new_members_v13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/create_new_group_info.png b/doc/user/group/img/create_new_group_info.png
deleted file mode 100644
index bd724240c37..00000000000
--- a/doc/user/group/img/create_new_group_info.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/create_new_project_from_group_v13_6.png b/doc/user/group/img/create_new_project_from_group_v13_6.png
deleted file mode 100644
index 72d19817686..00000000000
--- a/doc/user/group/img/create_new_project_from_group_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_activity_analytics_v12_10.png b/doc/user/group/img/group_activity_analytics_v12_10.png
deleted file mode 100644
index e49594c155b..00000000000
--- a/doc/user/group/img/group_activity_analytics_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_activity_analytics_v13_10.png b/doc/user/group/img/group_activity_analytics_v13_10.png
new file mode 100644
index 00000000000..b6e9b04861d
--- /dev/null
+++ b/doc/user/group/img/group_activity_analytics_v13_10.png
Binary files differ
diff --git a/doc/user/group/img/group_file_template_dropdown.png b/doc/user/group/img/group_file_template_dropdown.png
deleted file mode 100644
index f0586772218..00000000000
--- a/doc/user/group/img/group_file_template_dropdown.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_2fa_disabled_13_7.png b/doc/user/group/img/group_members_filter_2fa_disabled_13_7.png
deleted file mode 100644
index 8336103bad1..00000000000
--- a/doc/user/group/img/group_members_filter_2fa_disabled_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_2fa_enabled_13_7.png b/doc/user/group/img/group_members_filter_2fa_enabled_13_7.png
deleted file mode 100644
index eb27906b583..00000000000
--- a/doc/user/group/img/group_members_filter_2fa_enabled_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_direct_13_7.png b/doc/user/group/img/group_members_filter_direct_13_7.png
deleted file mode 100644
index c1b2d996e59..00000000000
--- a/doc/user/group/img/group_members_filter_direct_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_inherited_13_7.png b/doc/user/group/img/group_members_filter_inherited_13_7.png
deleted file mode 100644
index f75990f9da8..00000000000
--- a/doc/user/group/img/group_members_filter_inherited_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_search_13_7.png b/doc/user/group/img/group_members_search_13_7.png
deleted file mode 100644
index 21f36fc75f8..00000000000
--- a/doc/user/group/img/group_members_search_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_sort_13_7.png b/doc/user/group/img/group_members_sort_13_7.png
deleted file mode 100644
index 5d307da649a..00000000000
--- a/doc/user/group/img/group_members_sort_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_settings.png b/doc/user/group/img/group_settings.png
deleted file mode 100644
index f3a75f1bde8..00000000000
--- a/doc/user/group/img/group_settings.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/groups.png b/doc/user/group/img/groups.png
deleted file mode 100644
index 2e27d46b370..00000000000
--- a/doc/user/group/img/groups.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/ldap_sync_cn_v13_1.png b/doc/user/group/img/ldap_sync_cn_v13_1.png
deleted file mode 100644
index 279b3192328..00000000000
--- a/doc/user/group/img/ldap_sync_cn_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/ldap_sync_filter_v13_1.png b/doc/user/group/img/ldap_sync_filter_v13_1.png
deleted file mode 100644
index 655bed58d46..00000000000
--- a/doc/user/group/img/ldap_sync_filter_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/manual_permissions_v13_7.png b/doc/user/group/img/manual_permissions_v13_7.png
deleted file mode 100644
index fcea0121915..00000000000
--- a/doc/user/group/img/manual_permissions_v13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/member_lock.png b/doc/user/group/img/member_lock.png
deleted file mode 100644
index 3f1382e76c6..00000000000
--- a/doc/user/group/img/member_lock.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/new_group_from_groups.png b/doc/user/group/img/new_group_from_groups.png
deleted file mode 100644
index ffafac1b1cd..00000000000
--- a/doc/user/group/img/new_group_from_groups.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/new_group_from_other_pages.png b/doc/user/group/img/new_group_from_other_pages.png
deleted file mode 100644
index f84501d1ff2..00000000000
--- a/doc/user/group/img/new_group_from_other_pages.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/request_access_button.png b/doc/user/group/img/request_access_button.png
deleted file mode 100644
index 4d73990ec7e..00000000000
--- a/doc/user/group/img/request_access_button.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/select_group_dropdown.png b/doc/user/group/img/select_group_dropdown.png
deleted file mode 100644
index 4948cefb65f..00000000000
--- a/doc/user/group/img/select_group_dropdown.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/select_group_dropdown_13_10.png b/doc/user/group/img/select_group_dropdown_13_10.png
new file mode 100644
index 00000000000..bf0d927b653
--- /dev/null
+++ b/doc/user/group/img/select_group_dropdown_13_10.png
Binary files differ
diff --git a/doc/user/group/img/share_with_group_lock.png b/doc/user/group/img/share_with_group_lock.png
deleted file mode 100644
index 77b00d8a248..00000000000
--- a/doc/user/group/img/share_with_group_lock.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/withdraw_access_request_button.png b/doc/user/group/img/withdraw_access_request_button.png
deleted file mode 100644
index a5fe78eb090..00000000000
--- a/doc/user/group/img/withdraw_access_request_button.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index f4d15dce1cd..302f12273cb 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -20,11 +20,23 @@ Using GitLab Group Migration, you can migrate existing top-level groups from Git
The following resources are migrated to the target instance:
-- Groups
+- Groups ([Introduced in 13.7](https://gitlab.com/groups/gitlab-org/-/epics/4374))
- description
- attributes
- subgroups
-- Epics
+- Group Labels ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/292429))
+ - title
+ - description
+ - color
+ - created_at ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/300007))
+ - updated_at ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/300007))
+- Members ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/299415))
+ Group members are associated with the imported group if:
+ - The user already exists in the target GitLab instance and
+ - The user has a public email in the source GitLab instance that matches a
+ confirmed email in the target GitLab instance
+ confirmed email in the target GitLab instance
+- Epics ([Introduced in 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/250281))
- title
- description
- state (open / closed)
@@ -32,6 +44,28 @@ The following resources are migrated to the target instance:
- due date
- epic order on boards
- confidentiality
+ - labels ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297460))
+ - author ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/298745))
+ - parent epic ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297459))
+ - emoji award ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297466))
+ - events ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/297465))
+- Milestones ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292427))
+ - title
+ - description
+ - state (active / closed)
+ - start date
+ - due date
+ - created at
+ - updated at
+- Iterations ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292428))
+ - iid
+ - title
+ - description
+ - state (upcoming / started / closed)
+ - start date
+ - due date
+ - created at
+ - updated at
Any other items are **not** migrated.
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 4c63bae7e44..36d292f670d 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -5,56 +5,36 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Groups
+# Groups **(FREE)**
-With GitLab Groups, you can:
+In GitLab, you can put related projects together in a group.
-- Assemble related projects together.
-- Grant members access to several projects at once.
+For example, you might create a group for your company members and a subgroup for each individual team.
+You can name the group `company-team`, and the subgroups `backend-team`, `frontend-team`, and `production-team`.
-For a video introduction to GitLab Groups, see [GitLab University: Repositories, Projects and Groups](https://www.youtube.com/watch?v=4TWfh1aKHHw).
+Then you can:
-Groups can also be nested in [subgroups](subgroups/index.md).
+- Grant members access to multiple projects at once.
+- Add to-do items for all of the group members at once.
+- View the [issues](../project/issues/index.md#issues-list) and
+ [merge requests](../project/merge_requests/reviewing_and_managing_merge_requests.md#view-merge-requests-for-all-projects-in-a-group)
+ for all projects in the group, together in a single list view.
+- [Bulk edit](../group/bulk_editing/index.md) issues, epics, and merge requests.
-Find your groups by clicking **Groups > Your Groups** in the top navigation.
+You can also create [subgroups](subgroups/index.md).
-![GitLab Groups](img/groups.png)
+## View groups
-> The **Groups** dropdown in the top navigation was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36234) in [GitLab 11.1](https://about.gitlab.com/releases/2018/07/22/gitlab-11-1-released/#groups-dropdown-in-navigation).
+To view groups:
-The **Groups** page displays:
+1. In the top menu, select **Groups > Your Groups**. All groups you are a member of are displayed.
+1. To view a list of public groups, select **Explore public groups**.
-- All groups you are a member of, when **Your groups** is selected.
-- A list of public groups, when **Explore public groups** is selected.
+You can also view groups by namespace.
-Each group on the **Groups** page is listed with:
+### Namespaces
-- How many subgroups it has.
-- How many projects it contains.
-- How many members the group has, not including members inherited from parent group(s).
-- The group's visibility.
-- A link to the group's settings, if you have sufficient permissions.
-- A link to leave the group, if you are a member.
-
-## Use cases
-
-You can create groups for numerous reasons. To name a couple:
-
-- Grant access to multiple projects and multiple team members in fewer steps by organizing related projects under the same [namespace](#namespaces) and adding members to the top-level group.
-- Make it easier to `@mention` all of your team at once in issues and merge requests by creating a group and including the appropriate members.
-
-For example, you could create a group for your company members, and create a [subgroup](subgroups/index.md) for each individual team. Let's say you create a group called `company-team`, and you create subgroups in this group for the individual teams `backend-team`, `frontend-team`, and `production-team`.
-
-- When you start a new implementation from an issue, you add a comment:
- _"`@company-team`, let's do it! `@company-team/backend-team` you're good to go!"_
-- When your backend team needs help from frontend, they add a comment:
- _"`@company-team/frontend-team` could you help us here please?"_
-- When the frontend team completes their implementation, they comment:
- _"`@company-team/backend-team`, it's done! Let's ship it `@company-team/production-team`!"_
-
-## Namespaces
-
-In GitLab, a namespace is a unique name to be used as a user name, a group name, or a subgroup name.
+In GitLab, a namespace is a unique name and URL for a user, a group, or subgroup.
- `http://gitlab.example.com/username`
- `http://gitlab.example.com/groupname`
@@ -62,154 +42,106 @@ In GitLab, a namespace is a unique name to be used as a user name, a group name,
For example, consider a user named Alex:
-1. Alex creates an account on GitLab.com with the username `alex`;
- their profile will be accessed under `https://gitlab.example.com/alex`
-1. Alex creates a group for their team with the group name `alex-team`;
- the group and its projects will be accessed under `https://gitlab.example.com/alex-team`
-1. Alex creates a subgroup of `alex-team` with the subgroup name `marketing`;
- this subgroup and its projects will be accessed under `https://gitlab.example.com/alex-team/marketing`
-
-By doing so:
-
-- Any team member mentions Alex with `@alex`
-- Alex mentions everyone from their team with `@alex-team`
-- Alex mentions only the marketing team with `@alex-team/marketing`
-
-## Issues and merge requests within a group
-
-Issues and merge requests are part of projects. For a given group, you can view all of the
-[issues](../project/issues/index.md#issues-list) and [merge requests](../project/merge_requests/reviewing_and_managing_merge_requests.md#view-merge-requests-for-all-projects-in-a-group) across all projects in that group,
-together in a single list view.
-
-### Bulk editing issues and merge requests
-
-For details, see [bulk editing issues and merge requests](../group/bulk_editing/index.md).
-
-## Create a new group
-
-> For a list of words that are not allowed to be used as group names see the
-> [reserved names](../reserved_names.md).
-
-To create a new Group, either:
-
-- In the top menu, click **Groups** and then **Your Groups**, and click the green button **New group**.
-
- ![new group from groups page](img/new_group_from_groups.png)
+1. Alex creates an account with the username `alex`: `https://gitlab.example.com/alex`
+1. Alex creates a group for their team with the group name `alex-team`.
+ The group and its projects are available at: `https://gitlab.example.com/alex-team`
+1. Alex creates a subgroup of `alex-team` with the subgroup name `marketing`.
+ The subgroup and its projects are available at: `https://gitlab.example.com/alex-team/marketing`
-- Or, in the top menu, expand the `plus` sign and choose **New group**.
+## Create a group
- ![new group from elsewhere](img/new_group_from_other_pages.png)
+To create a group:
-Add the following information:
-
-![new group information](img/create_new_group_info.png)
-
-1. The **Group name** will automatically populate the URL. Optionally, you can change it.
- This is the name that displays in group views.
- The name can contain only:
+1. From the top menu, either:
+ - Select **Groups > Your Groups**, and on the right, select the **New group** button.
+ - To the left of the search box, select the plus sign and then **New group**.
+1. For the **Group name**, use only:
- Alphanumeric characters
+ - Emojis
- Underscores
- - Dashes and dots
- - Spaces
-1. The **Group URL** is the namespace under which your projects will be hosted.
- The URL can contain only:
+ - Dashes, dots, spaces, and parentheses (however, it cannot start with any of these characters)
+
+ For a list of words that cannot be used as group names, see [reserved names](../reserved_names.md).
+
+1. For the **Group URL**, which is used for the [namespace](#namespaces),
+ use only:
- Alphanumeric characters
- Underscores
- Dashes and dots (it cannot start with dashes or end in a dot)
-1. Optionally, you can add a brief description to tell others
- what this group is about.
-1. Optionally, choose an avatar for your group.
1. Choose the [visibility level](../../public_access/public_access.md).
+1. Invite GitLab members or other users to join the group.
-For more details on creating groups, watch the video [GitLab Namespaces (users, groups and subgroups)](https://youtu.be/r0sJgjR2f5A).
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For details about groups, watch [GitLab Namespaces (users, groups and subgroups)](https://youtu.be/r0sJgjR2f5A).
## Add users to a group
-A benefit of putting multiple projects in one group is that you can
-give a user access to all projects in the group with one action.
-
-Add members to a group by navigating to the group's dashboard and clicking **Members**.
-
-![add members to group](img/add_new_members_v13_7.png)
-
-Select the [permission level](../permissions.md#permissions), and add the new member. You can also set the expiring date for that user; this is the date on which they will no longer have access to your group.
-
-Consider a group with two projects:
-
-- On the **Group Members** page, you can now add a new user to the group.
-- Now, because this user is a **Developer** member of the group, they automatically
- get **Developer** access to **all projects** within that group.
+You can give a user access to all projects in a group.
-To increase the access level of an existing user for a specific project,
-add them again as a new member to the project with the desired permission level.
+1. From the top menu, select **Groups > Your Groups**.
+1. Find your group and select it.
+1. From the left sidebar, select **Members**.
+1. Fill in the fields.
+ - The role applies to all projects in the group. [Learn more about permissions](../permissions.md#permissions).
+ - On the **Access expiration date**, the user can no longer access projects in the group.
## Request access to a group
-As a group owner, you can enable or disable the ability for non-members to request access to
-your group. Go to the group settings, and click **Allow users to request access**.
+As a user, you can request to be a member of a group, if an administrator allows it.
-As a user, you can request to be a member of a group, if that setting is enabled. Go to the group for which you'd like to be a member, and click the **Request Access** button on the right
-side of your screen.
+1. From the top menu, select **Groups > Your Groups**.
+1. Find the group and select it.
+1. Under the group name, select **Request Access**.
-![Request access button](img/request_access_button.png)
+As many as ten of the most-recently-active group owners receive an email with your request.
+Any group owner can approve or decline the request.
-Once access is requested:
+If you change your mind before your request is approved, select
+**Withdraw Access Request**.
-- Up to ten group owners are notified of your request via email.
- Email is sent to the most recently active group owners.
-- Any group owner can approve or decline your request on the members page.
+## Prevent users from requesting access to a group
-![Manage access requests](img/access_requests_management.png)
+As a group owner, you can prevent non-members from requesting access to
+your group.
-If you change your mind before your request is approved, just click the
-**Withdraw Access Request** button.
-
-![Withdraw access request button](img/withdraw_access_request_button.png)
-
-## Changing the owner of a group
+1. From the top menu, select **Groups > Your Groups**.
+1. Find the group and select it.
+1. From the left menu, select **Settings > General**.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Clear the **Allow users to request access** checkbox.
+1. Select **Save changes**.
-Ownership of a group means at least one of its members has
-[Owner permission](../permissions.md#group-members-permissions). Groups must have at
-least one owner.
+## Change the owner of a group
-Changing the owner of a group with only one owner is possible. To change the sole owner
-of a group:
+You can change the owner of a group. Each group must always have at least one
+member with [Owner permission](../permissions.md#group-members-permissions).
- As an administrator:
- 1. Go to the group's **{users}** **Members** tab.
+ 1. Go to the group and from the left menu, select **Members**.
1. Give a different member **Owner** permissions.
1. Refresh the page. You can now remove **Owner** permissions from the original owner.
- As the current group's owner:
- 1. Go to the group's **{users}** **Members** tab.
+ 1. Go to the group and from the left menu, select **Members**.
1. Give a different member **Owner** permissions.
1. Have the new owner sign in and remove **Owner** permissions from you.
## Remove a member from the group
-Only users with permissions of [Owner](../permissions.md#group-members-permissions) can manage
-group members.
-
-You can remove a member from the group if the given member has a direct membership in the group. If
-membership is inherited from a parent group, then the member can be removed only from the parent
-group itself.
-
-When removing a member, you can decide whether to unassign the user from all issues and merge
-requests they are currently assigned or leave the assignments as they are.
+Prerequisites:
-- **Unassigning the removed member** from all issues and merge requests might be helpful when a user
- is leaving a private group and you wish to revoke their access to any issues and merge requests
- they are assigned.
-- **Keeping the issues and merge requests assigned** might be helpful for groups that accept public
- contributions where a user doesn't have to be a member to be able to contribute to issues and
- merge requests.
+- You must have [Owner permissions](../permissions.md#group-members-permissions).
+- The member must have direct membership in the group. If
+ membership is inherited from a parent group, then the member can be removed
+ from the parent group only.
To remove a member from a group:
-1. In a group, go to **{users}** **Members**.
-1. Click the **Delete** **{remove}** button next to a group member you want to remove.
- A **Remove member** modal appears.
-1. (Optional) Select the **Also unassign this user from related issues and merge requests** checkbox.
-1. Click **Remove member**.
+1. Go to the group.
+1. From the left menu, select **Members**.
+1. Next to the member you want to remove, select **Delete**.
+1. Optional. On the **Remove member** confirmation box, select the
+ **Also unassign this user from related issues and merge requests** checkbox.
+1. Select **Remove member**.
## Filter and sort members in a group
@@ -217,56 +149,49 @@ To remove a member from a group:
> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/228675) in GitLab 13.7.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289911) in GitLab 13.8.
-The following sections illustrate how you can filter and sort members in a group. To view these options,
-navigate to your desired group, go to **Members**, and include the noted search terms.
-
-### Membership filter
-
-By default, inherited and direct members are displayed. The [membership](subgroups/index.md#membership) filter can be used to display only inherited or only direct members.
-
-#### Only display inherited members
-
-Include `Membership` `=` `Inherited` in the search text box.
+To find members in a group, you can sort, filter, or search.
-![Group members filter inherited](img/group_members_filter_inherited_13_7.png)
+### Filter a group
-#### Only display direct members
+Filter a group to find members. By default, all members in the group and subgroups are displayed.
-Include `Membership` `=` `Direct` in the search text box.
+1. Go to the group and select **Members**.
+1. Above the list of members, in the **Filter members** box, enter filter criteria.
+ - To view members in the group only, select **Membership = Direct**.
+ - To view members of the group and its subgroups, select **Membership = Inherited**.
+ - To view members with two-factor authentication enabled or disabled, select **2FA = Enabled** or **Disabled**.
-![Group members filter direct](img/group_members_filter_direct_13_7.png)
+### Search a group
-### 2FA filter
-
-[Owner](../permissions.md#group-members-permissions) permissions required.
-
-By default, members with 2FA enabled and disabled are displayed. The 2FA filter can be used to display only members with 2FA enabled or only members with 2FA disabled.
-
-#### Only display members with 2FA enabled
-
-Include `2FA` `=` `Enabled` in the search text box.
-
-![Group members filter 2FA enabled](img/group_members_filter_2fa_enabled_13_7.png)
-
-#### Only display members with 2FA disabled
+You can search for members by name, username, or email.
-Include `2FA` `=` `Disabled` in the search text box.
+1. Go to the group and select **Members**.
+1. Above the list of members, in the **Filter members** box, enter search criteria.
+1. To the right of the **Filter members** box, select the magnifying glass (**{search}**).
-![Group members filter 2FA disabled](img/group_members_filter_2fa_disabled_13_7.png)
+### Sort members in a group
-### Search
+You can sort members by **Account**, **Access granted**, **Max role**, or **Last sign-in**.
-You can search for members by name, username, or email.
+1. Go to the group and select **Members**.
+1. Above the list of members, on the top right, from the **Account** list, select
+ the criteria to filter by.
+1. To switch the sort between ascending and descending, to the right of the **Account** list, select the
+ arrow (**{sort-lowest}** or **{sort-highest}**).
-![Group members search](img/group_members_search_13_7.png)
+## Mention a group in an issue or merge request
-### Sort
+When you mention a group in a comment, every member of the group gets a to-do item
+added to their To-do list.
-You can sort members by **Account**, **Access granted**, **Max role**, or **Last sign-in** in ascending or descending order.
+1. Open the MR or issue.
+1. In a comment, type `@` followed by the user, group, or subgroup namespace.
+ For example, `@alex`, `@alex-team`, or `@alex-team/marketing`.
+1. Select **Comment**.
-![Group members sort](img/group_members_sort_13_7.png)
+A to-do item is created for all the group and subgroup members.
-## Changing the default branch protection of a group
+## Change the default branch protection of a group
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7583) in GitLab 12.9.
@@ -289,15 +214,11 @@ In [GitLab Premium or higher](https://about.gitlab.com/pricing/), GitLab adminis
There are two different ways to add a new project to a group:
- Select a group, and then click **New project**. You can then continue [creating your project](../../user/project/working_with_projects.md#create-a-project).
+- While you are creating a project, select a group from the dropdown menu.
- ![New project](img/create_new_project_from_group_v13_6.png)
-
-- While you are creating a project, select a group namespace
- you've already created from the dropdown menu.
+ ![Select group](img/select_group_dropdown_13_10.png)
- ![Select group](img/select_group_dropdown.png)
-
-### Default project-creation level
+### Specify who can add projects to a group
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2534) in [GitLab Premium](https://about.gitlab.com/pricing/) 10.5.
> - Brought to [GitLab Starter](https://about.gitlab.com/pricing/) in 10.7.
@@ -314,188 +235,115 @@ To change this setting for a specific group:
To change this setting globally, see [Default project creation protection](../admin_area/settings/visibility_and_access_controls.md#default-project-creation-protection).
-## View group details
-
-A group's **Details** page includes tabs for:
-
-- Subgroups and projects.
-- Shared projects.
-- Archived projects.
-
-### Group activity analytics overview
+## Group activity analytics **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207164) in GitLab [Starter](https://about.gitlab.com/pricing/) 12.10 as
-a [beta feature](https://about.gitlab.com/handbook/product/#beta)
-
-The group details view also shows the number of the following items created in the last 90 days: **(PREMIUM)**
-
-- Merge requests.
-- Issues.
-- Members.
-
-These Group Activity Analytics can be enabled with the `group_activity_analytics` [feature flag](../../development/feature_flags/development.md#enabling-a-feature-flag-locally-in-development).
-
-![Recent Group Activity](img/group_activity_analytics_v12_10.png)
-
-For details, see the section on how you can [View group activity](#view-group-activity).
+a [beta feature](https://about.gitlab.com/handbook/product/#beta).
-## View group activity
+For a group, you can view how many merge requests, issues, and members were created in the last 90 days.
-A group's **Activity** page displays the most recent actions taken in a group, including:
+These Group Activity Analytics can be enabled with the `group_activity_analytics` [feature flag](../../development/feature_flags/index.md#enabling-a-feature-flag-locally-in-development).
-- **Push events**: Recent pushes to branches.
-- **Merge events**: Recent merges.
-- **Issue events**: Issues opened or closed.
-- **Epic events**: Epics opened or closed.
-- **Comments**: Comments opened or closed.
-- **Team**: Team members who have joined or left the group.
-- **Wiki**: Wikis created, deleted, or updated.
+![Recent Group Activity](img/group_activity_analytics_v13_10.png)
-The entire activity feed is also available in Atom format by clicking the
-**RSS** icon.
+### View group activity
-To view a group's **Activity** page:
+You can view the most recent actions taken in a group.
-1. Go to the group's page.
-1. In the left navigation menu, go to **Group Overview** and select **Activity**.
+1. From the top menu, select **Groups > Your Groups**.
+1. Find the group and select it.
+1. From the left menu, select **Group overview > Activity**.
-## Transfer projects into groups
+To view the activity feed in Atom format, select the
+**RSS** (**{rss}**) icon.
-Learn how to [transfer a project into a group](../project/settings/index.md#transferring-an-existing-project-into-another-namespace).
-
-## Sharing a project with a group
-
-You can [share your projects with a group](../project/members/share_project_with_groups.md)
-and give all group members access to the project at once.
-
-Alternatively, you can [lock the sharing with group feature](#share-with-group-lock).
-
-## Sharing a group with another group
+## Share a group with another group
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18328) in GitLab 12.7.
-Similarly to [sharing a project with a group](#sharing-a-project-with-a-group),
-you can share a group with another group to give direct group members access
+Similar to how you [share a project with a group](../project/members/share_project_with_groups.md),
+you can share a group with another group. Members get direct access
to the shared group. This is not valid for inherited members.
-To share a given group, for example, 'Frontend' with another group, for example,
-'Engineering':
+To share a given group, for example, `Frontend` with another group, for example,
+`Engineering`:
-1. Navigate to your 'Frontend' group page and use the left navigation menu to go
- to your group **Members**.
+1. Go to the `Frontend` group.
+1. From the left menu, select **Members**.
1. Select the **Invite group** tab.
-1. Add 'Engineering' with the maximum access level of your choice.
-1. Click **Invite**.
+1. In the **Select a group to invite** list, select `Engineering`.
+1. For the **Max access level**, select an access level.
+1. Select **Invite**.
-All the members of the 'Engineering' group will have been added to 'Frontend'.
+All the members of the `Engineering` group are added to the `Frontend` group.
## Manage group memberships via LDAP **(PREMIUM SELF)**
-Group syncing allows LDAP groups to be mapped to GitLab groups. This provides more control over per-group user management. To configure group syncing edit the `group_base` **DN** (`'OU=Global Groups,OU=GitLab INT,DC=GitLab,DC=org'`). This **OU** contains all groups that will be associated with GitLab groups.
+Group syncing allows LDAP groups to be mapped to GitLab groups. This provides more control over per-group user management. To configure group syncing, edit the `group_base` **DN** (`'OU=Global Groups,OU=GitLab INT,DC=GitLab,DC=org'`). This **OU** contains all groups that will be associated with GitLab groups.
-Group links can be created using either a CN or a filter. These group links are created on the **Group Settings -> LDAP Synchronization** page. After configuring the link, it may take over an hour for the users to sync with the GitLab group.
+Group links can be created by using either a CN or a filter. To create these group links, go to the group's **Settings > LDAP Synchronization** page. After configuring the link, it may take more than an hour for the users to sync with the GitLab group.
For more information on the administration of LDAP and group sync, refer to the [main LDAP documentation](../../administration/auth/ldap/index.md#group-sync).
NOTE:
-If an LDAP user is a group member when LDAP Synchronization is added, and they are not part of the LDAP group, they will be removed from the group.
+When you add LDAP synchronization, if an LDAP user is a group member and they are not part of the LDAP group, they are removed from the group.
-### Creating group links via CN **(PREMIUM SELF)**
+### Create group links via CN **(PREMIUM SELF)**
To create group links via CN:
<!-- vale gitlab.Spelling = NO -->
1. Select the **LDAP Server** for the link.
-1. Select `LDAP Group cn` as the **Sync method**.
-1. In the **LDAP Group cn** text input box, begin typing the CN of the group. There will be a dropdown menu with matching CNs within the configured `group_base`. Select your CN from this list.
+1. As the **Sync method**, select `LDAP Group cn`.
+1. In the **LDAP Group cn** field, begin typing the CN of the group. There is a dropdown menu with matching CNs in the configured `group_base`. Select your CN from this list.
1. In the **LDAP Access** section, select the [permission level](../permissions.md) for users synced in this group.
-1. Click the `Add Synchronization` button to save this group link.
-
-![Creating group links via CN](img/ldap_sync_cn_v13_1.png)
+1. Select the **Add Synchronization** button.
<!-- vale gitlab.Spelling = YES -->
-### Creating group links via filter **(PREMIUM SELF)**
+### Create group links via filter **(PREMIUM SELF)**
To create group links via filter:
1. Select the **LDAP Server** for the link.
-1. Select `LDAP user filter` as the **Sync method**.
+1. As the **Sync method**, select `LDAP user filter`.
1. Input your filter in the **LDAP User filter** box. Follow the [documentation on user filters](../../administration/auth/ldap/index.md#set-up-ldap-user-filter).
1. In the **LDAP Access** section, select the [permission level](../permissions.md) for users synced in this group.
-1. Click the `Add Synchronization` button to save this group link.
+1. Select the **Add Synchronization** button.
-![Creating group links via filter](img/ldap_sync_filter_v13_1.png)
+### Override user permissions **(PREMIUM SELF)**
-### Overriding user permissions **(PREMIUM SELF)**
-
-In GitLab [8.15](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/822) and later, LDAP user permissions can now be manually overridden by an admin user. To override a user's permissions:
+LDAP user permissions can be manually overridden by an administrator. To override a user's permissions:
1. Go to your group's **Members** page.
-1. Select the pencil icon in the row for the user you are editing.
-1. Select the brown `Edit permissions` button in the modal.
-
-![Setting manual permissions](img/manual_permissions_v13_7.png)
-
-Now you will be able to edit the user's permissions from the **Members** page.
-
-## Epics **(ULTIMATE)**
+1. In the row for the user you are editing, select the pencil (**{pencil}**) icon.
+1. Select the brown **Edit permissions** button in the modal.
-> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.2.
-
-Epics let you manage your portfolio of projects more efficiently and with less
-effort by tracking groups of issues that share a theme, across projects and
-milestones.
-
-[Learn more about Epics.](epics/index.md)
+Now you can edit the user's permissions from the **Members** page.
## Group wikis **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13195) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.5.
-Group wikis work the same way as [project wikis](../project/wiki/index.md), please refer to those docs for details on usage.
+Group wikis work the same way as [project wikis](../project/wiki/index.md).
Group wikis can be edited by members with [Developer permissions](../../user/permissions.md#group-members-permissions)
and above.
-Group wiki repositories can be moved through the [Group repository storage moves API](../../api/group_repository_storage_moves.md).
-
-### Group wikis limitations
+You can move group wiki repositories by using the [Group repository storage moves API](../../api/group_repository_storage_moves.md).
There are a few limitations compared to project wikis:
- Git LFS is not supported.
-- Group wikis are not included in global search and Geo replication.
+- Group wikis are not included in global search.
- Changes to group wikis don't show up in the group's activity feed.
-For updates, you can follow:
-
-- [The epic tracking feature parity with project wikis](https://gitlab.com/groups/gitlab-org/-/epics/2782).
-
-## Group Security Dashboard **(ULTIMATE)**
-
-Get an overview of the vulnerabilities of all the projects in a group and its subgroups.
-
-[Learn more about the Group Security Dashboard.](../application_security/security_dashboard/index.md)
-
-## Insights **(ULTIMATE)**
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/725) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
+For updates, follow [the epic that tracks feature parity with project wikis](https://gitlab.com/groups/gitlab-org/-/epics/2782).
-Configure the Insights that matter for your groups or projects, allowing users
-to explore data such as:
+## Transfer a group
-- Triage hygiene
-- Issues created/closed per a given period
-- Average time for merge requests to be merged
-- Much more
-
-[Learn more about Insights](insights/index.md).
-
-## Transferring groups
-
-From GitLab 10.5, you can transfer groups in the following ways:
+You can transfer groups in the following ways:
- Transfer a subgroup to a new parent group.
- Convert a top-level group into a subgroup by transferring it to the desired group.
@@ -506,214 +354,173 @@ When transferring groups, note:
- Changing a group's parent can have unintended side effects. See [Redirects when changing repository paths](../project/repository/index.md#redirects-when-changing-repository-paths).
- You can only transfer groups to groups you manage.
- You must update your local repositories to point to the new location.
-- If the immediate parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will change to match the new parent group's visibility.
+- If the immediate parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects change to match the new parent group's visibility.
- Only explicit group membership is transferred, not inherited membership. If the group's owners have only inherited membership, this leaves the group without an owner. In this case, the user transferring the group becomes the group's owner.
-- Transfers will fail if [packages](../packages/index.md) exist in any of the projects within the group, or in any of its subgroups.
-
-## Group settings
-
-After creating a group, you can manage its settings by navigating to
-the group's dashboard, and clicking **Settings**.
+- Transfers fail if [packages](../packages/index.md) exist in any of the projects in the group, or in any of its subgroups.
-![group settings](img/group_settings.png)
-
-### General settings
-
-In addition to editing any settings you previously
-set when [creating the group](#create-a-new-group), you can also
-access further configurations for your group.
-
-#### Changing a group's path
+## Change a group's path
Changing a group's path (group URL) can have unintended side effects. Read
-[how redirects will behave](../project/repository/index.md#redirects-when-changing-repository-paths)
-before proceeding.
+[how redirects behave](../project/repository/index.md#redirects-when-changing-repository-paths)
+before you proceed.
-If you are vacating the path so it can be claimed by another group or user,
-you may need to rename the group too, since both names and paths must
+If you are changing the path so it can be claimed by another group or user,
+you may need to rename the group too. Both names and paths must
be unique.
+To retain ownership of the original namespace and protect the URL redirects,
+create a new group and transfer projects to it instead.
+
To change your group path (group URL):
-1. Navigate to your group's **Settings > General** page.
+1. Go to your group's **Settings > General** page.
1. Expand the **Path, transfer, remove** section.
-1. Enter a new name under **Change group URL**.
-1. Click **Change group URL**.
+1. Under **Change group URL**, enter a new name.
+1. Select **Change group URL**.
WARNING:
-It is currently not possible to rename a namespace if it contains a
+It is not possible to rename a namespace if it contains a
project with [Container Registry](../packages/container_registry/index.md) tags,
because the project cannot be moved.
-NOTE:
-If you want to retain ownership over the original namespace and
-protect the URL redirects, then instead of changing a group's path or renaming a
-username, you can create a new group and transfer projects to it.
-
-### Group repository settings
-
-You can change settings that are specific to repositories in your group.
-
-#### Custom initial branch name **(FREE)**
+## Use a custom name for the initial branch
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43290) in GitLab 13.6.
By default, when you create a new project in GitLab, the initial branch is called `master`.
For groups, a group owner can customize the initial branch name to something
-else. This way, every new project created under that group from then on will start from the custom branch name rather than `master`. To do so:
+else. This way, every new project created under that group from then on starts from the custom branch name rather than `master`.
+
+To use a custom name for the initial branch:
-1. Go to the **Group page > Settings > Repository** and expand **Default initial
- branch name**.
+1. Go to the group's **Settings > Repository** page.
+1. Expand the **Default initial branch name** section.
1. Change the default initial branch to a custom name of your choice.
-1. **Save Changes**.
+1. Select **Save changes**.
-### Remove a group
+## Remove a group
To remove a group and its contents:
-1. Navigate to your group's **Settings > General** page.
+1. Go to your group's **Settings > General** page.
1. Expand the **Path, transfer, remove** section.
-1. In the Remove group section, click the **Remove group** button.
-1. Confirm the action when asked to.
+1. In the Remove group section, select **Remove group**.
+1. Confirm the action.
-This action either:
+This action removes the group. It also adds a background job to delete all projects in the group.
-- Removes the group, and also queues a background job to delete all projects in that group.
-- Since [GitLab 12.8](https://gitlab.com/gitlab-org/gitlab/-/issues/33257), on [Premium](https://about.gitlab.com/pricing/premium/) or higher tiers, this action adds a background job to mark a group for deletion. By default, the job schedules the deletion 7 days in the future. You can modify this waiting period through the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
+Specifically:
-Since [GitLab 13.6](https://gitlab.com/gitlab-org/gitlab/-/issues/39504), if the user who sets up the deletion leaves or is otherwise removed from the group before the
-actual deletion happens, the job is cancelled, and the group is no longer scheduled for deletion.
+- In [GitLab 12.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/33257), on [Premium](https://about.gitlab.com/pricing/premium/) or higher tiers, this action adds a background job to mark a group for deletion. By default, the job schedules the deletion 7 days in the future. You can modify this waiting period through the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
+- In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/39504), if the user who sets up the deletion is removed from the group before the
+deletion happens, the job is cancelled, and the group is no longer scheduled for deletion.
-### Restore a group **(PREMIUM)**
+## Restore a group **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33257) in GitLab 12.8.
To restore a group that is marked for deletion:
-1. Navigate to your group's **Settings > General** page.
+1. Go to your group's **Settings > General** page.
1. Expand the **Path, transfer, remove** section.
-1. In the Restore group section, click the **Restore group** button.
+1. In the Restore group section, select **Restore group**.
-#### Enforce 2FA to group members
-
-Add a security layer to your group by
-[enforcing two-factor authentication (2FA)](../../security/two_factor_authentication.md#enforcing-2fa-for-all-users-in-a-group)
-for all group members.
-
-#### Share with group lock
+## Prevent a project from being shared with groups
Prevent projects in a group from [sharing
a project with another group](../project/members/share_project_with_groups.md) to enable tighter control over project access.
-For example, let's say you have two distinct teams (Group A and Group B) working together in a project, and to inherit the group membership, you share the project between the
-two groups A and B. **Share with group lock** prevents any project within
-the group from being shared with another group,
-guaranteeing that only the right group members have access to those projects.
+To prevent a project from being shared with other groups:
-To enable this feature, navigate to the group settings page. Select
-**Share with group lock** and **Save the group**.
-
-![Checkbox for share with group lock](img/share_with_group_lock.png)
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Select **Prevent sharing a project within <group_name> with other groups**.
+1. Select **Save changes**.
-#### Member Lock **(PREMIUM)**
+## Prevent members from being added to a group **(PREMIUM)**
-Member lock lets a group owner prevent any new project membership to all of the
-projects within a group, allowing tighter control over project membership.
+As a group owner, you can prevent any new project membership for all
+projects in a group, allowing tighter control over project membership.
For example, if you want to lock the group for an [Audit Event](../../administration/audit_events.md),
-enable Member lock to guarantee that project membership cannot be modified during that audit.
-
-To enable this feature:
+you can guarantee that project membership cannot be modified during the audit.
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and select **Member lock**.
-1. Click **Save changes**.
+To prevent members from being added to a group:
-![Checkbox for membership lock](img/member_lock.png)
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Under **Member lock**, select **Prevent adding new members to project membership within this group**.
+1. Select **Save changes**.
-This will disable the option for all users who previously had permissions to
-operate project memberships, so no new users can be added. Furthermore, any
-request to add a new user to a project through API will not be possible.
+All users who previously had permissions can no longer add members to a group.
+API requests to add a new user to a project are not possible.
-#### IP access restriction **(PREMIUM)**
+## Restrict group access by IP address **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1985) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/215410) to [GitLab Premium](https://about.gitlab.com/pricing/) in 13.1.
NOTE:
-IP Access Restrictions are currently not functioning as expected on GitLab.com. Some users
-may experience blocked Git operations or have difficulties accessing projects. Please
-review the [following bug report](https://gitlab.com/gitlab-org/gitlab/-/issues/271673) for
-more information.
+IP access restrictions are not functioning as expected on GitLab.com. If enabled,
+users cannot perform Git operations through SSH, or access projects in the UI.
+For more information, [see this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/271673).
-To make sure only people from within your organization can access particular
-resources, you have the option to restrict access to groups and their
-underlying subgroups, projects, issues, and so on, by IP address. This can help ensure that
-particular content doesn't leave the premises, while not blocking off access to
-the entire instance. IP access restrictions can only be configured at the group level.
+To ensure only people from your organization can access particular
+resources, you can restrict access to groups by IP address. This setting applies to all subgroups,
+projects, issues, and so on.
-Add one or more allowed IP subnets using CIDR notation to the group settings and anyone
-coming from a different IP address won't be able to access the restricted
-content.
+IP access restrictions can be configured at the group level only.
-Restriction currently applies to:
+This restriction applies to:
-- UI.
-- [From GitLab 12.3](https://gitlab.com/gitlab-org/gitlab/-/issues/12874), API access.
-- [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/32113), Git actions via SSH.
+- The GitLab UI.
+- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/12874), the API.
+- [In GitLab 12.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/32113), Git actions via SSH.
-To avoid accidental lock-out, admins and group owners are able to access
-the group regardless of the IP restriction.
+Administrators and group owners are able to access the group regardless of the IP restriction.
-To enable this feature:
+To restrict group access by IP address:
-1. Navigate to the group’s **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and enter IP address ranges into **Allow access to the following IP addresses** field.
-1. Click **Save changes**.
+1. Go to the group’s **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. In the **Allow access to the following IP addresses** field, enter IP address ranges in CIDR notation.
+1. Select **Save changes**.
![Domain restriction by IP address](img/restrict-by-ip.gif)
-#### Allowed domain restriction **(PREMIUM)**
+## Restrict group access by domain **(PREMIUM)**
>- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7297) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.2.
->- Support for specifying multiple email domains [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) in GitLab 13.1
+>- Support for specifying multiple email domains [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) added in GitLab 13.1.
-You can restrict access to groups by allowing only users with email addresses in particular domains to be added to the group.
+You can prevent users with email addresses in specific domains from being added to a group.
-Add email domains you want to allow and users with emails from different domains won't be allowed to be added to this group.
-
-Some domains cannot be restricted. These are the most popular public email domains, such as:
+To restrict group access by domain:
-- `gmail.com`
-- `yahoo.com`
-- `hotmail.com`
-- `aol.com`
-- `msn.com`
-- `hotmail.co.uk`
-- `hotmail.fr`
-- `live.com`
-- `outlook.com`
-- `icloud.com`
-
-To enable this feature:
-
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and enter the domain names into **Restrict membership by email** field.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. In the **Restrict membership by email** field, enter the domain names.
+1. Select **Save changes**.
![Domain restriction by email](img/restrict-by-email.gif)
-This will enable the domain-checking for all new users added to the group from this moment on.
+Any time you attempt to add a new user, they are compared against this list.
+
+Some domains cannot be restricted. These are the most popular public email domains, such as:
+
+- `gmail.com`, `yahoo.com`, `aol.com`, `icloud.com`
+- `hotmail.com`, `hotmail.co.uk`, `hotmail.fr`
+- `msn.com`, `live.com`, `outlook.com`
NOTE:
-Domain restrictions only apply to groups and do not prevent users from being added as members of projects owned by the restricted group.
+Domain restrictions apply to groups only. They do not prevent users from being added as members of projects owned by the restricted group.
-#### Group file templates **(PREMIUM)**
+## Group file templates **(PREMIUM)**
-Group file templates allow you to share a set of templates for common file
+Use group file templates to share a set of templates for common file
types with every project in a group. It is analogous to the
-[instance template repository](../admin_area/settings/instance_template_repository.md)
-feature, and the selected project should follow the same naming conventions as
+[instance template repository](../admin_area/settings/instance_template_repository.md).
+The selected project should follow the same naming conventions as
are documented on that page.
You can only choose projects in the group as the template source.
@@ -721,38 +528,38 @@ This includes projects shared with the group, but it **excludes** projects in
subgroups or parent groups of the group being configured.
You can configure this feature for both subgroups and immediate parent groups. A project
-in a subgroup will have access to the templates for that subgroup, as well as
+in a subgroup has access to the templates for that subgroup, as well as
any immediate parent groups.
-![Group file template dropdown](img/group_file_template_dropdown.png)
+To learn how to create templates for issues and merge requests, see
+[Description templates](../project/description_templates.md).
-To enable this feature, navigate to the group settings page, expand the
-**Templates** section, choose a project to act as the template repository, and
-**Save group**.
+Define project templates at a group level by setting a group as the template source.
+[Learn more about group-level project templates](custom_project_templates.md). **(PREMIUM)**
-![Group file template settings](img/group_file_template_settings.png)
+### Enable group file template **(PREMIUM)**
-To learn how to create templates for issues and merge requests, visit
-[Description templates](../project/description_templates.md).
+To enable group file templates:
-#### Group-level project templates **(PREMIUM)**
-
-Define project templates at a group level by setting a group as the template source.
-[Learn more about group-level project templates](custom_project_templates.md).
+1. Go to the group's **Settings > General** page.
+1. Expand the **Templates** section.
+1. Choose a project to act as the template repository.
+1. Select **Save changes**.
-#### Disabling email notifications
+## Disable email notifications
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23585) in GitLab 12.2.
You can disable all email notifications related to the group, which includes its subgroups and projects.
-To enable this feature:
+To disable email notifications:
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and select **Disable email notifications**.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Select **Disable email notifications**.
+1. Select **Save changes**.
-#### Disabling group mentions
+## Disable group mentions
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21301) in GitLab 12.6.
@@ -763,120 +570,95 @@ Groups with disabled mentions are visualized accordingly in the autocompletion d
This is particularly helpful for groups with a large number of users.
-To enable this feature:
+To disable group mentions:
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and select **Disable group mentions**.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Select **Disable group mentions**.
+1. Select **Save changes**.
-#### Enabling delayed Project removal **(PREMIUM)**
+## Enable delayed project removal **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) in GitLab 13.2.
-By default, projects within a group are deleted immediately.
+By default, projects in a group are deleted immediately.
Optionally, on [Premium](https://about.gitlab.com/pricing/) or higher tiers,
-you can configure the projects within a group to be deleted after a delayed interval.
+you can configure the projects in a group to be deleted after a delayed interval.
-During this interval period, the projects will be in a read-only state and can be restored, if required.
-The interval period defaults to 7 days, and can be modified by an admin in the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
+During this interval period, the projects are in a read-only state and can be restored, if required.
+The interval period defaults to 7 days, and can be modified by an administrator in the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
To enable delayed deletion of projects:
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and check **Enable delayed project removal**.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Check **Enable delayed project removal**.
+1. Select **Save changes**.
NOTE:
The group setting for delayed deletion is not inherited by subgroups and has to be individually defined for each group.
-#### Prevent project forking outside group **(PREMIUM)**
+## Prevent project forking outside group **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216987) in GitLab 13.3.
-By default, projects within a group can be forked.
+By default, projects in a group can be forked.
Optionally, on [Premium](https://about.gitlab.com/pricing/) or higher tiers,
-you can prevent the projects within a group from being forked outside of the current top-level group.
+you can prevent the projects in a group from being forked outside of the current top-level group.
Previously this setting was available only for groups enforcing group managed account. This setting will be
-removed from SAML setting page and migrated to group setting, but in the interim period of changes both of those settings will be taken into consideration, if even one is set to `true` then it will be assumed group does not allow forking projects outside.
+removed from SAML setting page and migrated to group settings. In the interim period, both of these settings are taken into consideration.
+If even one is set to `true` then it will be assumed the group does not allow forking projects outside.
To enable prevent project forking:
-1. Navigate to the top-level group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and check **Prevent project forking outside current group**.
-1. Click **Save changes**.
-
-### Advanced settings
-
-- **Projects**: View all projects within that group, add members to each project,
- access each project's settings, and remove any project, all from the same screen.
-- **Webhooks**: Configure [webhooks](../project/integrations/webhooks.md) for your group.
-- **Kubernetes cluster integration**: Connect your GitLab group with [Kubernetes clusters](clusters/index.md).
-- **Audit Events**: View [Audit Events](../../administration/audit_events.md)
- for the group. **(PREMIUM SELF)**
-- **Pipelines quota**: Keep track of the [pipeline quota](../admin_area/settings/continuous_integration.md) for the group.
-- **Integrations**: Configure [integrations](../admin_area/settings/project_integration_management.md) for your group.
+1. Go to the top-level group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Check **Prevent project forking outside current group**.
+1. Select **Save changes**.
-#### Group push rules **(PREMIUM)**
+## Group push rules **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34370) in [GitLab Starter](https://about.gitlab.com/pricing/) 12.8.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/224129) in GitLab 13.4.
Group push rules allow group maintainers to set
-[push rules](../../push_rules/push_rules.md) for newly created projects within the specific group.
+[push rules](../../push_rules/push_rules.md) for newly created projects in the specific group.
-To configure push rules for a group, navigate to **{push-rules}** on the group's
-sidebar.
+To configure push rules for a group:
-When set, new subgroups have push rules set for them based on either:
+1. Go to the groups's **Push Rules** page.
+1. Select the settings you want.
+1. Select **Save Push Rules**.
+
+The group's new subgroups have push rules set for them based on either:
- The closest parent group with push rules defined.
- Push rules set at the instance level, if no parent groups have push rules defined.
-### Maximum artifacts size **(FREE SELF)**
-
-For information about setting a maximum artifact size for a group, see
-[Maximum artifacts size](../admin_area/settings/continuous_integration.md#maximum-artifacts-size).
-
-## User contribution analysis **(PREMIUM)**
-
-With [GitLab Contribution Analytics](contribution_analytics/index.md),
-you have an overview of the contributions (pushes, merge requests,
-and issues) performed by your group members.
-
-## Issue analytics **(PREMIUM)**
-
-With [GitLab Issue Analytics](issues_analytics/index.md), you can see a bar chart of the number of issues created each month in your groups.
-
-## Repositories analytics **(PREMIUM)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/263478) in GitLab 13.6.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/276003) in GitLab 13.7.
-
-With [GitLab Repositories Analytics](repositories_analytics/index.md), you can view overall activity of all projects with code coverage.
-
-## Dependency Proxy
-
-Use GitLab as a [dependency proxy](../packages/dependency_proxy/index.md) for upstream Docker images.
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
-
-## DORA4 analytics overview **(ULTIMATE ONLY)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291747) in GitLab [Ultimate](https://about.gitlab.com/pricing/) 13.9 as a [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta).
-
-Group details include the following analytics:
-
-- Deployment Frequency
-
-For more information, see [DORA4 Project Analytics API](../../api/dora4_group_analytics.md).
+## Related topics
+
+- [Maximum artifacts size](../admin_area/settings/continuous_integration.md#maximum-artifacts-size). **(FREE SELF)**
+- [Repositories analytics](repositories_analytics/index.md): View overall activity of all projects with code coverage. **(PREMIUM)**
+- [Contribution analytics](contribution_analytics/index.md): View the contributions (pushes, merge requests,
+ and issues) of group members. **(PREMIUM)**
+- [Issue analytics](issues_analytics/index.md): View a bar chart of your group's number of issues per month. **(PREMIUM)**
+- Use GitLab as a [dependency proxy](../packages/dependency_proxy/index.md) for upstream Docker images.
+- [DORA4 Project Analytics API](../../api/dora4_group_analytics.md): View deployment frequency analytics.
+ [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291747) in GitLab Ultimate 13.9 as a
+ [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta). **(ULTIMATE SELF)**
+- [Epics](epics/index.md): Track groups of issues that share a theme. **(ULTIMATE)**
+- [Security Dashboard](../application_security/security_dashboard/index.md): View the vulnerabilities of all
+ the projects in a group and its subgroups. **(ULTIMATE)**
+- [Insights](insights/index.md): Configure insights like triage hygiene, issues created/closed per a given period, and
+ average time for merge requests to be merged. **(ULTIMATE)**
+- [Webhooks](../project/integrations/webhooks.md).
+- [Kubernetes cluster integration](clusters/index.md).
+- [Audit Events](../../administration/audit_events.md#group-events). **(PREMIUM)**
+- [Pipelines quota](../admin_area/settings/continuous_integration.md): Keep track of the pipeline quota for the group.
+- [Integrations](../admin_area/settings/project_integration_management.md).
+- [Transfer a project into a group](../project/settings/index.md#transferring-an-existing-project-into-another-namespace).
+- [Share a project with a group](../project/members/share_project_with_groups.md): Give all group members access to the project at once.
+- [Lock the sharing with group feature](#prevent-a-project-from-being-shared-with-groups).
+- [Enforce two-factor authentication (2FA)](../../security/two_factor_authentication.md#enforcing-2fa-for-all-users-in-a-group): Enforce 2FA
+ for all group members.
diff --git a/doc/user/group/repositories_analytics/index.md b/doc/user/group/repositories_analytics/index.md
index 1cb7c05bb5f..42522723047 100644
--- a/doc/user/group/repositories_analytics/index.md
+++ b/doc/user/group/repositories_analytics/index.md
@@ -40,6 +40,9 @@ To see the latest code coverage for each project in your group:
1. Go to **Analytics > Repositories** in the group (not from a project).
1. In the **Latest test coverage results** section, use the **Select projects** dropdown to choose the projects you want to check.
+You can download code coverage data for specific projects using
+[code coverage history](../../../ci/pipelines/settings.md#code-coverage-history).
+
## Download historic test coverage data
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215104) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
diff --git a/doc/user/group/roadmap/index.md b/doc/user/group/roadmap/index.md
index e2c01987e36..9b3ae75b39c 100644
--- a/doc/user/group/roadmap/index.md
+++ b/doc/user/group/roadmap/index.md
@@ -41,7 +41,7 @@ toggle the list of the milestone bars.
> - Filtering roadmaps by milestone is enabled on GitLab.com.
> - Filtering roadmaps by milestone is recommended for production use.
> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-filtering-roadmaps-by-milestone). **(PREMIUM SELF)**
-> - Filtering by epic confidentiality [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218624) in GitLab 13.8.
+> - Filtering by epic confidentiality [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218624) in GitLab 13.9.
WARNING:
Filtering roadmaps by milestone might not be available to you. Check the **version history** note above for details.
diff --git a/doc/user/group/saml_sso/group_managed_accounts.md b/doc/user/group/saml_sso/group_managed_accounts.md
index dd0888a610f..9f2cafd456b 100644
--- a/doc/user/group/saml_sso/group_managed_accounts.md
+++ b/doc/user/group/saml_sso/group_managed_accounts.md
@@ -37,17 +37,7 @@ Since use of the group-managed account requires the use of SSO, users of group-m
- The user is unable to access the group (their credentials no longer work on the identity provider when prompted to use SSO).
- Contributions in the group (for example, issues and merge requests) remains intact.
-## Assertions
-
-When using group-managed accounts, the following user details need to be passed to GitLab as SAML
-assertions to be able to create a user.
-
-| Field | Supported keys |
-|-----------------|----------------|
-| Email (required)| `email`, `mail` |
-| Full Name | `name` |
-| First Name | `first_name`, `firstname`, `firstName` |
-| Last Name | `last_name`, `lastname`, `lastName` |
+Please refer to our [SAML SSO for Groups page](../index.md) for information on how to configure SAML.
## Feature flag **(PREMIUM SELF)**
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index d1c490b0769..004efe7b244 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -25,7 +25,8 @@ SAML SSO is only configurable at the top-level group.
1. Navigate to the group and select **Settings > SAML SSO**.
1. Configure your SAML server using the **Assertion consumer service URL**, **Identifier**, and **GitLab single sign-on URL**. Alternatively GitLab provides [metadata XML configuration](#metadata-configuration). See [specific identity provider documentation](#providers) for more details.
1. Configure the SAML response to include a NameID that uniquely identifies each user.
-1. Configure [required assertions](group_managed_accounts.md#assertions) if using [Group Managed Accounts](group_managed_accounts.md).
+1. Configure [required assertions](#assertions) at minimum containing
+ the user's email address.
1. While the default is enabled for most SAML providers, please ensure the app is set to have [Service Provider](#glossary) initiated calls in order to link existing GitLab accounts.
1. Once the identity provider is set up, move on to [configuring GitLab](#configuring-gitlab).
@@ -53,6 +54,19 @@ Once users have signed into GitLab using the SSO SAML setup, changing the `NameI
We recommend setting the NameID format to `Persistent` unless using a field (such as email) that requires a different format.
+### Assertions
+
+For users to be created with the right information with the improved [user access and management](#user-access-and-management),
+the following user details need to be passed to GitLab as SAML assertions.
+
+| Field | Supported keys |
+|-----------------|----------------|
+| Email (required)| `email`, `mail` |
+| Username | `username`, `nickname` |
+| Full Name | `name` |
+| First Name | `first_name`, `firstname`, `firstName` |
+| Last Name | `last_name`, `lastname`, `lastName` |
+
### Metadata configuration
GitLab provides metadata XML that can be used to configure your Identity Provider.
@@ -87,9 +101,8 @@ Please note that the certificate [fingerprint algorithm](#additional-providers-a
With this option enabled, users must go through your group's GitLab single sign-on URL. They may also be added via SCIM, if configured. Users can't be added manually, and may only access project/group resources via the UI by signing in through the SSO URL.
However, users are not prompted to sign in through SSO on each visit. GitLab checks whether a user
-has authenticated through SSO. If it's been more than 7 days since the last sign-in, GitLab
+has authenticated through SSO. If it's been more than 1 day since the last sign-in, GitLab
prompts the user to sign in again through SSO.
-You can see more information about how long a session is valid in our [user profile documentation](../../profile/#why-do-i-keep-getting-signed-out).
We intend to add a similar SSO requirement for [Git and API activity](https://gitlab.com/gitlab-org/gitlab/-/issues/9152).
@@ -98,7 +111,7 @@ When SSO enforcement is enabled for a group, users can't share a project in the
## Providers
NOTE:
-GitLab is unable to provide full support for integrating identify providers that are not listed here.
+GitLab is unable to provide full support for integrating identity providers that are not listed here.
| Provider | Documentation |
|----------|---------------|
@@ -106,7 +119,7 @@ GitLab is unable to provide full support for integrating identify providers that
| Okta | [Setting up a SAML application in Okta](https://developer.okta.com/docs/guides/build-sso-integration/saml2/overview/) |
| OneLogin | [Use the OneLogin SAML Test Connector](https://onelogin.service-now.com/support?id=kb_article&sys_id=93f95543db109700d5505eea4b96198f) |
-When [configuring your identify provider](#configuring-your-identity-provider), please consider the notes below for specific providers to help avoid common issues and as a guide for terminology used.
+When [configuring your identity provider](#configuring-your-identity-provider), please consider the notes below for specific providers to help avoid common issues and as a guide for terminology used.
### Azure setup notes
@@ -148,8 +161,11 @@ For NameID, the following settings are recommended; for SCIM, the following sett
### OneLogin setup notes
-The GitLab app listed in the OneLogin app catalog is for self-managed GitLab instances.
-For GitLab.com, use a generic SAML Test Connector such as the SAML Test Connector (Advanced).
+OneLogin supports their own [GitLab (SaaS)](https://onelogin.service-now.com/support?id=kb_article&sys_id=92e4160adbf16cd0ca1c400e0b961923&kb_category=50984e84db738300d5505eea4b961913)
+application.
+
+If you decide to use the OneLogin generic [SAML Test Connector (Advanced)](https://onelogin.service-now.com/support?id=kb_article&sys_id=b2c19353dbde7b8024c780c74b9619fb&kb_category=93e869b0db185340d5505eea4b961934),
+we recommend the following settings:
| GitLab Setting | OneLogin Field |
|--------------|----------------|
@@ -170,7 +186,7 @@ For more information, see our [discussion on providers](#providers).
Your identity provider may have relevant documentation. It may be generic SAML documentation, or specifically targeted for GitLab. Examples:
- [ADFS (Active Directory Federation Services)](https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/create-a-relying-party-trust)
-- [Auth0](https://auth0.com/docs/protocols/saml-configuration-options/configure-auth0-as-saml-identity-provider)
+- [Auth0](https://auth0.com/docs/protocols/saml-protocol/configure-auth0-as-saml-identity-provider)
- [Google Workspace](https://support.google.com/a/answer/6087519?hl=en)
- [JumpCloud](https://support.jumpcloud.com/support/s/article/single-sign-on-sso-with-gitlab-2019-08-21-10-36-47)
- [PingOne by Ping Identity](https://docs.pingidentity.com/bundle/pingone/page/xsh1564020480660-1.html)
@@ -348,6 +364,11 @@ the user gets the highest access level from the groups. For example, if one grou
is linked as `Guest` and another `Maintainer`, a user in both groups gets `Maintainer`
access.
+Users who are not members of any mapped SAML groups are removed from the GitLab group.
+
+You can prevent accidental member removal. For example, if you have a SAML group link for `Owner` level access
+in a top-level group, you should also set up a group link for all other members.
+
## Glossary
| Term | Description |
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index 3a34a4b0599..35374812b37 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -161,6 +161,11 @@ The Okta GitLab application currently only supports SCIM. Continue
using the separate Okta [SAML SSO](index.md) configuration along with the new SCIM
application described above.
+### OneLogin
+
+OneLogin provides a "GitLab (SaaS)" app in their catalog, which includes a SCIM integration.
+As the app is developed by OneLogin, please reach out to OneLogin if you encounter issues.
+
## User access and linking setup
The following diagram is a general outline on what happens when you add users to your SCIM app:
@@ -197,6 +202,10 @@ Upon the next sync, the user is deprovisioned, which means that the user is remo
NOTE:
Deprovisioning does not delete the user account.
+During the synchronization process, all of your users get GitLab accounts, welcoming them
+to their respective groups, with an invitation email. When implementing SCIM provisioning,
+you may want to warn your security-conscious employees about this email.
+
```mermaid
graph TD
A[Remove User from SCIM app] -->|IdP sends request to GitLab| B(GitLab: Is the user part of the group?)
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index 59812fc2b2f..16430b49549 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, howto, concepts
---
@@ -147,7 +147,7 @@ From the image above, we can deduce the following things:
- Administrator is the Owner and member of **all** subgroups and for that reason,
as with User 3, the **Source** column indicates **Direct member**.
-Members can be [filtered by inherited or direct membership](../index.md#membership-filter).
+Members can be [filtered by inherited or direct membership](../index.md#filter-a-group).
### Overriding the ancestor group membership
diff --git a/doc/user/group/value_stream_analytics/img/delete_value_stream_v13.4.png b/doc/user/group/value_stream_analytics/img/delete_value_stream_v13_4.png
index c97fcb76343..c97fcb76343 100644
--- a/doc/user/group/value_stream_analytics/img/delete_value_stream_v13.4.png
+++ b/doc/user/group/value_stream_analytics/img/delete_value_stream_v13_4.png
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/extended_value_stream_form_v13_10.png b/doc/user/group/value_stream_analytics/img/extended_value_stream_form_v13_10.png
new file mode 100644
index 00000000000..26508787177
--- /dev/null
+++ b/doc/user/group/value_stream_analytics/img/extended_value_stream_form_v13_10.png
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.png b/doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.png
new file mode 100644
index 00000000000..77f4a26b880
--- /dev/null
+++ b/doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.png
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.png b/doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.png
new file mode 100644
index 00000000000..1adb114b025
--- /dev/null
+++ b/doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.png
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13.3.png b/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_3.png
index 506765f63cb..506765f63cb 100644
--- a/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13.3.png
+++ b/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_3.png
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 4fcef07a04e..52cf51d85a4 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -59,7 +59,7 @@ To filter results:
1. Select a parameter to filter by.
1. Select a value from the autocompleted results, or type to refine the results.
-![Value stream analytics filter bar](img/vsa_filter_bar_v13.3.png "Active filter bar for value stream analytics")
+![Value stream analytics filter bar](img/vsa_filter_bar_v13_3.png "Active filter bar for value stream analytics")
### Date ranges
@@ -299,10 +299,59 @@ To create a value stream:
1. Navigate to your group's **Analytics > Value Stream**.
1. Click the Value stream dropdown and select **Create new Value Stream**
1. Fill in a name for the new Value Stream
+ - You can [customize the stages](#creating-a-value-stream-with-stages) as the `value_stream_analytics_extended_form` feature flag is enabled.
1. Click the **Create Value Stream** button.
![New value stream](img/new_value_stream_v13_3.png "Creating a new value stream")
+#### Creating a value stream with stages
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55572) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../../feature_flags.md), enabled by default.
+> - It's enabled on GitLab.com.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](../../../administration/feature_flags.md). **(FREE SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+You can create value streams with stages, starting with a default or a blank template. You can
+add stages as desired.
+
+To create a value stream with stages:
+
+1. Navigate to your group's **Analytics > Value Stream**.
+1. Find and select the Value Stream dropdown. Select **Create new Value Stream**.
+1. Select either **Create from default template** or **Create from no template**.
+ - Default stages in the value stream can be hidden or re-ordered
+ ![Default stage actions](img/vsa_default_stage_v13_10.png "Default stage actions")
+ - New stages can be added by clicking the 'Add another stage' button
+ - The name, start and end events for the stage can be selected
+ ![Custom stage actions](img/vsa_custom_stage_v13_10.png "Custom stage actions")
+1. Select the **Create Value Stream** button to save the value stream.
+
+![Extended create value stream form](img/extended_value_stream_form_v13_10.png "Extended create value stream form")
+
+#### Enable or disable value stream with stages
+
+Value streams with stages is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can opt to disable it.
+
+To enable it:
+
+```ruby
+# For the instance
+Feature.enable(:value_stream_analytics_extended_form)
+```
+
+To disable it:
+
+```ruby
+# For the instance
+Feature.disable(:value_stream_analytics_extended_form)
+```
+
### Deleting a value stream
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221205) in GitLab 13.4.
@@ -314,7 +363,7 @@ To delete a custom value stream:
1. Click the **Delete (name of value stream)**.
1. Click the **Delete** button to confirm.
-![Delete value stream](img/delete_value_stream_v13.4.png "Deleting a custom value stream")
+![Delete value stream](img/delete_value_stream_v13_4.png "Deleting a custom value stream")
## Days to completion chart
diff --git a/doc/user/img/gitlab_snippet_v13_0.png b/doc/user/img/gitlab_snippet_v13_0.png
deleted file mode 100644
index 33194c512df..00000000000
--- a/doc/user/img/gitlab_snippet_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/gitlab_snippet_v13_5.png b/doc/user/img/gitlab_snippet_v13_5.png
deleted file mode 100644
index 3fce1d25c3d..00000000000
--- a/doc/user/img/gitlab_snippet_v13_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/new_personal_snippet_from_project_v12_10.png b/doc/user/img/new_personal_snippet_from_project_v12_10.png
deleted file mode 100644
index af8cce01208..00000000000
--- a/doc/user/img/new_personal_snippet_from_project_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/new_personal_snippet_v12_10.png b/doc/user/img/new_personal_snippet_v12_10.png
deleted file mode 100644
index a995e4d4b40..00000000000
--- a/doc/user/img/new_personal_snippet_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/index.md b/doc/user/index.md
index a678038507f..7541e3e85f9 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -6,7 +6,7 @@ type: reference, index
description: 'Read through the GitLab User documentation to learn how to use, configure, and customize GitLab and GitLab.com to your own needs.'
---
-# User Docs
+# User Docs **(FREE)**
Welcome to GitLab! We're glad to have you here!
@@ -31,10 +31,10 @@ For more information, see [All GitLab Features](https://about.gitlab.com/feature
To get familiar with the concepts needed to develop code on GitLab, read the following articles:
- [Demo: Mastering Code Review With GitLab](https://about.gitlab.com/blog/2017/03/17/demo-mastering-code-review-with-gitlab/).
-- [GitLab Workflow: An Overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/#gitlab-workflow-use-case-scenario).
+- [GitLab Workflow: An Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
- [Tutorial: It's all connected in GitLab](https://about.gitlab.com/blog/2016/03/08/gitlab-tutorial-its-all-connected/): an overview on code collaboration with GitLab.
- [Trends in Version Control Land: Microservices](https://about.gitlab.com/blog/2016/08/16/trends-in-version-control-land-microservices/).
-- [Trends in Version Control Land: Innersourcing](https://about.gitlab.com/blog/2016/07/07/trends-version-control-innersourcing/).
+- [Trends in Version Control Land: Innersourcing](https://about.gitlab.com/topics/version-control/what-is-innersource/).
## Use cases
@@ -56,12 +56,12 @@ GitLab is a Git-based platform that integrates a great number of essential tools
With GitLab Enterprise Edition, you can also:
- Improve collaboration with:
- - [Merge Request Approvals](project/merge_requests/merge_request_approvals.md). **(STARTER)**
- - [Multiple Assignees for Issues](project/issues/multiple_assignees_for_issues.md). **(STARTER)**
+ - [Merge Request Approvals](project/merge_requests/merge_request_approvals.md).
+ - [Multiple Assignees for Issues](project/issues/multiple_assignees_for_issues.md).
- [Multiple Issue Boards](project/issue_board.md#multiple-issue-boards).
- Create formal relationships between issues with [Related Issues](project/issues/related_issues.md).
- Use [Burndown Charts](project/milestones/burndown_and_burnup_charts.md) to track progress during a sprint or while working on a new version of their software.
-- Leverage [Elasticsearch](../integration/elasticsearch.md) with [Advanced Search](search/advanced_global_search.md) and [Advanced Search Syntax](search/advanced_search_syntax.md) for faster, more advanced code search across your entire GitLab instance.
+- Leverage [Elasticsearch](../integration/elasticsearch.md) with [Advanced Search](search/advanced_search.md) for faster, more advanced code search across your entire GitLab instance.
- [Authenticate users with Kerberos](../integration/kerberos.md).
- [Mirror a repository](project/repository/repository_mirroring.md) from elsewhere on your local server.
- View your entire CI/CD pipeline involving more than one project with [Multiple-Project Pipelines](../ci/multi_project_pipelines.md).
@@ -85,7 +85,7 @@ There are several types of users in GitLab:
## User activity
-You can follow or unfollow other users from their [user profiles](profile/index.md#user-profile).
+You can follow or unfollow other users from their [user profiles](profile/index.md#access-your-user-profile).
To see their activity in the top-level Activity view, select Follow or Unfollow, and select
the Followed Users tab:
@@ -198,7 +198,7 @@ Learn what is [Git](../topics/git/index.md) and its best practices.
See [various statistics](admin_area/analytics/index.md) of your GitLab instance.
-## Operations Dashboard **(PREMIUM)**
+## Operations Dashboard
See [Operations Dashboard](operations_dashboard/index.md) for a summary of each
project's operational health.
diff --git a/doc/user/infrastructure/index.md b/doc/user/infrastructure/index.md
index 6ba5e49d553..b202359847c 100644
--- a/doc/user/infrastructure/index.md
+++ b/doc/user/infrastructure/index.md
@@ -52,9 +52,9 @@ This video from January 2021 walks you through all the GitLab Terraform integrat
## GitLab Managed Terraform state
-[Terraform remote backends](https://www.terraform.io/docs/backends/index.html)
+[Terraform remote backends](https://www.terraform.io/docs/language/settings/backends/index.html)
enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+[Terraform HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
to securely store the state files in local storage (the default) or
[the remote store of your choice](../../administration/terraform_state.md).
diff --git a/doc/user/infrastructure/terraform_state.md b/doc/user/infrastructure/terraform_state.md
index ae35ebce0dc..2cd5ed8ac78 100644
--- a/doc/user/infrastructure/terraform_state.md
+++ b/doc/user/infrastructure/terraform_state.md
@@ -8,9 +8,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2673) in GitLab 13.0.
-[Terraform remote backends](https://www.terraform.io/docs/backends/index.html)
+[Terraform remote backends](https://www.terraform.io/docs/language/settings/backends/index.html)
enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+[Terraform HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
to securely store the state files in local storage (the default) or
[the remote store of your choice](../../administration/terraform_state.md).
@@ -96,7 +96,7 @@ Next, [configure the backend](#configure-the-backend).
After executing the `terraform init` command, you must configure the Terraform backend
and the CI YAML file:
-1. In your Terraform project, define the [HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+1. In your Terraform project, define the [HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
by adding the following code block in a `.tf` file (such as `backend.tf`) to
define the remote backend:
@@ -116,7 +116,7 @@ and the CI YAML file:
image: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
```
-1. In the `.gitlab-ci.yml` file, define some environment variables to ease
+1. In the `.gitlab-ci.yml` file, define some CI/CD variables to ease
development. In this example, `TF_ROOT` is the directory where the Terraform
commands must be executed, `TF_ADDRESS` is the URL to the state on the GitLab
instance where this pipeline runs, and the final path segment in `TF_ADDRESS`
@@ -203,16 +203,16 @@ See [this reference project](https://gitlab.com/gitlab-org/configure/examples/gi
## Using a GitLab managed Terraform state backend as a remote data source
You can use a GitLab-managed Terraform state as a
-[Terraform data source](https://www.terraform.io/docs/providers/terraform/d/remote_state.html).
+[Terraform data source](https://www.terraform.io/docs/language/state/remote-state-data.html).
To use your existing Terraform state backend as a data source, provide the following details
-as [Terraform input variables](https://www.terraform.io/docs/configuration/variables.html):
+as [Terraform input variables](https://www.terraform.io/docs/language/values/variables.html):
- **address**: The URL of the remote state backend you want to use as a data source.
For example, `https://gitlab.com/api/v4/projects/<TARGET-PROJECT-ID>/terraform/state/<TARGET-STATE-NAME>`.
- **username**: The username to authenticate with the data source. If you are using a [Personal Access Token](../profile/personal_access_tokens.md) for
authentication, this is your GitLab username. If you are using GitLab CI, this is `'gitlab-ci-token'`.
- **password**: The password to authenticate with the data source. If you are using a Personal Access Token for
- authentication, this is the token value. If you are using GitLab CI, it is the contents of the `${CI_JOB_TOKEN}` CI variable.
+ authentication, this is the token value. If you are using GitLab CI, it is the contents of the `${CI_JOB_TOKEN}` CI/CD variable.
An example setup is shown below:
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 5f974d75522..0c257f2fb70 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -18,13 +18,13 @@ for a complete Kramdown reference.
NOTE:
We encourage you to view this document as [rendered by GitLab itself](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/user/markdown.md).
-## GitLab Flavored Markdown (GFM)
+## GitLab Flavored Markdown
-GitLab uses "GitLab Flavored Markdown" (GFM). It extends the [CommonMark specification](https://spec.commonmark.org/current/)
+GitLab uses "GitLab Flavored Markdown". It extends the [CommonMark specification](https://spec.commonmark.org/current/)
(which is based on standard Markdown) in several ways to add more features.
-It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/basic-writing-and-formatting-syntax).
+It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax).
-You can use GFM in the following areas:
+You can use GitLab Flavored Markdown in the following areas:
- Comments
- Issues
@@ -92,12 +92,12 @@ if any changes are needed.
`diff_redcarpet_cmark` is not an officially supported product.
-### GFM extends standard Markdown
+### GitLab Flavored Markdown extends standard Markdown
GitLab makes full use of the standard (CommonMark) formatting, but also includes more
helpful features for GitLab users.
-It makes use of [new Markdown features](#new-gfm-markdown-extensions),
+It makes use of [new Markdown features](#new-gitlab-flavored-markdown-extensions),
not found in standard Markdown:
- [Color chips written in HEX, RGB or HSL](#colors)
@@ -124,7 +124,7 @@ changing how standard Markdown is used:
| [line breaks](#line-breaks) | [more line break control](#newlines) |
| [links](#links) | [automatically linking URLs](#url-auto-linking) |
-## New GFM Markdown extensions
+## New GitLab Flavored Markdown extensions
### Colors
@@ -251,7 +251,7 @@ If this section isn't rendered correctly, [view it in GitLab](https://gitlab.com
```markdown
Sometimes you want to :monkey: around a bit and add some :star2: to your :speech_balloon:. Well we have a gift for you:
-:zap: You can use emoji anywhere GFM is supported. :v:
+:zap: You can use emoji anywhere GitLab Flavored Markdown is supported. :v:
You can use it to point out a :bug: or warn about :speak_no_evil: patches. And if someone improves your really :snail: code, send them some :birthday:. People :heart: you for that.
@@ -262,7 +262,7 @@ Consult the [Emoji Cheat Sheet](https://www.emojicopy.com) for a list of all sup
Sometimes you want to <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/monkey.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> around a bit and add some <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/star2.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> to your <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/speech_balloon.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. Well we have a gift for you:
-<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/zap.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">You can use emoji anywhere GFM is supported. <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/v.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">
+<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/zap.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">You can use emoji anywhere GitLab Flavored Markdown is supported. <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/v.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">
You can use it to point out a<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/bug.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> or warn about <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/speak_no_evil.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> patches. If someone improves your really <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/snail.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> code, send them some <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/birthday.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. People <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/heart.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> you for that.
@@ -424,14 +424,14 @@ the [Asciidoctor user manual](https://asciidoctor.org/docs/user-manual/#activati
### Special GitLab references
-GFM recognizes special GitLab related references. For example, you can reference
-an issue, a commit, a team member, or even an entire project team. GFM turns
+GitLab Flavored Markdown recognizes special GitLab related references. For example, you can reference
+an issue, a commit, a team member, or even an entire project team. GitLab Flavored Markdown turns
that reference into a link so you can navigate between them.
-Additionally, GFM recognizes certain cross-project references and also has a shorthand
+Additionally, GitLab Flavored Markdown recognizes certain cross-project references and also has a shorthand
version to reference other projects from the same namespace.
-GFM recognizes the following:
+GitLab Flavored Markdown recognizes the following:
| references | input | cross-project reference | shortcut inside same namespace |
| :------------------------------ | :------------------------- | :-------------------------------------- | :----------------------------- |
@@ -462,7 +462,8 @@ GFM recognizes the following:
For example, referencing an issue by using `#123` formats the output as a link
to issue number 123 with text `#123`. Likewise, a link to issue number 123 is
-recognized and formatted with text `#123`.
+recognized and formatted with text `#123`. If you don't want `#123` to link to an issue,
+add a leading backslash `\#123`.
In addition to this, links to some objects are also recognized and formatted. Some examples of these are:
@@ -630,7 +631,7 @@ Quote break.
If this section isn't rendered correctly, [view it in GitLab](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/user/markdown.md#multiline-blockquote).
-GFM extends the standard Markdown by also supporting multi-line blockquotes
+GitLab Flavored Markdown extends the standard Markdown by also supporting multi-line blockquotes
fenced by `>>>`:
```markdown
@@ -778,7 +779,7 @@ But let's throw in a <b>tag</b>.
There are multiple ways to emphasize text in Markdown. You can italicize, bold, strikethrough,
and combine these emphasis styles together.
-Strikethrough is not part of the core Markdown standard, but is part of GFM.
+Strikethrough is not part of the core Markdown standard, but is part of GitLab Flavored Markdown.
Examples:
@@ -807,7 +808,7 @@ If this section isn't rendered correctly,
Avoid italicizing a portion of a word, especially when you're
dealing with code and names that often appear with multiple underscores.
-GFM extends the standard Markdown standard by ignoring multiple underlines in words,
+GitLab Flavored Markdown extends the standard Markdown standard by ignoring multiple underlines in words,
to allow better rendering of Markdown documents discussing code:
```markdown
@@ -899,7 +900,7 @@ Alt-H2
#### Header IDs and links
-GFM extends the standard Markdown standard so that all Markdown-rendered headers automatically
+GitLab Flavored Markdown extends the standard Markdown standard so that all Markdown-rendered headers automatically
get IDs, which can be linked to, except in comments.
On hover, a link to those IDs becomes visible to make it easier to copy the link to
@@ -1193,7 +1194,7 @@ in the *same paragraph*.
#### Newlines
-GFM adheres to the Markdown specification in how [paragraphs and line breaks are handled](https://spec.commonmark.org/current/).
+GitLab Flavored Markdown adheres to the Markdown specification in how [paragraphs and line breaks are handled](https://spec.commonmark.org/current/).
A paragraph is one or more consecutive lines of text, separated by one or
more blank lines (two newlines at the end of the first paragraph), as [explained above](#line-breaks).
@@ -1275,7 +1276,7 @@ points the link to `wikis/style` only when the link is inside of a wiki Markdown
#### URL auto-linking
-GFM auto-links almost any URL you put into your text:
+GitLab Flavored Markdown auto-links almost any URL you put into your text:
```markdown
- https://www.google.com
@@ -1322,7 +1323,7 @@ Examples:
<!--
The "2." and "4." in the example above are changed to "1." below, to match the style
standards on docs.gitlab.com.
-See https://docs.gitlab.com/ee/development/documentation/styleguide.html#lists
+See https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#lists
-->
1. First ordered list item
@@ -1356,7 +1357,7 @@ They can even:
<!--
The "*" and "+" in the example above are changed to "-" below, to match the style
standards on docs.gitlab.com.
-See https://docs.gitlab.com/ee/development/documentation/styleguide.html#lists
+See https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#lists
-->
Unordered lists can:
@@ -1418,7 +1419,7 @@ Example:
### Superscripts / Subscripts
-CommonMark and GFM don't support the Redcarpet superscript syntax ( `x^2` ).
+CommonMark and GitLab Flavored Markdown don't support the Redcarpet superscript syntax ( `x^2` ).
Use the standard HTML syntax for superscripts and subscripts:
```html
@@ -1435,7 +1436,7 @@ while the equation for the theory of relativity is E = mc<sup>2</sup>.
### Tables
-Tables are not part of the core Markdown spec, but they are part of GFM.
+Tables are not part of the core Markdown spec, but they are part of GitLab Flavored Markdown.
1. The first line contains the headers, separated by "pipes" (`|`).
1. The second line separates the headers from the cells, and must contain three or more dashes.
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index c115f94b964..3b8be68cff6 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -171,6 +171,10 @@ convention.
## Authenticate to the Package Registry
+GitLab requires authentication to upload packages, and to install packages
+from private and internal projects. (You can, however, install packages
+from public projects without authentication.)
+
To authenticate to the Package Registry, you need one of the following:
- A [personal access token](../../../user/profile/personal_access_tokens.md)
@@ -302,8 +306,9 @@ file.
Prerequisites:
- The Conan remote [must be configured](#add-the-package-registry-as-a-conan-remote).
-- [Authentication](#authenticate-to-the-package-registry) with the
- Package Registry must be configured.
+- For private and internal projects, you must configure
+ [Authentication](#authenticate-to-the-package-registry)
+ with the Package Registry.
1. In the project where you want to install the package as a dependency, open
`conanfile.txt`. Or, in the root of your project, create a file called
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index e3a469c4b6c..18c4edd61c7 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -577,7 +577,7 @@ Here are examples of regex patterns you may want to use:
(?:v.+|master|release.*)
```
-### Set cleanup limits to conserve resources
+### Set cleanup limits to conserve resources
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/288812) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
@@ -595,7 +595,7 @@ To prevent server resource starvation, the following application settings are av
- `container_registry_delete_tags_service_timeout`. The maximum time, in seconds, that the cleanup process can take to delete a batch of tags.
- `container_registry_cleanup_tags_service_max_list_size`. The maximum number of tags that can be deleted in a single execution. Additional tags must be deleted in another execution.
We recommend starting with a low number, like `100`, and increasing it after monitoring that container images are properly deleted.
-
+
For self-managed instances, those settings can be updated in the [Rails console](../../../administration/operations/rails_console.md#starting-a-rails-console-session):
```ruby
@@ -699,7 +699,7 @@ project or branch name. Special characters can include:
- Leading underscore
- Trailing hyphen/dash
-To get around this, you can [change the group path](../../group/index.md#changing-a-groups-path),
+To get around this, you can [change the group path](../../group/index.md#change-a-groups-path),
[change the project path](../../project/settings/index.md#renaming-a-repository) or change the branch
name.
@@ -712,7 +712,7 @@ For information on how to update your images, see the [Docker help](https://docs
### `Blob unknown to registry` error when pushing a manifest list
-When [pushing a Docker manifest list](https://docs.docker.com/engine/reference/commandline/manifest/#create-and-push-a-manifest-list) to the GitLab Container Registry, you may receive the error `manifest blob unknown: blob unknown to registry`. This issue occurs when the individual child manifests referenced in the manifest list were not pushed to the same repository.
+When [pushing a Docker manifest list](https://docs.docker.com/engine/reference/commandline/manifest/#create-and-push-a-manifest-list) to the GitLab Container Registry, you may receive the error `manifest blob unknown: blob unknown to registry`. [This issue](https://gitlab.com/gitlab-org/gitlab/-/issues/209008) occurs when the individual child manifests referenced in the manifest list were not pushed to the same repository.
For example, you may have two individual images, one for `amd64` and another for `arm64v8`, and you want to build a multi-arch image with them. The `amd64` and `arm64v8` images must be pushed to the same repository where you want to push the multi-arch image.
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index fdf0caba090..ad2d2ac2a8e 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -4,12 +4,13 @@ group: Package
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Dependency Proxy
+# Dependency Proxy **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7934) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.11.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/273655) to [GitLab Core](https://about.gitlab.com/pricing/) in GitLab 13.6.
-> - [Support for private groups](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
-> - Anonymous access to images in public groups is no longer available starting in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/273655) to GitLab Free in GitLab 13.6.
+> - [Support for private groups](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab Free 13.7.
+> - Anonymous access to images in public groups is no longer available starting in GitLab Free 13.7.
+> - [Support for pull-by-digest and Docker version 20.x](https://gitlab.com/gitlab-org/gitlab/-/issues/290944) in GitLab Free 13.10.
The GitLab Dependency Proxy is a local proxy you can use for your frequently-accessed
upstream images.
@@ -17,11 +18,6 @@ upstream images.
In the case of CI/CD, the Dependency Proxy receives a request and returns the
upstream image from a registry, acting as a pull-through cache.
-NOTE:
-The Dependency Proxy is not compatible with Docker version 20.x and later.
-If you are using the Dependency Proxy, Docker version 19.x.x is recommended until
-[issue #290944](https://gitlab.com/gitlab-org/gitlab/-/issues/290944) is resolved.
-
## Prerequisites
The Dependency Proxy must be [enabled by an administrator](../../../administration/packages/dependency_proxy.md).
@@ -60,7 +56,7 @@ Prerequisites:
### Authenticate with the Dependency Proxy
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab Free 13.7.
> - It's [deployed behind a feature flag](../../feature_flags.md), enabled by default.
> - It's enabled on GitLab.com.
> - It's recommended for production use.
@@ -93,14 +89,17 @@ You can authenticate using:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/280582) in GitLab 13.7.
> - Automatic runner authentication [added](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27302) in GitLab 13.9.
+> - The prefix for group names containing uppercase letters was [fixed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54559) in GitLab 13.10.
Runners log in to the Dependency Proxy automatically. To pull through
the Dependency Proxy, use the `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`
[predefined CI/CD variable](../../../ci/variables/predefined_variables.md):
+Example pulling the latest alpine image:
+
```yaml
# .gitlab-ci.yml
-image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/node:latest
+image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine:latest
```
There are other additional predefined CI/CD variables you can also use:
@@ -128,13 +127,20 @@ To store a Docker image in Dependency Proxy storage:
1. Go to your group's **Packages & Registries > Dependency Proxy**.
1. Copy the **Dependency Proxy URL**.
1. Use one of these commands. In these examples, the image is `alpine:latest`.
+1. You can also pull images by digest to specify exactly which version of an image to pull.
- - Add the URL to your [`.gitlab-ci.yml`](../../../ci/yaml/README.md#image) file:
+ - Pull an image by tag by adding the image to your [`.gitlab-ci.yml`](../../../ci/yaml/README.md#image) file:
```shell
image: gitlab.example.com/groupname/dependency_proxy/containers/alpine:latest
```
+ - Pull an image by digest by adding the image to your [`.gitlab-ci.yml`](../../../ci/yaml/README.md#image) file:
+
+ ```shell
+ image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine@sha256:c9375e662992791e3f39e919b26f510e5254b42792519c180aad254e6b38f4dc
+ ```
+
- Manually pull the Docker image:
```shell
@@ -162,7 +168,7 @@ the [Dependency Proxy API](../../../api/dependency_proxy.md).
## Docker Hub rate limits and the Dependency Proxy
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241639) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241639) in GitLab Free 13.7.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
Watch how to [use the Dependency Proxy to help avoid Docker Hub rate limits](https://youtu.be/Nc4nUo7Pq08).
diff --git a/doc/user/packages/generic_packages/index.md b/doc/user/packages/generic_packages/index.md
index 73b84c04b6d..b9186e99357 100644
--- a/doc/user/packages/generic_packages/index.md
+++ b/doc/user/packages/generic_packages/index.md
@@ -40,7 +40,7 @@ Prerequisites:
- You need to [authenticate with the API](../../../api/README.md#authentication). If authenticating with a deploy token, it must be configured with the `write_package_registry` scope.
```plaintext
-PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name
+PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name?status=:status
```
| Attribute | Type | Required | Description |
@@ -53,12 +53,28 @@ PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name
Provide the file context in the request body.
-Example request:
+Example request using a personal access token:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--upload-file path/to/file.txt \
- "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
+ "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?status=hidden"
+```
+
+Example response:
+
+```json
+{
+ "message":"201 Created"
+}
+```
+
+Example request using a deploy token:
+
+```shell
+curl --header "DEPLOY-TOKEN: <deploy_token>" \
+ --upload-file path/to/file.txt \
+ "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?status=hidden"
```
Example response:
diff --git a/doc/user/packages/go_proxy/index.md b/doc/user/packages/go_proxy/index.md
index c9397f8d9f6..1fdc34e820e 100644
--- a/doc/user/packages/go_proxy/index.md
+++ b/doc/user/packages/go_proxy/index.md
@@ -96,7 +96,7 @@ following steps work only if GitLab is configured for HTTPS:
Create a [personal access token](../../profile/personal_access_tokens.md) with
the scope set to `api` or `read_api`.
-Open your [`~/.netrc`](https://ec.haxx.se/usingcurl/usingcurl-netrc) file
+Open your [`~/.netrc`](https://everything.curl.dev/usingcurl/netrc) file
and add the following text. Replace the variables in `< >` with your values.
```plaintext
diff --git a/doc/user/packages/index.md b/doc/user/packages/index.md
index d2bd9ef5646..b35015d0b67 100644
--- a/doc/user/packages/index.md
+++ b/doc/user/packages/index.md
@@ -43,14 +43,15 @@ guides you through the process.
| CocoaPods | [#36890](https://gitlab.com/gitlab-org/gitlab/-/issues/36890) |
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
-| Debian | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44746) |
+| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
+| Helm | [#18997](https://gitlab.com/gitlab-org/gitlab/-/issues/18997) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
| RPM | [#5932](https://gitlab.com/gitlab-org/gitlab/-/issues/5932) |
| RubyGems | [#803](https://gitlab.com/gitlab-org/gitlab/-/issues/803) |
| SBT | [#36898](https://gitlab.com/gitlab-org/gitlab/-/issues/36898) |
-| Terraform | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
+| Terraform | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
| Vagrant | [#36899](https://gitlab.com/gitlab-org/gitlab/-/issues/36899) |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index b1075e19b7b..f048440e383 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -86,7 +86,9 @@ A `package.json` file is created.
To use the GitLab endpoint for npm packages, choose an option:
- **Project-level**: Use when you have few npm packages and they are not in
- the same GitLab group.
+ the same GitLab group. The [package naming convention](#package-naming-convention) is not enforced at this level.
+ Instead, you should use a [scope](https://docs.npmjs.com/cli/v6/using-npm/scope) for your package.
+ When you use a scope, the registry URL is [updated](#authenticate-to-the-package-registry) only for that scope.
- **Instance-level**: Use when you have many npm packages in different
GitLab groups or in their own namespace. Be sure to comply with the [package naming convention](#package-naming-convention).
@@ -151,7 +153,7 @@ npm config set '//gitlab.example.com/api/v4/packages/npm/:_authToken' "<your_tok
- `<your_token>` is your personal access token or deploy token.
- Replace `gitlab.example.com` with your domain name.
-You should now be able to publish and install npm packages in your project.
+You should now be able to install npm packages in your project.
If you encounter an error with [Yarn](https://classic.yarnpkg.com/en/), view
[troubleshooting steps](#troubleshooting).
@@ -204,9 +206,14 @@ Then, you can run `npm publish` either locally or by using GitLab CI/CD.
## Package naming convention
-Your npm package name must be in the format of `@scope/package-name`.
+When you use the [instance-level endpoint](#use-the-gitlab-endpoint-for-npm-packages), only the packages with names in the format of `@scope/package-name` are available.
-- The `@scope` is the root namespace of the GitLab project. It must match exactly, including the case.
+- The `@scope` is the root namespace of the GitLab project. To follow npm's convention, it should be
+ lowercase. However, the GitLab package registry allows for uppercase. Before GitLab 13.10, the
+ `@scope` had to be a case-sensitive match of the GitLab project's root namespace. This was
+ problematic because the npm public registry does not allow uppercase letters. GitLab 13.10 relaxes
+ this requirement and translates uppercase in the GitLab `@scope` to lowercase for npm. For
+ example, a package `@MyScope/package-name` in GitLab becomes `@myscope/package-name` for npm.
- The `package-name` can be whatever you want.
For example, if your project is `https://gitlab.example.com/my-org/engineering-group/team-amazing/analytics`,
@@ -216,7 +223,8 @@ the root namespace is `my-org`. When you publish a package, it must have `my-org
| ---------------------- | ----------------------- | --------- |
| `my-org/bar` | `@my-org/bar` | Yes |
| `my-org/bar/baz` | `@my-org/baz` | Yes |
-| `My-org/Bar/baz` | `@My-org/Baz` | Yes |
+| `My-Org/Bar/baz` | `@my-org/Baz` | Yes |
+| `My-Org/Bar/baz` | `@My-Org/Baz` | Yes |
| `my-org/bar/buz` | `@my-org/anything` | Yes |
| `gitlab-org/gitlab` | `@gitlab-org/gitlab` | Yes |
| `gitlab-org/gitlab` | `@foo/bar` | No |
@@ -229,8 +237,7 @@ In GitLab, this regex validates all package names from all package managers:
This regex allows almost all of the characters that npm allows, with a few exceptions (for example, `~` is not allowed).
-The regex also allows for capital letters, while npm does not. Capital letters are needed because the scope must be
-identical to the root namespace of the project.
+The regex also allows for capital letters, while npm does not.
WARNING:
When you update the path of a user or group, or transfer a subgroup or project,
@@ -302,8 +309,9 @@ the same version more than once, even if it has been deleted.
## Install a package
npm packages are commonly-installed by using the `npm` or `yarn` commands
-in a JavaScript project. You can install a package from the scope of a project, group,
-or instance.
+in a JavaScript project. You can install a package from the scope of a project or instance.
+
+If multiple packages have the same name and version, when you install a package, the most recently-published package is retrieved.
1. Set the URL for scoped packages by running:
diff --git a/doc/user/packages/nuget_repository/index.md b/doc/user/packages/nuget_repository/index.md
index 101bb810a0e..e1b61f28818 100644
--- a/doc/user/packages/nuget_repository/index.md
+++ b/doc/user/packages/nuget_repository/index.md
@@ -219,7 +219,7 @@ To use the [project-level](#use-the-gitlab-endpoint-for-nuget-packages) Package
<configuration>
<packageSources>
<clear />
- <add key="gitlab" value="https://gitlab.example.com/api/v4/project/<your_project_id>/packages/nuget/index.json" />
+ <add key="gitlab" value="https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/nuget/index.json" />
</packageSources>
<packageSourceCredentials>
<gitlab>
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index 19796de0f51..0e83843f3e8 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -4,7 +4,7 @@ group: Package
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Package Registry
+# Package Registry **(FREE)**
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
@@ -21,6 +21,8 @@ You can view packages for your project or group.
You can search, sort, and filter packages on this page.
+You can also find helpful code snippets for configuring your package manager or installing a given package.
+
When you view packages in a group:
- All projects published to the group and its projects are displayed.
diff --git a/doc/user/packages/pypi_repository/index.md b/doc/user/packages/pypi_repository/index.md
index 763dbee3a82..a6cc5cf1f07 100644
--- a/doc/user/packages/pypi_repository/index.md
+++ b/doc/user/packages/pypi_repository/index.md
@@ -174,11 +174,10 @@ index-servers =
[gitlab]
repository = https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi
-username = __token__
-password = <your personal access token>
+username = <your_personal_access_token_name>
+password = <your_personal_access_token>
```
-- `username` must be `__token__` exactly.
- Your project ID is on your project's home page.
### Authenticate with a deploy token
@@ -317,24 +316,31 @@ more than once, a `404 Bad Request` error occurs.
To install the latest version of a package, use the following command:
```shell
-pip install --extra-index-url https://__token__:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple --no-deps <package_name>
+pip install --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple --no-deps <package_name>
```
- `<package_name>` is the package name.
+- `<personal_access_token_name>` is a personal access token name with the `read_api` scope.
- `<personal_access_token>` is a personal access token with the `read_api` scope.
- `<project_id>` is the project ID.
+In these commands, you can use `--extra-index-url` instead of `--index-url`. However, using
+`--extra-index-url` makes you vulnerable to dependency confusion attacks because it checks the PyPi
+repository for the package before it checks the custom repository. `--extra-index-url` adds the
+provided URL as an additional registry which the client checks if the package is present.
+`--index-url` tells the client to check for the package on the provided URL only.
+
If you were following the guide and want to install the
`MyPyPiPackage` package, you can run:
```shell
-pip install mypypipackage --no-deps --extra-index-url https://__token__:<personal_access_token>@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
+pip install mypypipackage --no-deps --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
```
This message indicates that the package was installed successfully:
```plaintext
-Looking in indexes: https://__token__:****@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
+Looking in indexes: https://<personal_access_token_name>:****@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
Collecting mypypipackage
Downloading https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/files/d53334205552a355fee8ca35a164512ef7334f33d309e60240d57073ee4386e6/mypypipackage-0.0.1-py3-none-any.whl (1.6 kB)
Installing collected packages: mypypipackage
diff --git a/doc/user/packages/workflows/monorepo.md b/doc/user/packages/workflows/monorepo.md
deleted file mode 100644
index abba9df6ec2..00000000000
--- a/doc/user/packages/workflows/monorepo.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../npm_registry/index.md'
-disqus_identifier: 'https://docs.gitlab.com/ee/user/packages/workflows/monorepo.html'
----
-
-This document was moved to [another location](../npm_registry/index.md).
-
-<!-- This redirect file can be deleted after <2021-02-14>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/packages/workflows/project_registry.md b/doc/user/packages/workflows/project_registry.md
index 9b99b126996..c63c2cc9989 100644
--- a/doc/user/packages/workflows/project_registry.md
+++ b/doc/user/packages/workflows/project_registry.md
@@ -77,6 +77,11 @@ depending on your final package recipe. For example:
CONAN_LOGIN_USERNAME=<gitlab-username> CONAN_PASSWORD=<personal_access_token> conan upload MyPackage/1.0.0@foo+bar+my-proj/channel --all --remote=gitlab
```
+### Composer
+
+You can't publish a Composer package outside of its project. An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/250633)
+exists to implement functionality that allows you to publish such packages to other projects.
+
### All other package types
[All package types supported by GitLab](../index.md) can be published in
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 68a68ed65ad..bde589661f9 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -78,6 +78,7 @@ The following table depicts the various user permission levels in a project.
| Assign reviewers | | ✓ | ✓ | ✓ | ✓ |
| Label issues | | ✓ | ✓ | ✓ | ✓ |
| Set issue weight | | ✓ | ✓ | ✓ | ✓ |
+| [Set issue estimate and record time spent](project/time_tracking.md) | | ✓ | ✓ | ✓ | ✓ |
| Lock issue threads | | ✓ | ✓ | ✓ | ✓ |
| Manage issue tracker | | ✓ | ✓ | ✓ | ✓ |
| Manage related issues | | ✓ | ✓ | ✓ | ✓ |
@@ -104,7 +105,8 @@ The following table depicts the various user permission levels in a project.
| Publish [packages](packages/index.md) | | | ✓ | ✓ | ✓ |
| Create/edit/delete a Cleanup policy | | | ✓ | ✓ | ✓ |
| Upload [Design Management](project/issues/design_management.md) files | | | ✓ | ✓ | ✓ |
-| Create/edit/delete [Releases](project/releases/index.md)| | | ✓ | ✓ | ✓ |
+| Create/edit [releases](project/releases/index.md)| | | ✓ | ✓ | ✓ |
+| Delete [releases](project/releases/index.md)| | | | ✓ | ✓ |
| Create new branches | | | ✓ | ✓ | ✓ |
| Push to non-protected branches | | | ✓ | ✓ | ✓ |
| Force push to non-protected branches | | | ✓ | ✓ | ✓ |
@@ -173,6 +175,7 @@ The following table depicts the various user permission levels in a project.
| View project Audit Events | | | ✓ (*12*) | ✓ | ✓ |
| Manage [push rules](../push_rules/push_rules.md) | | | | ✓ | ✓ |
| Manage [project access tokens](project/settings/project_access_tokens.md) **(FREE SELF)** | | | | ✓ | ✓ |
+| View 2FA status of members | | | | ✓ | ✓ |
| Switch visibility level | | | | | ✓ |
| Transfer project to another namespace | | | | | ✓ |
| Rename project | | | | | ✓ |
@@ -194,7 +197,7 @@ The following table depicts the various user permission levels in a project.
1. If the [branch is protected](project/protected_branches.md#using-the-allowed-to-merge-and-allowed-to-push-settings), this depends on the access Developers and Maintainers are given.
1. Guest users can access GitLab [**Releases**](project/releases/index.md) for downloading assets but are not allowed to download the source code nor see repository information like tags and commits.
1. Actions are limited only to records owned (referenced) by user.
-1. When [Share Group Lock](group/index.md#share-with-group-lock) is enabled the project can't be shared with other groups. It does not affect group with group sharing.
+1. When [Share Group Lock](group/index.md#prevent-a-project-from-being-shared-with-groups) is enabled the project can't be shared with other groups. It does not affect group with group sharing.
1. For information on eligible approvers for merge requests, see
[Eligible approvers](project/merge_requests/merge_request_approvals.md#eligible-approvers).
1. Owner permission is only available at the group or personal namespace level (and for instance admins) and is inherited by its projects.
@@ -293,6 +296,7 @@ group.
| View Value Stream analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
| View Billing **(FREE SAAS)** | | | | | ✓ (4) |
| View Usage Quotas **(FREE SAAS)** | | | | | ✓ (4) |
+| View 2FA status of members | | | | | ✓ |
| Filter members by 2FA status | | | | | ✓ |
| Administer project compliance frameworks | | | | | ✓ |
@@ -301,9 +305,9 @@ group.
1. Introduced in GitLab 12.2.
1. Default project creation role can be changed at:
- The [instance level](admin_area/settings/visibility_and_access_controls.md#default-project-creation-protection).
- - The [group level](group/index.md#default-project-creation-level).
+ - The [group level](group/index.md#specify-who-can-add-projects-to-a-group).
1. Does not apply to subgroups.
-1. Developers can push commits to the default branch of a new project only if the [default branch protection](group/index.md#changing-the-default-branch-protection-of-a-group) is set to "Partially protected" or "Not protected".
+1. Developers can push commits to the default branch of a new project only if the [default branch protection](group/index.md#change-the-default-branch-protection-of-a-group) is set to "Partially protected" or "Not protected".
1. In addition, if your group is public or internal, all users who can see the group can also see group wiki pages.
1. Users can only view events based on their individual actions.
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index 44bf97bdd42..d26acd50189 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -44,16 +44,18 @@ To enable 2FA:
1. **In GitLab:**
1. Sign in to your GitLab account.
- 1. Go to your [**User settings**](../index.md#user-settings).
+ 1. Go to your [**User settings**](../index.md#access-your-user-settings).
1. Go to **Account**.
1. Select **Enable Two-factor Authentication**.
1. **On your device (usually your phone):**
1. Install a compatible application, like:
- - [Authenticator](https://mattrubin.me/authenticator/): open source app for iOS devices.
- - [andOTP](https://github.com/andOTP/andOTP): feature rich open source app for Android which supports PGP encrypted backups.
- - [FreeOTP](https://freeotp.github.io/): open source app for Android.
- - [Google Authenticator](https://support.google.com/accounts/answer/1066447?hl=en): proprietary app for iOS and Android.
- - [SailOTP](https://openrepos.net/content/seiichiro0185/sailotp): open source app for SailFish OS.
+ - [Authy](https://authy.com/)
+ - [Duo Mobile](https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app)
+ - [LastPass](https://lastpass.com/auth/)
+ - [Authenticator](https://mattrubin.me/authenticator/)
+ - [andOTP](https://github.com/andOTP/andOTP)
+ - [Google Authenticator](https://support.google.com/accounts/answer/1066447?hl=en)
+ - [SailOTP](https://openrepos.net/content/seiichiro0185/sailotp)
1. In the application, add a new entry in one of two ways:
- Scan the code presented in GitLab with your device's camera to add the
entry automatically.
@@ -159,7 +161,7 @@ have FortiToken configured in FortiToken Cloud.
You'll also need a `client_id` and `client_secret` to configure FortiToken Cloud.
To get these, see the `REST API Guide` at
-[`Fortinet Document Library`](https://docs.fortinet.com/document/fortitoken-cloud/20.4.d/rest-api).
+[`Fortinet Document Library`](https://docs.fortinet.com/document/fortitoken-cloud/latest/rest-api).
First configure FortiToken Cloud in GitLab. On your GitLab server:
@@ -246,7 +248,7 @@ Search for `security.webauth.u2f` and double click on it to toggle to `true`.
To set up 2FA with a U2F device:
1. Sign in to your GitLab account.
-1. Go to your [**User settings**](../index.md#user-settings).
+1. Go to your [**User settings**](../index.md#access-your-user-settings).
1. Go to **Account**.
1. Click **Enable Two-Factor Authentication**.
1. Connect your U2F device.
@@ -282,7 +284,7 @@ and the following mobile browsers:
To set up 2FA with a WebAuthn compatible device:
1. Sign in to your GitLab account.
-1. Go to your [**User settings**](../index.md#user-settings).
+1. Go to your [**User settings**](../index.md#access-your-user-settings).
1. Go to **Account**.
1. Select **Enable Two-Factor Authentication**.
1. Plug in your WebAuthn device.
@@ -349,7 +351,7 @@ request and you're automatically signed in.
If you ever need to disable 2FA:
1. Sign in to your GitLab account.
-1. Go to your [**User settings**](../index.md#user-settings).
+1. Go to your [**User settings**](../index.md#access-your-user-settings).
1. Go to **Account**.
1. Click **Disable**, under **Two-Factor Authentication**.
@@ -443,7 +445,7 @@ To regenerate 2FA recovery codes, you need access to a desktop browser:
1. Navigate to GitLab.
1. Sign in to your GitLab account.
-1. Go to your [**User settings**](../index.md#user-settings).
+1. Go to your [**User settings**](../index.md#access-your-user-settings).
1. Select **Account > Two-Factor Authentication (2FA)**.
1. If you've already configured 2FA, click **Manage two-factor authentication**.
1. In the **Register Two-Factor Authenticator** pane, click **Regenerate recovery codes**.
diff --git a/doc/user/profile/img/busy_indicator_note_header_v13_9.png b/doc/user/profile/img/busy_indicator_note_header_v13_9.png
new file mode 100644
index 00000000000..63301ebdc14
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_note_header_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_notes_v13_9.png b/doc/user/profile/img/busy_indicator_notes_v13_9.png
new file mode 100644
index 00000000000..2efe075c72b
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_notes_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_profile_page_v13_6.png b/doc/user/profile/img/busy_indicator_profile_page_v13_6.png
new file mode 100644
index 00000000000..c8e969f38db
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_profile_page_v13_6.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png b/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png
new file mode 100644
index 00000000000..711638541dd
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png b/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png
new file mode 100644
index 00000000000..3dca88ec8cc
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_sidebar_v13_9.png b/doc/user/profile/img/busy_indicator_sidebar_v13_9.png
new file mode 100644
index 00000000000..83024b319bf
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_sidebar_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png b/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png
new file mode 100644
index 00000000000..16fb0e6556b
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png
Binary files differ
diff --git a/doc/user/profile/img/busy_status_indicator_v13_6.png b/doc/user/profile/img/busy_status_indicator_v13_6.png
deleted file mode 100644
index 291e0fab971..00000000000
--- a/doc/user/profile/img/busy_status_indicator_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/profile/img/change_password_v13_0.png b/doc/user/profile/img/change_password_v13_0.png
deleted file mode 100644
index f63b32557ac..00000000000
--- a/doc/user/profile/img/change_password_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/profile/img/profile_following_v13_9.png b/doc/user/profile/img/profile_following_v13_9.png
deleted file mode 100644
index 878dce83997..00000000000
--- a/doc/user/profile/img/profile_following_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index d2cbf9e4acd..5bcfafa7196 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -7,133 +7,61 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# User account
-Each GitLab account has a user profile, and settings. Your [profile](#user-profile)
-contains information about you, and your GitLab activity. Your [settings](#user-settings)
-allow you to customize some aspects of GitLab to suit yourself.
+Each GitLab account has a user profile, which contains information about you and your GitLab activity.
-## Creating users
+Your profile also includes settings, which you use to customize your GitLab experience.
-There are several ways to create users on GitLab. See the [creating users documentation](account/create_accounts.md) for more details.
-
-## Signing in
-
-There are several ways to sign into your GitLab account.
-See the [authentication topic](../../topics/authentication/index.md) for more details.
-
-### Unknown sign-in
-
-GitLab notifies you if a sign-in occurs that is from an unknown IP address or device.
-See [Unknown Sign-In Notification](unknown_sign_in_notification.md) for more details.
-
-## User profile
+## Access your user profile
To access your profile:
1. In the top-right corner, select your avatar.
1. Select your name or username.
-On your profile page, you can see the following information:
-
-- Personal information
-- Activity stream: see your activity streamline and the history of your contributions
-- Groups: [groups](../group/index.md) you're a member of
-- Contributed projects: [projects](../project/index.md) you contributed to
-- Personal projects: your personal projects (respecting the project's visibility level)
-- Starred projects: projects you starred
-- Snippets: your personal code [snippets](../snippets.md#personal-snippets)
-- Followers: people following you
-- Following: people you are following
-
-Profile page with active Following view:
-
-![Follow users](img/profile_following_v13_9.png)
-
-## User settings
+## Access your user settings
To access your user settings:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
-From there, you can:
-
-- Update your personal information, including:
- - Full name
- - Primary email, public email, and commit email
- - Social media handles
- - Website URL
- - Location
- - Job title
- - Bio
-- Change your [password](#changing-your-password)
-- Set a [custom status](#current-status) for your profile
-- Manage your [commit email](#commit-email) for your profile
-- Manage [2FA](account/two_factor_authentication.md)
-- Add details of [external accounts](#add-details-of-external-accounts).
-- Change your username and [delete your account](account/delete_account.md)
-- Manage applications that can
- [use GitLab as an OAuth provider](../../integration/oauth_provider.md#introduction-to-oauth)
-- Manage [personal access tokens](personal_access_tokens.md) to access your account via API and authorized applications
-- Add and delete emails linked to your account
-- Choose which email to use for [notifications](notifications.md), web-based commits, and display on your public profile
-- Manage [SSH keys](../../ssh/README.md) to access your account via SSH
-- Manage your [preferences](preferences.md#syntax-highlighting-theme)
- to customize your own GitLab experience
-- [View your active sessions](active_sessions.md) and revoke any of them if necessary
-- Access your audit events, a security log of important events involving your account
+## Change your password
-## Changing your password
+To change your password:
-1. Go to your [user settings](#user-settings).
+1. In the top-right corner, select your avatar.
+1. Select **Edit profile**.
1. In the left sidebar, select **Password**.
-1. Enter your current password in the **Current password** field.
-1. Enter your desired new password twice, once in the **New password** field and
- once in the **Password confirmation** field.
+1. In the **Current password** field, enter your current password.
+1. In the **New password** and **Password confirmation** field, enter your new password.
1. Select **Save password**.
-If you don't know your current password, select the 'I forgot my password' link.
+If you don't know your current password, select the **I forgot my password** link.
+
+## Change your username
-![Change your password](img/change_password_v13_0.png)
+Your username has a unique [namespace](../group/index.md#namespaces),
+which is updated when you change your username. Before you change your username, read about
+[how redirects behave](../project/repository/index.md#redirects-when-changing-repository-paths).
+If you do not want to update the namespace, you can create a new user or group and transfer projects to it instead.
-## Changing your username
+Prerequisites:
-Your `username` is a unique [`namespace`](../group/index.md#namespaces)
-related to your user ID. Changing it can have unintended side effects, read
-[how redirects behave](../project/repository/index.md#redirects-when-changing-repository-paths)
-before proceeding.
+- Your namespace cannot contain a project with [Container Registry](../packages/container_registry/index.md) tags.
+- Your namespace cannot have a project that hosts [GitLab Pages](../project/pages/index.md). For more information,
+ see [this procedure in the GitLab Team Handbook](https://about.gitlab.com/handbook/tools-and-tips/#how-to-change-your-username-at-gitlabcom).
-To change your `username`:
+To change your username:
-1. Navigate to your [user settings](#user-settings).
+1. In the top-right corner, select your avatar.
+1. Select **Edit profile**.
1. In the left sidebar, select **Account**.
-1. Enter a new username under **Change username**.
+1. In the **Change username** section, enter a new username as the path.
1. Select **Update username**.
-WARNING:
-It is not possible to change your username if it contains a
-project with [Container Registry](../packages/container_registry/index.md) tags,
-because the project cannot be moved.
+## Make your user profile page private
-NOTE:
-If you want to retain ownership over the original namespace and
-protect the URL redirects, then instead of changing a group's path or renaming a
-username, you can create a new group and transfer projects to it.
-Alternatively, you can follow [this detailed procedure from the GitLab Team Handbook](https://about.gitlab.com/handbook/tools-and-tips/#how-to-change-your-username-at-gitlabcom)
-which also covers the case where you have projects hosted with
-[GitLab Pages](../project/pages/index.md).
-
-## Private profile
-
-The following information is hidden from the user profile page (`https://gitlab.example.com/username`) if this feature is enabled:
-
-- Atom feed
-- Date when account is created
-- Activity tab
-- Groups tab
-- Contributed projects tab
-- Personal projects tab
-- Starred projects tab
-- Snippets tab
+You can make your user profile visible to only you and GitLab administrators.
To make your profile private:
@@ -142,11 +70,13 @@ To make your profile private:
1. Select the **Private profile** checkbox.
1. Select **Update profile settings**.
-NOTE:
-All your profile information can be seen by yourself and GitLab administrators even if
-the **Private profile** option is enabled.
+The following is hidden from your user profile page (`https://gitlab.example.com/username`):
-## Add details of external accounts
+- Atom feed
+- Date when account was created
+- Tabs for activity, groups, contributed projects, personal projects, starred projects, snippets
+
+## Add external accounts to your user profile page
You can add links to certain other external accounts you might have, like Skype and Twitter.
They can help other users connect with you on other platforms.
@@ -155,58 +85,47 @@ To add links to other accounts:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. Edit the desired fields for external accounts:
+1. In the **Main settings** section, add your information from:
- Skype
- LinkedIn
- Twitter
1. Select **Update profile settings**.
-## Private contributions
+## Show private contributions on your user profile page
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/14078) in GitLab 11.3.
-Enabling private contributions includes contributions to private projects, in the user contribution calendar graph and user recent activity.
+In the user contribution calendar graph and recent activity list, you can show contributions to private projects.
-To enable private contributions:
+To show private contributions:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. Select the **Private contributions** checkbox.
+1. In the **Main settings** section, select the **Include private contributions on my profile** checkbox.
1. Select **Update profile settings**.
-## Current status
+## Set your current status
> Introduced in GitLab 11.2.
You can provide a custom status message for your user profile along with an emoji that describes it.
This may be helpful when you are out of office or otherwise not available.
-Other users can then take your status into consideration when responding to your issues or assigning work to you.
-Please be aware that your status is publicly visible even if your [profile is private](#private-profile).
-Status messages are restricted to 100 characters of plain text.
-They may however contain emoji codes such as `I'm on vacation :palm_tree:`.
+Your status is publicly visible even if your [profile is private](#make-your-user-profile-page-private).
To set your current status:
1. In the top-right corner, select your avatar.
-1. Select **Set status**, or **Edit status** if you have already set a status.
-1. Set the desired emoji and status message.
+1. Select **Set status** or, if you have already set a status, **Edit status**.
+1. Set the desired emoji and status message. Status messages must be plain text and 100 characters or less.
+ They can also contain emoji codes like, `I'm on vacation :palm_tree:`.
1. Select **Set status**. Alternatively, you can select **Remove status** to remove your user status entirely.
-or
-
-1. In the top-right corner, select your avatar.
-1. Select your name or username.
-1. Select the Edit profile icon (**{pencil}**).
-1. Enter your status message in the **Your status** text field.
-1. Select Add status emoji icon (**{slight-smile}**), and select the desired emoji.
-1. Select **Update profile settings**.
-
-You can also set your current status [using the API](../../api/users.md#user-status).
+You can also set your current status by [using the API](../../api/users.md#user-status).
-If you previously selected the **Busy** checkbox, remember to deselect it when you become available again.
+If you select the **Busy** checkbox, remember to clear it when you become available again.
-## Busy status indicator
+## Set a busy status indicator
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259649) in GitLab 13.6.
> - It was [deployed behind a feature flag](../feature_flags.md), disabled by default.
@@ -217,21 +136,37 @@ If you previously selected the **Busy** checkbox, remember to deselect it when y
To indicate to others that you are busy, you can set an indicator.
-![Busy status indicator](img/busy_status_indicator_v13_6.png)
-
To set the busy status indicator, either:
- Set it directly:
-
1. In the top-right corner, select your avatar.
- 1. Select **Set status**, or **Edit status** if you have already set a status.
+ 1. Select **Set status** or, if you have already set a status, **Edit status**.
1. Select the **Busy** checkbox.
- Set it on your profile:
-
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
- 1. Select the **Busy** checkbox.
+ 1. In the **Current status** section, select the **Busy** checkbox.
+
+ The busy status is displayed in the user interface.
+
+ Username:
+
+ | Profile page | Settings menu | User popovers |
+ | --- | --- | --- |
+ | ![Busy status - profile page](img/busy_indicator_profile_page_v13_6.png) | ![Busy status - settings menu](img/busy_indicator_settings_menu_v13_6.png) | ![Busy status - user popovers](img/busy_indicator_user_popovers_v13_6.png) |
+
+ Issue and merge request sidebar:
+
+ | Sidebar| Collapsed sidebar |
+ | --- | --- |
+ | ![Busy status - sidebar](img/busy_indicator_sidebar_v13_9.png) | ![Busy status - sidebar collapsed](img/busy_indicator_sidebar_collapsed_v13_9.png) |
+
+ Notes:
+
+ | Notes | Note headers |
+ | --- | --- |
+ | ![Busy status - notes](img/busy_indicator_notes_v13_9.png) | ![Busy status - note header](img/busy_indicator_note_header_v13_9.png) |
### Disable busy status feature
@@ -250,7 +185,7 @@ To enable it:
Feature.enable(:set_user_availability_status)
```
-## Commit email
+## Change the email displayed on your commits
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21598) in GitLab 11.4.
@@ -262,29 +197,27 @@ To change your commit email:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. Select the **Commit email** dropdown.
-1. Select any of the verified emails.
+1. In the **Commit email** list, select an email address.
1. Select **Update profile settings**.
-### Private commit email
+### Use an automatically-generated private commit email
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22560) in GitLab 11.5.
-GitLab provides the user with an automatically generated private commit email option,
-which allows the user to keep their email information private.
+GitLab provides an automatically-generated private commit email address,
+so you can keep your email information private.
-To enable this option:
+To use a private commit email:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. Select the **Commit email** dropdown.
-1. Select **Use a private email** option.
+1. In the **Commit email** list, select the **Use a private email** option.
1. Select **Update profile settings**.
-After this option is enabled, every Git-related action is performed using the private commit email.
+Every Git-related action uses the private commit email.
-To stay fully anonymous, you can also copy this private commit email
-and configure it on your local machine using the following command:
+To stay fully anonymous, you can also copy the private commit email
+and configure it on your local machine by using the following command:
```shell
git config --global user.email <your email address>
@@ -294,16 +227,16 @@ git config --global user.email <your email address>
### Why do I keep getting signed out?
-When signing in to the main GitLab application, a `_gitlab_session` cookie is
-set. `_gitlab_session` is cleared client-side when you close your browser
-and expires after "Application settings -> Session duration (minutes)"/`session_expire_delay`
+When you sign in to the main GitLab application, a `_gitlab_session` cookie is
+set. When you close your browser, the cookie is cleared client-side
+and it expires after "Application settings > Session duration (minutes)"/`session_expire_delay`
(defaults to `10080` minutes = 7 days) of no activity.
-When signing in to the main GitLab application, you can also check the
-**Remember me** option which sets the `remember_user_token`
-cookie (via [`devise`](https://github.com/heartcombo/devise)).
-`remember_user_token` expires after
-`config/initializers/devise.rb` -> `config.remember_for` (defaults to 2 weeks).
+When you sign in to the main GitLab application, you can also check the
+**Remember me** option. This sets the `remember_user_token`
+cookie via [`devise`](https://github.com/heartcombo/devise).
+The `remember_user_token` cookie expires after
+`config/initializers/devise.rb` -> `config.remember_for`. The default is 2 weeks.
When the `_gitlab_session` expires or isn't available, GitLab uses the `remember_user_token`
to get you a new `_gitlab_session` and keep you signed in through browser restarts.
@@ -339,3 +272,14 @@ The server continues to reset the TTL for that session, independent of whether 2
If you close your browser and open it up again, the `remember_user_token` cookie allows your user to reauthenticate itself.
Without the `config.extend_remember_period` flag, you would be forced to sign in again after two weeks.
+
+## Related topics
+
+- [Create users](account/create_accounts.md)
+- [Sign in to your GitLab account](../../topics/authentication/index.md)
+- [Receive emails for sign-ins from unknown IP addresses or devices](unknown_sign_in_notification.md)
+- Manage applications that can [use GitLab as an OAuth provider](../../integration/oauth_provider.md#introduction-to-oauth)
+- Manage [personal access tokens](personal_access_tokens.md) to access your account via API and authorized applications
+- Manage [SSH keys](../../ssh/README.md) to access your account via SSH
+- Change your [syntax highlighting theme](preferences.md#syntax-highlighting-theme)
+- [View your active sessions](active_sessions.md) and revoke any of them if necessary
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index 703154945db..4f28558cca6 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -206,7 +206,8 @@ epics:
| Failed pipeline | The author of the pipeline |
| Fixed pipeline ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1.) | The author of the pipeline. Enabled by default. |
| Merge merge request | |
-| Merge when pipeline succeeds ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4) | |
+| Merge when pipeline succeeds ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4) | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. `Note:` Custom notification level is ignored for Author, Watchers and Subscribers |
+| Merge request [marked as ready](../project/merge_requests/drafts.md) (introduced in [GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/15332)) | Watchers and participants |
| New comment | Participants, Watchers, Subscribers, and Custom notification level with this event selected, plus anyone mentioned by `@username` in the comment, with notification level "Mention" or higher |
| New epic | |
| New issue | |
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 99db0c4b898..d32971a7618 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -21,7 +21,7 @@ Personal access tokens expire on the date you define, at midnight UTC.
- GitLab runs a check at 01:00 AM UTC every day to identify personal access tokens that expire in under seven days. The owners of these tokens are notified by email.
- GitLab runs a check at 02:00 AM UTC every day to identify personal access tokens that expired on the current date. The owners of these tokens are notified by email.
- In GitLab Ultimate, administrators may [limit the lifetime of personal access tokens](../admin_area/settings/account_and_limit_settings.md#limiting-lifetime-of-personal-access-tokens).
-- In GitLab Ultimate, administrators may [toggle enforcement of personal access token expiry](../admin_area/settings/account_and_limit_settings.md#optional-enforcement-of-personal-access-token-expiry).
+- In GitLab Ultimate, administrators may [toggle enforcement of personal access token expiration](../admin_area/settings/account_and_limit_settings.md#optional-non-enforcement-of-personal-access-token-expiration).
For examples of how you can use a personal access token to authenticate with the API, see the following section from our [API Docs](../../api/README.md#personalproject-access-tokens).
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index 464edf13a7e..78900e145b7 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -58,12 +58,10 @@ Dark mode is available as a navigation theme, for MVC and compatibility reasons.
the future, we plan to make it configurable in its own section along with support for
[different navigation themes](https://gitlab.com/gitlab-org/gitlab/-/issues/219512).
-NOTE:
Dark theme only works with the **Dark** syntax highlighting theme.
## Syntax highlighting theme
-NOTE:
GitLab uses the [rouge Ruby library](http://rouge.jneen.net/ "Rouge website")
for syntax highlighting outside of any Editor context. The WebIDE (like Snippets)
uses [Monaco Editor](https://microsoft.github.io/monaco-editor/) and it's provided
@@ -88,11 +86,7 @@ The default syntax theme is White, and you can choose among 5 different themes:
![Profile preferences syntax highlighting themes](img/profile-preferences-syntax-themes.png)
-[Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in 13.0, the theme
-you choose also applies to the [Web IDE](../project/web_ide/index.md)'s code editor and [Snippets](../snippets.md).
-The themes are available only in the Web IDE file editor, except for the [dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/209808) and
-the [Solarized dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/219228),
-which apply to the entire Web IDE screen.
+Introduced in GitLab 13.6, the themes [Solarized](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) and [Monokai](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) also apply to the [Web IDE](../project/web_ide/index.md) and [Snippets](../snippets.md).
## Behavior
@@ -114,12 +108,13 @@ select few, the amount of activity on the default Dashboard page can be
overwhelming. Changing this setting allows you to redefine your default
dashboard.
-You have 8 options here that you can use for your default dashboard view:
+You can include the following options for your default dashboard view:
- Your projects (default)
- Starred projects
- Your projects' activity
- Starred projects' activity
+- Followed Users' Activity
- Your groups
- Your [To-Do List](../todos.md)
- Assigned Issues
diff --git a/doc/user/project/autocomplete_characters.md b/doc/user/project/autocomplete_characters.md
index 8d8ff942d05..aa8c21fc781 100644
--- a/doc/user/project/autocomplete_characters.md
+++ b/doc/user/project/autocomplete_characters.md
@@ -15,25 +15,24 @@ Markdown fields. When you start typing a word in a Markdown field with one of
the following characters, GitLab progressively autocompletes against a set of
matching values. The string matching is not case sensitive.
-| Character | Autocompletes |
-| :-------- | :------------ |
-| `~` | Labels |
-| `%` | Milestones |
-| `@` | Users and groups |
-| `#` | Issues |
-| `!` | Merge requests |
-| `&` | Epics |
-| `$` | Snippets |
-| `:` | Emoji |
-| `/` | Quick Actions |
-
-Up to 5 of the most relevant matches are displayed in a popup list. When you
-select an item from the list, the value is entered in the field. The more
-characters you enter, the more precise the matches are.
+| Character | Autocompletes | Relevant matches shown |
+| :-------- | :------------ | :---- |
+| `~` | Labels | 20 |
+| `%` | Milestones | 5 |
+| `@` | Users and groups | 10 |
+| `#` | Issues | 5 |
+| `!` | Merge requests | 5 |
+| `&` | Epics | 5 |
+| `$` | Snippets | 5 |
+| `:` | Emoji | 5 |
+| `/` | Quick Actions | 100 |
+
+When you select an item from the list, the value is entered in the field.
+The more characters you enter, the more precise the matches are.
Autocomplete characters are useful when combined with [Quick Actions](quick_actions.md).
-## Example
+## User autocomplete
Assume your GitLab instance includes the following users:
@@ -49,17 +48,9 @@ Assume your GitLab instance includes the following users:
<!-- vale gitlab.Spelling = YES -->
-In an Issue comment, entering `@l` results in the following popup list
-appearing. Note that user `shelba` is not included, because the list includes
-only the 5 users most relevant to the Issue.
-
-![Popup list which includes users whose username or name contains the letter `l`](img/autocomplete_characters_example1_v12_0.png)
-
-If you continue to type, `@le`, the popup list changes to the following. The
-popup now only includes users where `le` appears in their username, or a word in
-their name.
-
-![Popup list which includes users whose username or name contains the string](img/autocomplete_characters_example2_v12_0.png)
+User autocompletion sorts by the users whose username or name start with your query first.
+For example, typing `@lea` shows `leanna` first and typing `@ros` shows `Rosemarie Rogahn` and `Rosy Grant` first.
+Any usernames or names that include your query are shown afterwards in the autocomplete menu.
You can also search across the full name to find a user.
-To find `Rosy Grant`, even if their username is for example `hunter2`, you can type their full name without spaces like `@rosygrant`.
+To find `Rosy Grant`, even if their username is for example `alessandra`, you can type their full name without spaces like `@rosygrant`.
diff --git a/doc/user/project/badges.md b/doc/user/project/badges.md
index 7e6bba30001..783232ca7f9 100644
--- a/doc/user/project/badges.md
+++ b/doc/user/project/badges.md
@@ -19,7 +19,7 @@ project maintainers.
## Project badges
-Badges can be added to a project by Maintainers or Owners, and will then be visible on the project's overview page.
+Badges can be added to a project by Maintainers or Owners, and are visible on the project's overview page.
If you find that you have to add the same badges to several projects, you may want to add them at the [group level](#group-badges).
To add a new badge to a project:
@@ -52,7 +52,7 @@ To add this badge to a project:
## Group badges
-Badges can be added to a group and will then be visible on every project's
+Badges can be added to a group and are visible on every project's
overview page that's under that group. In this case, they cannot be edited or
deleted on the project level. If you need to have individual badges for each
project, consider adding them on the [project level](#project-badges) or use
@@ -75,7 +75,7 @@ Badges directly associated with a project can be configured on the
## Placeholders
The URL a badge points to, as well as the image URL, can contain placeholders
-which will be evaluated when displaying the badge. The following placeholders
+which are evaluated when displaying the badge. The following placeholders
are available:
- `%{project_path}`: Path of a project including the parent groups
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index eb6b8302667..e329ec4f903 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -140,13 +140,11 @@ To create and add a new Kubernetes cluster to your project, group, or instance:
1. Click **Review policy**.
1. Enter a suitable name for this policy, and click **Create Policy**. You can now close this window.
-1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an EKS management IAM role.
- To do so, follow the [Amazon EKS cluster IAM role](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html) instructions
- to create a IAM role suitable for managing the AWS EKS cluster's resources on your behalf.
+1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an **EKS IAM role** following the [Amazon EKS cluster IAM role instructions](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html). This role should exist so that Kubernetes clusters managed by Amazon EKS can make calls to other AWS services on your behalf to manage the resources that you use with the service.
In addition to the policies that guide suggests, you must also include the `AmazonEKSClusterPolicy`
policy for this role in order for GitLab to manage the EKS cluster correctly.
-1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an IAM role:
- 1. From the left panel, select **Roles**.
+1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create another IAM role which will be used by GitLab to authenticate with AWS. Follow these steps to create it:
+ 1. On the AWS IAM console, select **Roles** from the left panel.
1. Click **Create role**.
1. Under `Select type of trusted entity`, select **Another AWS account**.
1. Enter the Account ID from GitLab into the `Account ID` field.
@@ -326,7 +324,7 @@ If a default Storage Class doesn't already exist and is desired, follow Amazon's
to create one.
Alternatively, disable PostgreSQL by setting the project variable
-[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#environment-variables) to `false`.
+[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#cicd-variables) to `false`.
### Deploy the app to EKS
diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md
index d3d434762ab..aabda474043 100644
--- a/doc/user/project/clusters/index.md
+++ b/doc/user/project/clusters/index.md
@@ -58,7 +58,6 @@ Kubernetes version to any supported version at any time:
- 1.17 (support ends on September 22, 2021)
- 1.16 (support ends on July 22, 2021)
- 1.15 (support ends on May 22, 2021)
-- 1.14 (deprecated, support ends on December 22, 2020)
Some GitLab features may support versions outside the range provided here.
@@ -87,7 +86,7 @@ differentiates the new cluster from the rest.
When adding more than one Kubernetes cluster to your project, you need to differentiate
them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments/index.md) similar to how the
-[environment-specific variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables) work.
+[environment-specific CI/CD variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables) work.
The default environment scope is `*`, which means all jobs, regardless of their
environment, use that cluster. Each scope can be used only by a single cluster
@@ -201,7 +200,7 @@ To clear the cache:
You do not need to specify a base domain on cluster settings when using GitLab Serverless. The domain in that case
is specified as part of the Knative installation. See [Installing Applications](#installing-applications).
-Specifying a base domain automatically sets `KUBE_INGRESS_BASE_DOMAIN` as an environment variable.
+Specifying a base domain automatically sets `KUBE_INGRESS_BASE_DOMAIN` as an deployment variable.
If you are using [Auto DevOps](../../../topics/autodevops/index.md), this domain is used for the different
stages. For example, Auto Review Apps and Auto Deploy.
@@ -289,7 +288,7 @@ A Kubernetes cluster can be the destination for a deployment job. If
the cluster from your jobs using tools such as `kubectl` or `helm`.
- You don't use the GitLab cluster integration, you can still deploy to your
cluster. However, you must configure Kubernetes tools yourself
- using [environment variables](../../../ci/variables/README.md#custom-cicd-variables)
+ using [CI/CD variables](../../../ci/variables/README.md#custom-cicd-variables)
before you can interact with the cluster from your jobs.
### Deployment variables
@@ -313,9 +312,9 @@ following command in your deployment job script, for Kubernetes to access the re
The Kubernetes cluster integration exposes these
[deployment variables](../../../ci/variables/README.md#deployment-variables) in the
GitLab CI/CD build environment to deployment jobs. Deployment jobs have
-[defined a target environment](../../../ci/environments/index.md#defining-environments).
+[defined a target environment](../../../ci/environments/index.md).
-| Variable | Description |
+| Deployment Variable | Description |
|----------------------------|-------------|
| `KUBE_URL` | Equal to the API URL. |
| `KUBE_TOKEN` | The Kubernetes token of the [environment service account](add_remove_clusters.md#access-controls). Prior to GitLab 11.5, `KUBE_TOKEN` was the Kubernetes token of the main service account of the cluster integration. |
@@ -346,14 +345,14 @@ You can customize the deployment namespace in a few ways:
- For **non-managed** clusters, the auto-generated namespace is set in the `KUBECONFIG`,
but the user is responsible for ensuring its existence. You can fully customize
this value using
- [`environment:kubernetes:namespace`](../../../ci/environments/index.md#configuring-kubernetes-deployments)
+ [`environment:kubernetes:namespace`](../../../ci/environments/index.md#configure-kubernetes-deployments)
in `.gitlab-ci.yml`.
When you customize the namespace, existing environments remain linked to their current
namespaces until you [clear the cluster cache](#clearing-the-cluster-cache).
WARNING:
-By default, anyone who can create a deployment job can access any CI variable in
+By default, anyone who can create a deployment job can access any CI/CD variable in
an environment's deployment job. This includes `KUBECONFIG`, which gives access to
any secret available to the associated service account in your cluster.
To keep your production credentials safe, consider using
@@ -407,7 +406,7 @@ deployments, replica sets, and pods are annotated with:
- `app.gitlab.com/app: $CI_PROJECT_PATH_SLUG`
`$CI_ENVIRONMENT_SLUG` and `$CI_PROJECT_PATH_SLUG` are the values of
-the CI variables.
+the CI/CD variables.
You must be the project owner or have `maintainer` permissions to use terminals.
Support is limited to the first container in the first pod of your environment.
@@ -432,8 +431,8 @@ Reasons for failure include:
- The token you gave GitLab does not have [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles)
privileges required by GitLab.
-- Missing `KUBECONFIG` or `KUBE_TOKEN` variables. To be passed to your job, they must have a matching
- [`environment:name`](../../../ci/environments/index.md#defining-environments). If your job has no
+- Missing `KUBECONFIG` or `KUBE_TOKEN` deployment variables. To be passed to your job, they must have a matching
+ [`environment:name`](../../../ci/environments/index.md). If your job has no
`environment:name` set, the Kubernetes credentials are not passed to it.
NOTE:
diff --git a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
index 0c4ec72ed5b..d64ebfd9385 100644
--- a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
@@ -15,7 +15,7 @@ applications through GMAv2 exclusively when using Container Network Security.
The following steps are recommended to install and use Container Host Security through GitLab:
1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-new-group).
+1. [Create a group](../../../../group/#create-a-group).
1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
@@ -57,7 +57,7 @@ initial troubleshooting steps that resolve the most common problems:
1. If things still aren't working, a more assertive set of actions may help get things back to a
good state:
- - Stop and [delete the problematic environment](../../../../../ci/environments/#delete-environments-through-the-ui)
+ - Stop and [delete the problematic environment](../../../../../ci/environments/#delete-a-stopped-environment)
in GitLab.
- Delete the relevant namespace in Kubernetes by running
`kubectl delete namespaces <insert-some-namespace-name>` in your Kubernetes cluster.
diff --git a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
index e530f0dfcda..14db98c7ce7 100644
--- a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
@@ -15,7 +15,7 @@ applications through GMAv2 exclusively when using Container Network Security.
The following steps are recommended to install and use Container Network Security through GitLab:
1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-new-group).
+1. [Create a group](../../../../group/#create-a-group).
1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
@@ -131,7 +131,7 @@ initial troubleshooting steps that resolve the most common problems:
1. If things still aren't working, a more assertive set of actions may help get things back into a
good state:
- - Stop and [delete the problematic environment](../../../../../ci/environments/index.md#delete-environments-through-the-ui) in GitLab.
+ - Stop and [delete the problematic environment](../../../../../ci/environments/index.md#delete-a-stopped-environment) in GitLab.
- Delete the relevant namespace in Kubernetes by running `kubectl delete namespaces <insert-some-namespace-name>` in your Kubernetes cluster.
- Rerun the application project pipeline to redeploy the application.
diff --git a/doc/user/project/clusters/serverless/aws.md b/doc/user/project/clusters/serverless/aws.md
index 192a7c7cd39..f78fb2ed1ef 100644
--- a/doc/user/project/clusters/serverless/aws.md
+++ b/doc/user/project/clusters/serverless/aws.md
@@ -367,12 +367,11 @@ sam init -h
### Setting up your AWS credentials with your GitLab account
In order to interact with your AWS account, the GitLab CI/CD pipelines require both
-`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to be set in the project's CI/CD
-variables.
+`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to be set in the project's CI/CD variables.
To set these:
-1. Navigate to the project's **Settings > CI / CD**.
+1. Navigate to the project's **Settings > CI/CD**.
1. Expand the **Variables** section and create entries for `AWS_ACCESS_KEY_ID` and
`AWS_SECRET_ACCESS_KEY`.
1. Mask the credentials so they do not show in logs using the **Masked** toggle.
@@ -424,8 +423,8 @@ deploys your application. If your:
- Incompatible versions of software. For example, Python runtime version might be
different from the Python on the build machine. Address this by installing the
required versions of the software.
- - You may not be able to access your AWS account from GitLab. Check the environment
- variables you set up with AWS credentials.
+ - You may not be able to access your AWS account from GitLab. Check the CI/CD variables
+ you set up with AWS credentials.
- You may not have permission to deploy a serverless application. Make sure you
provide all required permissions to deploy a serverless application.
diff --git a/doc/user/project/clusters/serverless/index.md b/doc/user/project/clusters/serverless/index.md
index c7ed8d6d2a5..0f7f5e23e59 100644
--- a/doc/user/project/clusters/serverless/index.md
+++ b/doc/user/project/clusters/serverless/index.md
@@ -90,7 +90,7 @@ memory. **RBAC must be enabled.**
NOTE:
Running `kubectl` commands on your cluster requires setting up access to the cluster first.
For clusters created on GKE, see [GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl),
- for other platforms [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+ for other platforms [Install kubectl](https://kubernetes.io/docs/tasks/tools/).
1. The Ingress is now available at this address and routes incoming requests to the proper service based on the DNS
name in the request. To support this, a wildcard DNS record should be created for the desired domain name. For example,
@@ -396,7 +396,7 @@ kubectl create secret generic my-secrets -n "$KUBE_NAMESPACE" --from-literal MY_
#### Part of deployment job
-You can extend your `.gitlab-ci.yml` to create the secrets during deployment using the [environment variables](../../../../ci/variables/README.md)
+You can extend your `.gitlab-ci.yml` to create the secrets during deployment using the [CI/CD variables](../../../../ci/variables/README.md)
stored securely under your GitLab project.
```yaml
@@ -521,7 +521,7 @@ Running `kubectl` commands on your cluster requires setting up access to the
cluster first. For clusters created on:
- GKE, see [GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl)
-- Other platforms, see [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+- Other platforms, see [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/).
### Enable request log template
@@ -769,7 +769,7 @@ or with other versions of Python.
Running `kubectl` commands on your cluster requires setting up access to the cluster first.
For clusters created on GKE, see
[GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl).
- For other platforms, [install `kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+ For other platforms, [install `kubectl`](https://kubernetes.io/docs/tasks/tools/).
```shell
kubectl create --namespace istio-system secret tls istio-ingressgateway-certs \
diff --git a/doc/user/project/code_intelligence.md b/doc/user/project/code_intelligence.md
index 0e8c1bf8f4d..f1071af7c1f 100644
--- a/doc/user/project/code_intelligence.md
+++ b/doc/user/project/code_intelligence.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
@@ -19,10 +19,13 @@ Code Intelligence is built into GitLab and powered by [LSIF](https://lsif.dev/)
(Language Server Index Format), a file format for precomputed code
intelligence data.
+NOTE:
+You can automate this feature in your applications by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Configuration
Enable code intelligence for a project by adding a GitLab CI/CD job to the project's
-`.gitlab-ci.yml` which will generate the LSIF artifact:
+`.gitlab-ci.yml` which generates the LSIF artifact:
```yaml
code_navigation:
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 72695580d9d..368417ac00b 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -16,6 +16,10 @@ of the pods in the deployment. Developers and other teammates can view the
progress and status of a rollout, pod by pod, in the workflow they already use
without any need to access Kubernetes.
+NOTE:
+If you have a Kubernetes cluster, you can Auto Deploy applications to production
+environments by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Overview
With Deploy Boards you can gain more insight into deploys with benefits such as:
@@ -71,7 +75,7 @@ specific environment, there are a lot of use cases. To name a few:
To display the Deploy Boards for a specific [environment](../../ci/environments/index.md) you should:
-1. Have [defined an environment](../../ci/environments/index.md#defining-environments) with a deploy stage.
+1. Have [defined an environment](../../ci/environments/index.md) with a deploy stage.
1. Have a Kubernetes cluster up and running.
@@ -86,11 +90,11 @@ To display the Deploy Boards for a specific [environment](../../ci/environments/
[`kubernetes`](https://docs.gitlab.com/runner/executors/kubernetes.html) executor.
1. Configure the [Kubernetes integration](clusters/index.md) in your project for the
cluster. The Kubernetes namespace is of particular note as you need it
- for your deployment scripts (exposed by the `KUBE_NAMESPACE` environment variable).
+ for your deployment scripts (exposed by the `KUBE_NAMESPACE` deployment variable).
1. Ensure Kubernetes annotations of `app.gitlab.com/env: $CI_ENVIRONMENT_SLUG`
and `app.gitlab.com/app: $CI_PROJECT_PATH_SLUG` are applied to the
deployments, replica sets, and pods, where `$CI_ENVIRONMENT_SLUG` and
- `$CI_PROJECT_PATH_SLUG` are the values of the CI variables. This is so we can
+ `$CI_PROJECT_PATH_SLUG` are the values of the CI/CD variables. This is so we can
lookup the proper environment in a cluster/namespace which may have more
than one. These resources should be contained in the namespace defined in
the Kubernetes service setting. You can use an [Auto deploy](../../topics/autodevops/stages.md#auto-deploy) `.gitlab-ci.yml`
@@ -159,6 +163,6 @@ version of your application.
## Further reading
- [GitLab Auto deploy](../../topics/autodevops/stages.md#auto-deploy)
-- [GitLab CI/CD environment variables](../../ci/variables/README.md)
+- [GitLab CI/CD variables](../../ci/variables/README.md)
- [Environments and deployments](../../ci/environments/index.md)
- [Kubernetes deploy example](https://gitlab.com/gitlab-examples/kubernetes-deploy)
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index 6f05c40eefc..8606ce36a82 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -10,7 +10,7 @@ type: howto
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17894) in GitLab 10.7.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199370) from **Settings > Repository** in GitLab 12.9.
> - [Added `write_registry` scope](https://gitlab.com/gitlab-org/gitlab/-/issues/22743) in GitLab 12.10.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29280) from **Settings > CI / CD** in GitLab 12.10.1.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29280) from **Settings > CI/CD** in GitLab 12.10.1.
> - [Added package registry scopes](https://gitlab.com/gitlab-org/gitlab/-/issues/213566) in GitLab 13.0.
Deploy tokens allow you to download (`git clone`) or push and pull packages and
@@ -20,7 +20,7 @@ Deploy tokens can be managed by [maintainers only](../../permissions.md).
Deploy tokens cannot be used with the GitLab API.
-If you have a key pair, you might want to use [deploy keys](../../../ssh/README.md#deploy-keys)
+If you have a key pair, you might want to use [deploy keys](../../project/deploy_keys/index.md)
instead.
## Creating a Deploy Token
@@ -130,6 +130,22 @@ To pull packages in the GitLab package registry, you must:
1. For the [package type of your choice](../../packages/index.md), follow the
authentication instructions for deploy tokens.
+Example request publishing a generic package using a deploy token:
+
+```shell
+curl --header "DEPLOY-TOKEN: <deploy_token>" \
+ --upload-file path/to/file.txt \
+ "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?status=hidden"
+```
+
+Example response:
+
+```json
+{
+ "message":"201 Created"
+}
+```
+
### Push or upload packages
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213566) in GitLab 13.0.
@@ -169,7 +185,7 @@ apply consistently when cloning the repository of related projects.
There's a special case when it comes to Deploy Tokens. If a user creates one
named `gitlab-deploy-token`, the username and token of the Deploy Token is
-automatically exposed to the CI/CD jobs as environment variables: `CI_DEPLOY_USER`
+automatically exposed to the CI/CD jobs as CI/CD variables: `CI_DEPLOY_USER`
and `CI_DEPLOY_PASSWORD`, respectively.
After you create the token, you can sign in to the Container Registry by using
@@ -180,7 +196,6 @@ docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
```
NOTE:
-The special handling for the `gitlab-deploy-token` deploy token is not currently
-implemented for group deploy tokens. For the deploy token to be available for
-CI/CD jobs, it must be created at the project level. For details, see
-[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/214014).
+The special handling for the `gitlab-deploy-token` deploy token is not
+implemented for group deploy tokens. To make the group-level deploy token available for
+CI/CD jobs, use the workaround in [issue 214014](https://gitlab.com/gitlab-org/gitlab/-/issues/214014).
diff --git a/doc/user/project/description_templates.md b/doc/user/project/description_templates.md
index c56470ee07a..2267cb55f16 100644
--- a/doc/user/project/description_templates.md
+++ b/doc/user/project/description_templates.md
@@ -20,7 +20,7 @@ Every GitLab project can define its own set of description templates as they
are added to the root directory of a GitLab project's repository.
Description templates must be written in [Markdown](../markdown.md) and stored
-in your project's repository under a directory named `.gitlab`. Only the
+in your project's repository in the `.gitlab` directory. Only the
templates of the default branch are taken into account.
To learn how to create templates for various file types in groups, visit
@@ -28,19 +28,23 @@ To learn how to create templates for various file types in groups, visit
## Use cases
+These are some situations when you might find description templates useful:
+
+- You can create issues and merge request templates for different
+ stages of your workflow, for example, feature proposal, feature improvement, or a bug report.
- Add a template to be used in every issue for a specific project,
giving instructions and guidelines, requiring for information specific to that subject.
For example, if you have a project for tracking new blog posts, you can require the
- title, outlines, author name, author social media information, and so on.
+ title, outlines, author name, and author social media information.
- Following the previous example, you can make a template for every MR submitted
with a new blog post, requiring information about the post date, front matter data,
images guidelines, link to the related issue, reviewer name, and so on.
- You can also create issues and merge request templates for different
stages of your workflow, for example, feature proposal, feature improvement, or a bug report.
-- You can use an [issue description template](#creating-issue-templates) as a
+- You can use an [issue description template](#create-an-issue-template) as a
[Service Desk email template](service_desk.md#new-service-desk-issues).
-## Creating issue templates
+## Create an issue template
Create a new Markdown (`.md`) file inside the `.gitlab/issue_templates/`
directory in your repository. Commit and push to your default branch.
@@ -65,13 +69,13 @@ To create the `.gitlab/issue_templates` directory:
To check if this has worked correctly, [create a new issue](issues/managing_issues.md#create-a-new-issue)
and see if you can choose a description template.
-## Creating merge request templates
+## Create a merge request template
Similarly to issue templates, create a new Markdown (`.md`) file inside the
`.gitlab/merge_request_templates/` directory in your repository. Commit and
push to your default branch.
-## Using the templates
+## Use the templates
Let's take for example that you've created the file `.gitlab/issue_templates/Bug.md`.
This enables the `Bug` dropdown option when creating or editing issues. When
@@ -85,42 +89,85 @@ For example: `https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_templat
![Description templates](img/description_templates.png)
-## Setting a default template for merge requests and issues **(PREMIUM)**
+### Set an issue and merge request description template at group level **(PREMIUM)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled by default on GitLab.com.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to
+ [enable it](#enable-or-disable-issue-and-merge-request-description-templates-at-group-and-instance-level).
+
+Templates can be useful because you can create a template once and use it multiple times.
+To re-use templates [you've created](../project/description_templates.md#create-an-issue-template):
+
+1. Go to the group's **Settings > General > Templates**.
+1. From the dropdown, select your template project as the template repository at group level.
+
+![Group template settings](../group/img/group_file_template_settings.png)
+
+### Set an issue and merge request description template at instance level **(PREMIUM ONLY)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled by default on GitLab.com.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to
+ [enable it](#enable-or-disable-issue-and-merge-request-description-templates-at-group-and-instance-level).
+
+Similar to group templates, issue and merge request templates can also be set up at the instance level.
+This results in those templates being available in all projects within the instance.
+Only instance administrators can set instance-level templates.
+
+To set the instance-level description template repository:
+
+1. Select the **Admin Area** icon (**{admin}**).
+1. Go to **Settings > Templates**.
+1. From the dropdown, select your template project as the template repository at instance level.
+
+Learn more about [instance template repository](../admin_area/settings/instance_template_repository.md).
+
+![Setting templates in the Admin Area](../admin_area/settings/img/file_template_admin_area.png)
-> - Moved to GitLab Premium in 13.9.
+### Set a default template for merge requests and issues **(PREMIUM)**
The visibility of issues or merge requests should be set to either "Everyone
with access" or "Only Project Members" in your project's **Settings / Visibility, project features, permissions** section, otherwise the
template text areas don't show. This is the default behavior, so in most cases
you should be fine.
+To set a default description template for merge requests:
+
1. Go to your project's **Settings**.
-1. Click **Expand** under the **Merge requests** header.
+1. Select **Expand** under the **Merge requests** header.
1. Fill in the **Default description template for merge requests** text area.
-1. Click **Expand** under **Default issue template**.
+1. Select **Save changes**.
+
+To set a default description template for issues:
+
+1. Select **Expand** under **Default issue template**.
1. Fill in the **Default description template for issues** text area.
- Since GitLab merge request and issues support [Markdown](../markdown.md), you can use it to format
- headings, lists, and so on.
-![Default merge request description templates](img/description_templates_merge_request_settings.png)
+Because GitLab merge request and issues support [Markdown](../markdown.md), you can use it to format
+headings, lists, and so on.
-![Default issue description templates](img/description_templates_issue_settings.png)
+Now, every time a new merge request or issue is created, it's pre-filled with the text you entered
+in the templates.
-After you add the description, hit **Save changes** for the settings to take
-effect. Now, every time a new merge request or issue is created, it is
-pre-filled with the text you entered in the template(s).
+[GitLab versions 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/885)
+provide `issues_template` and `merge_requests_template` attributes in the
+[Projects API](../../api/projects.md) to help you keep your templates up to date.
## Description template example
-We make use of description templates for issues and merge requests in the GitLab project.
-For some examples, refer to the [`.gitlab` folder](https://gitlab.com/gitlab-org/gitlab/tree/master/.gitlab).
+We use description templates for issues and merge requests in the
+[`.gitlab` folder](https://gitlab.com/gitlab-org/gitlab/tree/master/.gitlab) of the
+GitLab project, which you can refer to for some examples.
NOTE:
It's possible to use [quick actions](quick_actions.md) in description templates to quickly add
labels, assignees, and milestones. The quick actions are only executed if the user submitting
the issue or merge request has the permissions to perform the relevant actions.
-Here is an example of a Bug report template:
+Here is an example of a bug report template:
```markdown
## Summary
@@ -159,3 +206,28 @@ it's very hard to read otherwise.)
/cc @project-manager
/assign @qa-tester
```
+
+## Enable or disable issue and merge request description templates at group and instance level
+
+Setting issue and merge request description templates at group and instance levels
+is under development and not ready for production use. It is deployed behind a
+feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:inherited_issuable_templates)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:inherited_issuable_templates)
+```
+
+The feature flag affects these features:
+
+- Setting a templates project as issue and merge request description templates source at group level.
+- Setting a templates project as issue and merge request description templates source at instance level.
diff --git a/doc/user/project/file_lock.md b/doc/user/project/file_lock.md
index 5c24ec6caf6..4edb6fbdad9 100644
--- a/doc/user/project/file_lock.md
+++ b/doc/user/project/file_lock.md
@@ -36,9 +36,9 @@ GitLab supports two different modes of file locking:
Locks can be created by any person who has at least
[Developer permissions](../permissions.md) to the repository.
-Only the user who locked the file or directory can edit locked files. Others
-users will be prevented from modifying locked files by pushing, merging,
-or any other means, and will be shown an error like: `The path '.gitignore' is
+Only the user who locked the file or directory can edit locked files. Other
+users are prevented from modifying locked files by pushing, merging,
+or any other means, and are shown an error like: `The path '.gitignore' is
locked by Administrator`.
## Exclusive file locks **(FREE)**
@@ -60,7 +60,7 @@ Before getting started, make sure you have [Git LFS installed](../../topics/git/
git-lfs --version
```
-If it doesn't recognize this command, you'll have to install it. There are
+If it doesn't recognize this command, you must install it. There are
several [installation methods](https://git-lfs.github.com/) that you can
choose according to your OS. To install it with Homebrew:
@@ -70,7 +70,7 @@ brew install git-lfs
Once installed, **open your local repository in a terminal window** and
install Git LFS in your repository. If you're sure that LFS is already installed,
-you can skip this step. If you're unsure, re-installing it won't do any harm:
+you can skip this step. If you're unsure, re-installing it does no harm:
```shell
git lfs install
@@ -84,14 +84,14 @@ You need [Maintainer permissions](../permissions.md) to configure
Exclusive File Locks for your project through the command line.
The first thing to do before using File Locking is to tell Git LFS which
-kind of files are lockable. The following command will store PNG files
+kind of files are lockable. The following command stores PNG files
in LFS and flag them as lockable:
```shell
git lfs track "*.png" --lockable
```
-After executing the above command a file named `.gitattributes` will be
+After executing the above command a file named `.gitattributes` is
created or updated with the following content:
```shell
@@ -110,9 +110,9 @@ implements the LFS File Locking API). To do that you can edit the
The `.gitattributes` file is key to the process and **must**
be pushed to the remote repository for the changes to take effect.
-After a file type has been registered as lockable, Git LFS will make
-them read-only on the file system automatically. This means you will
-need to **lock the file** before [editing it](#edit-lockable-files).
+After a file type has been registered as lockable, Git LFS makes
+them read-only on the file system automatically. This means you
+must **lock the file** before [editing it](#edit-lockable-files).
### Lock files
@@ -168,7 +168,7 @@ git lfs locks
The output lists the locked files followed by the user who locked each of them
and the files' IDs.
-On the repository file tree, GitLab will display an LFS badge for files
+On the repository file tree, GitLab displays an LFS badge for files
tracked by Git LFS plus a padlock icon on exclusively-locked files:
![LFS-Locked files](img/lfs_locked_files_v13_2.png)
@@ -176,7 +176,7 @@ tracked by Git LFS plus a padlock icon on exclusively-locked files:
You can also [view and remove existing locks](#view-and-remove-existing-locks) from the GitLab UI.
NOTE:
-When you rename an exclusively-locked file, the lock is lost. You'll have to
+When you rename an exclusively-locked file, the lock is lost. You must
lock it again to keep it locked.
### Edit lockable files
@@ -204,7 +204,7 @@ or higher tiers.
Default branch file and directory locks only apply to the default branch set in
the project's settings (usually `master`).
-Changes to locked files on the default branch will be blocked, including merge
+Changes to locked files on the default branch are blocked, including merge
requests that modify locked files. Unlock the file to allow changes.
### Lock a file or a directory
@@ -216,10 +216,10 @@ To lock a file:
![Locking file](img/file_lock.png)
-An **Unlock** button will be displayed if the file is already locked, and
-will be disabled if you do not have permission to unlock the file.
+An **Unlock** button is displayed if the file is already locked, and
+is disabled if you do not have permission to unlock the file.
-If you did not lock the file, hovering your cursor over the button will show
+If you did not lock the file, hovering your cursor over the button shows
who locked the file.
### View and remove existing locks
diff --git a/doc/user/project/git_attributes.md b/doc/user/project/git_attributes.md
index 2806f6e48d1..11d1db195e1 100644
--- a/doc/user/project/git_attributes.md
+++ b/doc/user/project/git_attributes.md
@@ -17,7 +17,7 @@ directory of your repository and push it to the default branch of your project.
## Encoding Requirements
The `.gitattributes` file _must_ be encoded in UTF-8 and _must not_ contain a
-Byte Order Mark. If a different encoding is used, the file's contents will be
+Byte Order Mark. If a different encoding is used, the file's contents are
ignored.
## Syntax Highlighting
diff --git a/doc/user/project/img/autocomplete_characters_example1_v12_0.png b/doc/user/project/img/autocomplete_characters_example1_v12_0.png
deleted file mode 100644
index 9c6fa923b80..00000000000
--- a/doc/user/project/img/autocomplete_characters_example1_v12_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/autocomplete_characters_example2_v12_0.png b/doc/user/project/img/autocomplete_characters_example2_v12_0.png
deleted file mode 100644
index b2e8a782a0b..00000000000
--- a/doc/user/project/img/autocomplete_characters_example2_v12_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.png b/doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.png
deleted file mode 100644
index fc2893aa4d5..00000000000
--- a/doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.png b/doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.png
new file mode 100644
index 00000000000..ee4ee2c6d71
--- /dev/null
+++ b/doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.png
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_protected_branch_v12_4.png b/doc/user/project/img/code_owners_approval_protected_branch_v12_4.png
deleted file mode 100644
index 59da6874d14..00000000000
--- a/doc/user/project/img/code_owners_approval_protected_branch_v12_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_protected_branch_v13_10.png b/doc/user/project/img/code_owners_approval_protected_branch_v13_10.png
new file mode 100644
index 00000000000..220eb207132
--- /dev/null
+++ b/doc/user/project/img/code_owners_approval_protected_branch_v13_10.png
Binary files differ
diff --git a/doc/user/project/img/description_templates_issue_settings.png b/doc/user/project/img/description_templates_issue_settings.png
deleted file mode 100644
index 7f354f7c288..00000000000
--- a/doc/user/project/img/description_templates_issue_settings.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/description_templates_merge_request_settings.png b/doc/user/project/img/description_templates_merge_request_settings.png
deleted file mode 100644
index 587367bf2fe..00000000000
--- a/doc/user/project/img/description_templates_merge_request_settings.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/issue_boards_remove_issue_v13_6.png b/doc/user/project/img/issue_boards_remove_issue_v13_6.png
deleted file mode 100644
index c980759ad0c..00000000000
--- a/doc/user/project/img/issue_boards_remove_issue_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index c135b1be54a..eb426a9f126 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -49,8 +49,9 @@ The steps you take depend on whether you are importing from GitHub.com or GitHub
[GitHub Rake task](../../../administration/raketasks/github_import.md) to import
projects without the constraints of a [Sidekiq](../../../development/sidekiq_style_guide.md) worker.
- If you're importing from GitHub Enterprise to your self-managed GitLab instance, you must first enable
- [GitHub integration](../../../integration/github.md). However, you cannot import projects from GitHub Enterprise to GitLab.com.
-- If you're importing from GitHub.com to your self-managed GitLab instance, you do not need to set up GitHub integration.
+ [GitHub integration](../../../integration/github.md).
+ - To import projects from GitHub Enterprise to GitLab.com, use the [Import API](../../../api/import.md).
+- If you're importing from GitHub.com to your self-managed GitLab instance, you do not need to set up GitHub integration. You can use the [Import API](../../../api/import.md).
## How it works
@@ -62,7 +63,7 @@ must meet one of the following conditions prior to the import:
- Have previously logged in to a GitLab account using the GitHub icon.
- Have a GitHub account with a publicly visible
- [primary email address](https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-a-user)
+ [primary email address](https://docs.github.com/en/rest/reference/users#get-a-user)
on their profile that matches their GitLab account's primary or secondary email address.
If a user referenced in the project is not found in the GitLab database, the project creator (typically the user
@@ -91,7 +92,7 @@ Before you begin, ensure that any GitHub users who you want to map to GitLab use
- A GitLab account that has logged in using the GitHub icon
\- or -
-- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-a-user) in the profile of the GitHub user
+- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/rest/reference/users#get-a-user) in the profile of the GitHub user
User-matching attempts occur in that order, and if a user is not identified either way, the activity is associated with
the user account that is performing the import.
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index a8ab1cbbb63..7e5801a2382 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -154,9 +154,7 @@ There are numerous [APIs](../../api/README.md) to use with your projects:
- [Aliases](../../api/project_aliases.md)
- [DORA4 Analytics](../../api/dora4_project_analytics.md)
-## DORA4 analytics overview **(ULTIMATE ONLY)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/279039) in GitLab [Ultimate](https://about.gitlab.com/pricing/) 13.7 as a [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta).
+## DORA4 analytics overview
Project details include the following analytics:
diff --git a/doc/user/project/integrations/bamboo.md b/doc/user/project/integrations/bamboo.md
index fb9314f7504..3b012ab4430 100644
--- a/doc/user/project/integrations/bamboo.md
+++ b/doc/user/project/integrations/bamboo.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Atlassian Bamboo CI Service
+# Atlassian Bamboo CI Service **(FREE)**
GitLab provides integration with Atlassian Bamboo for continuous integration.
When configured, pushes to a project trigger a build in Bamboo automatically.
diff --git a/doc/user/project/integrations/bugzilla.md b/doc/user/project/integrations/bugzilla.md
index 4e2ee9b3662..7e14515d98e 100644
--- a/doc/user/project/integrations/bugzilla.md
+++ b/doc/user/project/integrations/bugzilla.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Bugzilla Service
+# Bugzilla Service **(FREE)**
Navigate to the [Integrations page](overview.md#accessing-integrations),
select the **Bugzilla** service and fill in the required details as described
diff --git a/doc/user/project/integrations/custom_issue_tracker.md b/doc/user/project/integrations/custom_issue_tracker.md
index 143f0e2a25d..9cc4e980212 100644
--- a/doc/user/project/integrations/custom_issue_tracker.md
+++ b/doc/user/project/integrations/custom_issue_tracker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Custom Issue Tracker service
+# Custom Issue Tracker service **(FREE)**
To enable the Custom Issue Tracker integration in a project:
diff --git a/doc/user/project/integrations/discord_notifications.md b/doc/user/project/integrations/discord_notifications.md
index 8e0a167a968..624c0252f23 100644
--- a/doc/user/project/integrations/discord_notifications.md
+++ b/doc/user/project/integrations/discord_notifications.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Discord Notifications service
+# Discord Notifications service **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22684) in GitLab 11.6.
diff --git a/doc/user/project/integrations/emails_on_push.md b/doc/user/project/integrations/emails_on_push.md
index 2274913d349..4970e20974b 100644
--- a/doc/user/project/integrations/emails_on_push.md
+++ b/doc/user/project/integrations/emails_on_push.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Enabling emails on push
+# Enabling emails on push **(FREE)**
By enabling this service, you receive email notifications for every change
that is pushed to your project.
diff --git a/doc/user/project/integrations/github.md b/doc/user/project/integrations/github.md
index 5ef36ff4074..1c0309cab87 100644
--- a/doc/user/project/integrations/github.md
+++ b/doc/user/project/integrations/github.md
@@ -20,7 +20,7 @@ and is automatically configured on [GitHub import](../../../integration/github.m
### Complete these steps on GitHub
-This integration requires a [GitHub API token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token)
+This integration requires a [GitHub API token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
with `repo:status` access granted:
1. Go to your "Personal access tokens" page at <https://github.com/settings/tokens>
diff --git a/doc/user/project/integrations/hangouts_chat.md b/doc/user/project/integrations/hangouts_chat.md
index 06dcca6eb44..d0efebd4da7 100644
--- a/doc/user/project/integrations/hangouts_chat.md
+++ b/doc/user/project/integrations/hangouts_chat.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Hangouts Chat service
+# Hangouts Chat service **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/43756) in GitLab 11.2.
diff --git a/doc/user/project/integrations/hipchat.md b/doc/user/project/integrations/hipchat.md
index 7b90d8d7cfd..f66fc0a0f6a 100644
--- a/doc/user/project/integrations/hipchat.md
+++ b/doc/user/project/integrations/hipchat.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Atlassian HipChat
+# Atlassian HipChat **(FREE)**
GitLab provides a way to send HipChat notifications upon a number of events,
such as when a user pushes code, creates a branch or tag, adds a comment, and
diff --git a/doc/user/project/integrations/img/mattermost_config_help.png b/doc/user/project/integrations/img/mattermost_config_help.png
deleted file mode 100644
index dd3481bc1f6..00000000000
--- a/doc/user/project/integrations/img/mattermost_config_help.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_console_integrations.png b/doc/user/project/integrations/img/mattermost_console_integrations.png
deleted file mode 100644
index 625b57d4dc9..00000000000
--- a/doc/user/project/integrations/img/mattermost_console_integrations.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_goto_console.png b/doc/user/project/integrations/img/mattermost_goto_console.png
deleted file mode 100644
index 8bacbe485f4..00000000000
--- a/doc/user/project/integrations/img/mattermost_goto_console.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_slash_command_configuration.png b/doc/user/project/integrations/img/mattermost_slash_command_configuration.png
deleted file mode 100644
index f9e9de439ca..00000000000
--- a/doc/user/project/integrations/img/mattermost_slash_command_configuration.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_slash_command_token.png b/doc/user/project/integrations/img/mattermost_slash_command_token.png
deleted file mode 100644
index c38f37c203c..00000000000
--- a/doc/user/project/integrations/img/mattermost_slash_command_token.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_team_integrations.png b/doc/user/project/integrations/img/mattermost_team_integrations.png
deleted file mode 100644
index c2b68256e11..00000000000
--- a/doc/user/project/integrations/img/mattermost_team_integrations.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/index.md b/doc/user/project/integrations/index.md
index 0e5163e992a..5628a9bc5e5 100644
--- a/doc/user/project/integrations/index.md
+++ b/doc/user/project/integrations/index.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project integrations
+# Project integrations **(FREE)**
You can find the available integrations under your project's
**Settings > Integrations** page. You need to have at least
diff --git a/doc/user/project/integrations/irker.md b/doc/user/project/integrations/irker.md
index 58f7ea3279f..e75561b3ddb 100644
--- a/doc/user/project/integrations/irker.md
+++ b/doc/user/project/integrations/irker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Irker IRC Gateway
+# Irker IRC Gateway **(FREE)**
GitLab provides a way to push update messages to an Irker server. When
configured, pushes to a project trigger the service to send data directly
diff --git a/doc/user/project/integrations/jira.md b/doc/user/project/integrations/jira.md
index 5857c3da803..0878e1c9386 100644
--- a/doc/user/project/integrations/jira.md
+++ b/doc/user/project/integrations/jira.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Jira integration
+# GitLab Jira integration **(FREE)**
You can use Jira to track work implemented in GitLab. The Jira integration with GitLab makes the
process of working across these systems more efficient.
diff --git a/doc/user/project/integrations/jira_cloud_configuration.md b/doc/user/project/integrations/jira_cloud_configuration.md
index e9f30f32308..8e25af3f884 100644
--- a/doc/user/project/integrations/jira_cloud_configuration.md
+++ b/doc/user/project/integrations/jira_cloud_configuration.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create an API token in Jira on Atlassian cloud
+# Create an API token in Jira on Atlassian cloud **(FREE)**
For [integrations with Jira](jira.md), an API token is needed when integrating with Jira
on Atlassian cloud. To create an API token:
diff --git a/doc/user/project/integrations/jira_integrations.md b/doc/user/project/integrations/jira_integrations.md
index 6a1529f001a..6b938238320 100644
--- a/doc/user/project/integrations/jira_integrations.md
+++ b/doc/user/project/integrations/jira_integrations.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Jira integrations
+# Jira integrations **(FREE)**
GitLab can be integrated with [Jira](https://www.atlassian.com/software/jira).
diff --git a/doc/user/project/integrations/jira_server_configuration.md b/doc/user/project/integrations/jira_server_configuration.md
index 5bb17388a1e..b1ab2076dc0 100644
--- a/doc/user/project/integrations/jira_server_configuration.md
+++ b/doc/user/project/integrations/jira_server_configuration.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create Jira Server username and password
+# Create Jira Server username and password **(FREE)**
For [integrations with Jira](jira.md), you must create a user account in Jira to have access to
all projects that need to integrate with GitLab.
diff --git a/doc/user/project/integrations/mattermost.md b/doc/user/project/integrations/mattermost.md
index db190f47b01..6a93fc0fb06 100644
--- a/doc/user/project/integrations/mattermost.md
+++ b/doc/user/project/integrations/mattermost.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mattermost Notifications Service
+# Mattermost Notifications Service **(FREE)**
The Mattermost Notifications Service allows your GitLab project to send events (e.g., `issue created`) to your existing Mattermost team as notifications. This requires configurations in both Mattermost and GitLab.
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index 6c8a0ded2ae..20f5b73b37c 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -4,118 +4,121 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mattermost slash commands
+# Mattermost slash commands **(FREE)**
-> Introduced in GitLab 8.14
+If your team uses [Mattermost](https://mattermost.com/) as a chat service, you can
+integrate GitLab commands into Mattermost chat. This integration enables users to
+run common operations, such as creating a GitLab issue, from the Mattermost chat
+environment.
-Mattermost commands give users an extra interface to perform common operations
-from the chat environment. This allows one to, for example, create an issue as
-soon as the idea was discussed in Mattermost.
-
-GitLab can also send events (e.g., `issue created`) to Mattermost as notifications.
-This is the separately configured [Mattermost Notifications Service](mattermost.md).
+GitLab can also send events (such as `issue created`) to Mattermost as part of the
+separately configured [Mattermost Notifications Service](mattermost.md).
## Prerequisites
-Mattermost 3.4 and up is required.
+Mattermost [3.4 or later](https://mattermost.com/blog/category/releases/) is required.
+GitLab provides different methods of configuring Mattermost slash commands, depending
+on your configuration:
-If you have the Omnibus GitLab package installed, Mattermost is already bundled
-in it. All you have to do is configure it. Read more in the
-[Omnibus GitLab Mattermost documentation](https://docs.gitlab.com/omnibus/gitlab-mattermost/).
+- **Omnibus GitLab installations**: Mattermost is bundled with
+ [Omnibus GitLab](https://docs.gitlab.com/omnibus/). To configure Mattermost for Omnibus GitLab, read the
+ [Omnibus GitLab Mattermost documentation](https://docs.gitlab.com/omnibus/gitlab-mattermost/).
+- **If Mattermost is installed on the same server as GitLab**, use the
+ [automated configuration](#automated-configuration).
+- **For all other installations**, use the [manual configuration](#manual-configuration).
## Automated configuration
If Mattermost is installed on the same server as GitLab, the configuration process can be
done for you by GitLab.
-Go to the Mattermost Slash Command service on your project and click the 'Add to Mattermost' button.
+Go to the Mattermost Slash Command service on your project and click **Add to Mattermost** button.
## Manual configuration
-The configuration consists of two parts. First you need to enable the slash
-commands in Mattermost and then enable the service in GitLab.
-
-### Step 1. Enable custom slash commands in Mattermost
-
-This step is only required when using a source install. Omnibus installs are
-preconfigured with the right settings.
-
-The first thing to do in Mattermost is to enable custom slash commands from
-the administrator console.
-
-1. Log in with an account that has administrator privileges and navigate to the system
- console.
-
- ![Mattermost go to console](img/mattermost_goto_console.png)
-
-1. Click **Integration Management** and set **Enable Custom Slash Commands**,
- **Enable integrations to override usernames**, and **Enable
- integrations to override profile picture icons** to true
+To manually configure slash commands in Mattermost, you must:
- ![Mattermost console](img/mattermost_console_integrations.png)
+1. [Enable custom slash commands](#enable-custom-slash-commands) in Mattermost.
+1. [Get configuration values](#get-configuration-values-from-gitlab) from GitLab.
+1. [Create a new slash command](#create-a-slash-command) in Mattermost.
+1. [Provide the Mattermost token](#provide-the-mattermost-token-to-gitlab) to GitLab.
-1. Click **Save** at the bottom to save the changes.
+### Enable custom slash commands
-### Step 2. Open the Mattermost slash commands service in GitLab
+NOTE:
+Omnibus GitLab installations are preconfigured. This step is required only for
+installations from source.
-1. Open a new tab for GitLab, go to your project's
- [Integrations page](overview.md#accessing-integrations)
- and select the **Mattermost command** service to configure it.
- A screen appears with all the values you need to copy in Mattermost as
- described in the next step. Leave the window open.
+To enable custom slash commands from the Mattermost administrator console:
- NOTE:
- GitLab offers some values for the Mattermost settings. Only **Request URL** is required
- as offered, all the others are just suggestions.
+1. Sign in to Mattermost as a user with administrator privileges.
+1. Next to your username, click the **{ellipsis_v}** **Settings** icon, and
+ select **System Console**.
+1. Select **Integration Management**, and set these values to `TRUE`:
+ - **Enable Custom Slash Commands**
+ - **Enable integrations to override usernames**
+ - **Enable integrations to override profile picture icons**
+1. Click **Save**, but do not close this browser tab, because you need it in
+ a later step.
- ![Mattermost setup instructions](img/mattermost_config_help.png)
+### Get configuration values from GitLab
-1. Proceed to the next step and create a slash command in Mattermost with the
- above values.
+After you enable custom slash commands in Mattermost, you need configuration
+information from GitLab. To get this information:
-### Step 3. Create a new custom slash command in Mattermost
+1. In a different browser tab than your current Mattermost session, sign in to
+ GitLab as a user with [administrator permissions](../../permissions.md).
+1. In the top navigation bar, go to **{admin}** **Admin Area**.
+1. In the left menu, go to **Settings > Integrations** and select
+ **Mattermost slash commands**.
+1. GitLab displays potential values for Mattermost settings. Copy the **Request URL**
+ as you need it for the next step. All other values are suggestions.
+1. Do not close this browser tab, because you need it in future steps.
-Now that you have enabled custom slash commands in Mattermost and opened
-the Mattermost slash commands service in GitLab, it's time to copy these values
-in a new slash command.
+Next, create a slash command in Mattermost with the values from GitLab.
-1. Back to Mattermost, under your team page settings, you should see the
- **Integrations** option.
+### Create a slash command
- ![Mattermost team integrations](img/mattermost_team_integrations.png)
+To create a slash command, you need the values you obtained from GitLab in
+the previous step:
-1. Go to the **Slash Commands** integration and add a new one by clicking the
- **Add Slash Command** button.
+1. In the Mattermost tab you left open when you
+ [enabled custom slash commands](#enable-custom-slash-commands), go to your
+ team page.
+1. Click the **{ellipsis_v}** **Settings** icon, and select **Integrations**.
+1. In the left menu, select **Slash commands**.
+1. Click **Add Slash Command**:
![Mattermost add command](img/mattermost_add_slash_command.png)
-
-1. Fill in the options for the custom command as described in
- [step 2](#step-2-open-the-mattermost-slash-commands-service-in-gitlab).
-
- NOTE:
- If you plan on connecting multiple projects, pick a slash command trigger
- word that relates to your projects such as `/gitlab-project-name` or even
- just `/project-name`. Only use `/gitlab` if you plan to only connect a single
- project to your Mattermost team.
-
- ![Mattermost add command configuration](img/mattermost_slash_command_configuration.png)
-
-1. After you set up all the values, copy the token (we use it below) and
- click **Done**.
-
- ![Mattermost slash command token](img/mattermost_slash_command_token.png)
-
-### Step 4. Copy the Mattermost token into the Mattermost slash command service
-
-1. In GitLab, paste the Mattermost token you copied in the previous step and
+1. Provide a **Display Name** and **Description** for your new command.
+1. Provide a **Command Trigger Word** according to your application's configuration:
+
+ - **If you intend to only connect one project to your Mattermost team**: Use
+ `/gitlab` for your trigger word.
+ - **If you intend to connect multiple projects**: Use a trigger word that relates
+ to your project, such as `/project-name` or `/gitlab-project-name`.
+1. For **Request URL**, provide the value you copied from GitLab when you
+ [viewed configuration values](#get-configuration-values-from-gitlab).
+1. For all other values, you may use the suggestions from GitLab or use your
+ preferred values.
+1. Copy the **Token** value, as you need it in a later step, and click **Done**.
+
+### Provide the Mattermost token to GitLab
+
+When you create a new slash command in Mattermost, it generates a token you must
+provide to GitLab:
+
+1. In the GitLab browser tab from
+ [getting configuration values from GitLab](#get-configuration-values-from-gitlab),
+ select the **Active** check box to enable this configuration.
+1. In the **Token** field, paste the token you obtained from Mattermost.
ensure that the **Active** toggle is enabled.
![Mattermost copy token to GitLab](img/mattermost_gitlab_token.png)
1. Click **Save changes** for the changes to take effect.
-You are now set to start using slash commands in Mattermost that talk to the
-GitLab project you configured.
+Your slash command can now communicate with your GitLab project.
## Authorizing Mattermost to interact with GitLab
@@ -132,7 +135,7 @@ GitLab using the Mattermost commands.
## Available slash commands
-The available slash commands are:
+The available slash commands for Mattermost are:
| Command | Description | Example |
| ------- | ----------- | ------- |
@@ -152,7 +155,7 @@ the [permissions you have on the project](../../permissions.md#project-members-p
## Troubleshooting
-If an event is not being triggered, confirm that the channel you're using is a public one, as
+If an event is not being triggered, confirm that the channel you're using is a public one.
Mattermost webhooks do not have access to private channels.
If a private channel is required, you can edit the webhook's channel in Mattermost and
diff --git a/doc/user/project/integrations/microsoft_teams.md b/doc/user/project/integrations/microsoft_teams.md
index 136da05d0e8..41e0938fc3b 100644
--- a/doc/user/project/integrations/microsoft_teams.md
+++ b/doc/user/project/integrations/microsoft_teams.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Microsoft Teams service
+# Microsoft Teams service **(FREE)**
## On Microsoft Teams
diff --git a/doc/user/project/integrations/mock_ci.md b/doc/user/project/integrations/mock_ci.md
index 18f0ad6b275..934510fd155 100644
--- a/doc/user/project/integrations/mock_ci.md
+++ b/doc/user/project/integrations/mock_ci.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mock CI Service
+# Mock CI Service **(FREE)**
**NB: This service is only listed if you are in a development environment!**
diff --git a/doc/user/project/integrations/overview.md b/doc/user/project/integrations/overview.md
index b22a7c0295e..f6590b6ba2f 100644
--- a/doc/user/project/integrations/overview.md
+++ b/doc/user/project/integrations/overview.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrations
+# Integrations **(FREE)**
Integrations allow you to integrate GitLab with other applications. They
are a bit like plugins in that they allow a lot of freedom in adding
diff --git a/doc/user/project/integrations/prometheus_library/cloudwatch.md b/doc/user/project/integrations/prometheus_library/cloudwatch.md
index 4a88010a343..04abb922175 100644
--- a/doc/user/project/integrations/prometheus_library/cloudwatch.md
+++ b/doc/user/project/integrations/prometheus_library/cloudwatch.md
@@ -6,31 +6,38 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Monitoring AWS resources **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12621) in GitLab 9.4
-
-GitLab has support for automatically detecting and monitoring AWS resources, starting with the [Elastic Load Balancer](https://aws.amazon.com/elasticloadbalancing/). This is provided by leveraging the official [Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter), which translates [Cloudwatch metrics](https://aws.amazon.com/cloudwatch/) into a Prometheus readable form.
+GitLab supports automatically detecting and monitoring AWS resources, starting
+with the [Elastic Load Balancer](https://aws.amazon.com/elasticloadbalancing/) (ELB).
+This is provided by leveraging the official [Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter), which translates [Cloudwatch metrics](https://aws.amazon.com/cloudwatch/) into
+a Prometheus readable form.
## Requirements
-The [Prometheus service](../prometheus.md) must be enabled.
+You must enable the [Prometheus service](../prometheus.md).
-## Metrics supported
+## Supported metrics
-| Name | Query |
-| ---- | ----- |
+| Name | Query |
+|----------------------|-------|
| Throughput (req/sec) | `sum(aws_elb_request_count_sum{%{environment_filter}}) / 60` |
-| Latency (ms) | `avg(aws_elb_latency_average{%{environment_filter}}) * 1000` |
-| HTTP Error Rate (%) | `sum(aws_elb_httpcode_backend_5_xx_sum{%{environment_filter}}) / sum(aws_elb_request_count_sum{%{environment_filter}})` |
+| Latency (ms) | `avg(aws_elb_latency_average{%{environment_filter}}) * 1000` |
+| HTTP Error Rate (%) | `sum(aws_elb_httpcode_backend_5_xx_sum{%{environment_filter}}) / sum(aws_elb_request_count_sum{%{environment_filter}})` |
## Configuring Prometheus to monitor for Cloudwatch metrics
-To get started with Cloudwatch monitoring, you should install and configure the [Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter) which retrieves and parses the specified Cloudwatch metrics and translates them into a Prometheus monitoring endpoint.
+To get started with Cloudwatch monitoring, install and configure the
+[Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter). The
+Cloudwatch exporter retrieves and parses the specified Cloudwatch metrics, and
+translates them into a Prometheus monitoring endpoint.
-Right now, the only AWS resource supported is the Elastic Load Balancer, whose Cloudwatch metrics are [documented here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html).
+The only supported AWS resource is the Elastic Load Balancer, whose Cloudwatch
+metrics are [documented here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html).
-A sample Cloudwatch Exporter configuration file, configured for basic AWS ELB monitoring, is [available for download](../samples/cloudwatch.yml).
+You can [download a sample Cloudwatch Exporter configuration file](../samples/cloudwatch.yml)
+that's configured for basic AWS ELB monitoring.
## Specifying the Environment label
-In order to isolate and only display relevant metrics for a given environment
-however, GitLab needs a method to detect which labels are associated. To do this, GitLab [looks for an `environment` label](index.md#identifying-environments).
+To isolate and display only the relevant metrics for a given environment,
+GitLab needs a method to detect which labels are associated. To do this, GitLab
+[looks for an `environment` label](index.md#identifying-environments).
diff --git a/doc/user/project/integrations/redmine.md b/doc/user/project/integrations/redmine.md
index 38d6194b390..256ffe84ee2 100644
--- a/doc/user/project/integrations/redmine.md
+++ b/doc/user/project/integrations/redmine.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Redmine Service
+# Redmine Service **(FREE)**
1. To enable the Redmine integration in a project, navigate to the
[Integrations page](overview.md#accessing-integrations), click
diff --git a/doc/user/project/integrations/servicenow.md b/doc/user/project/integrations/servicenow.md
index 1de69f60a34..bdc05552c31 100644
--- a/doc/user/project/integrations/servicenow.md
+++ b/doc/user/project/integrations/servicenow.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# ServiceNow integration
+# ServiceNow integration **(FREE)**
ServiceNow offers several integrations to help centralize and automate your
management of GitLab workflows.
diff --git a/doc/user/project/integrations/services_templates.md b/doc/user/project/integrations/services_templates.md
index 7507792bb02..66810d8a01b 100644
--- a/doc/user/project/integrations/services_templates.md
+++ b/doc/user/project/integrations/services_templates.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Service templates
+# Service templates **(FREE)**
WARNING:
Service templates are [deprecated and scheduled to be removed](https://gitlab.com/gitlab-org/gitlab/-/issues/268032)
diff --git a/doc/user/project/integrations/slack.md b/doc/user/project/integrations/slack.md
index ab798675278..17d1c3adcb5 100644
--- a/doc/user/project/integrations/slack.md
+++ b/doc/user/project/integrations/slack.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Slack Notifications Service
+# Slack Notifications Service **(FREE)**
The Slack Notifications Service allows your GitLab project to send events
(such as issue creation) to your existing Slack team as notifications. Setting up
diff --git a/doc/user/project/integrations/unify_circuit.md b/doc/user/project/integrations/unify_circuit.md
index e8dcb577aba..3e5e368722e 100644
--- a/doc/user/project/integrations/unify_circuit.md
+++ b/doc/user/project/integrations/unify_circuit.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Unify Circuit service
+# Unify Circuit service **(FREE)**
The Unify Circuit service sends notifications from GitLab to the conversation for which the webhook was created.
diff --git a/doc/user/project/integrations/webex_teams.md b/doc/user/project/integrations/webex_teams.md
index 8a3383fd0e7..6820412808f 100644
--- a/doc/user/project/integrations/webex_teams.md
+++ b/doc/user/project/integrations/webex_teams.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Webex Teams service
+# Webex Teams service **(FREE)**
You can configure GitLab to send notifications to a Webex Teams space.
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index 0cf01adef13..bf289c9707c 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Webhooks
+# Webhooks **(FREE)**
Project webhooks allow you to trigger a percent-encoded URL if, for example, new code is pushed or
a new issue is created. You can configure webhooks to listen for specific events
@@ -1133,6 +1133,10 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
+ },
+ "environment": {
+ "name": "production",
+ "action": "start"
}
},
{
@@ -1167,7 +1171,8 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
- }
+ },
+ "environment": null
},
{
"id": 378,
@@ -1200,7 +1205,8 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
- }
+ },
+ "environment": null
},
{
"id": 376,
@@ -1233,7 +1239,8 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
- }
+ },
+ "environment": null
},
{
"id": 379,
@@ -1257,6 +1264,10 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
+ },
+ "environment": {
+ "name": "staging",
+ "action": "start"
}
}
]
@@ -1329,7 +1340,8 @@ X-Gitlab-Event: Job Hook
"linux",
"docker"
]
- }
+ },
+ "environment": null
}
```
@@ -1554,7 +1566,7 @@ X-Gitlab-Event: Subgroup Hook
```
NOTE:
-Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transferring-groups)
+Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transfer-a-group)
### Feature Flag events
diff --git a/doc/user/project/integrations/youtrack.md b/doc/user/project/integrations/youtrack.md
index f9b3c083a54..f9f61de9d6b 100644
--- a/doc/user/project/integrations/youtrack.md
+++ b/doc/user/project/integrations/youtrack.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# YouTrack Service
+# YouTrack Service **(FREE)**
JetBrains [YouTrack](https://www.jetbrains.com/help/youtrack/standalone/YouTrack-Documentation.html) is a web-based issue tracking and project management platform.
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index e4f42b97b84..a537972dff7 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -87,9 +87,9 @@ To delete the currently active issue board:
You can tailor GitLab issue boards to your own preferred workflow.
Here are some common use cases for issue boards.
-For examples of using issue boards along with [epics](../group/epics/index.md) **(PREMIUM)**,
-[issue health status](issues/index.md#health-status) **(ULTIMATE)**, and
-[scoped labels](labels.md#scoped-labels) **(PREMIUM)** for various Agile frameworks, check:
+For examples of using issue boards along with [epics](../group/epics/index.md),
+[issue health status](issues/index.md#health-status), and
+[scoped labels](labels.md#scoped-labels) for various Agile frameworks, check:
- The [How to use GitLab for Agile portfolio planning and project management](https://about.gitlab.com/blog/2020/11/11/gitlab-for-agile-portfolio-planning-project-management/) blog post (November 2020)
- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -154,7 +154,7 @@ for them.
NOTE:
For a broader use case, please see the blog post
-[GitLab Workflow, an Overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/#gitlab-workflow-use-case-scenario).
+[GitLab Workflow, an Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
For a real use case example, you can read why
[Codepen decided to adopt issue boards](https://about.gitlab.com/blog/2017/01/27/codepen-welcome-to-gitlab/#project-management-everything-in-one-place)
to improve their workflow with multiple boards.
@@ -277,6 +277,32 @@ group and its descendant subgroups. Similarly, you can only filter by group labe
boards. When updating milestones and labels for an issue through the sidebar update mechanism, again only
group-level objects are available.
+#### GraphQL-based sidebar for group issue boards **(PREMIUM)**
+
+<!-- When the feature flag is removed, integrate this section into the above ("Group issue boards"). -->
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285074) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-graphql-based-sidebar-for-group-issue-boards). **(PREMIUM SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+The work-in-progress GraphQL-based sidebar for group issue boards brings better performance and the
+ability to edit issue titles in the issue sidebar.
+
+To **edit an issue's title** in the issue sidebar:
+
+1. In a group issue board, select the issue card. The issue sidebar opens on the right.
+1. Next to the issue's title, select **Edit**.
+
+This is work in progress as of GitLab 13.9. Learn more about the known issues in
+[MR 51480](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51480).
+
+<!-- Add this at the end of the file -->
+
### Assignee lists **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5784) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.0.
@@ -317,6 +343,7 @@ As in other list types, click the trash icon to remove a list.
> - Grouping by epic [introduced](https://gitlab.com/groups/gitlab-org/-/epics/3352) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.6.
> - Editing issue titles in the issue sidebar [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232745) in GitLab 13.8.
+> - Editing iteration in the issue sidebar [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/290232) in GitLab 13.9.
With swimlanes you can visualize issues grouped by epic.
Your issue board keeps all the other features, but with a different visual organization of issues.
@@ -456,31 +483,16 @@ the list by filtering by the following:
- Release
- Weight
-#### Enable or disable adding issues to the list **(FREE SELF)**
-
-Adding issues to the list is deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:add_issues_button)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:add_issues_button)
-```
-
### Remove an issue from a list
-Removing an issue from a list can be done by clicking the issue card and then
-clicking the **Remove from board** button in the sidebar. The
-respective label is removed.
+> The **Remove from board** button was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/229507) in GitLab 13.10.
+
+When an issue should no longer belong to a list, you can remove it.
+The steps depend on the scope of the list:
-![Remove issue from list](img/issue_boards_remove_issue_v13_6.png)
+1. To open the right sidebar, select the issue card.
+1. Remove what's keeping the issue in the list.
+ If it's a label list, remove the label. If it's an [assignee list](#assignee-lists), unassign the user.
### Filter issues
@@ -593,3 +605,40 @@ A few things to remember:
- For performance and visibility reasons, each list shows the first 20 issues
by default. If you have more than 20 issues, start scrolling down and the next
20 appear.
+
+## Enable or disable GraphQL-based sidebar for group issue boards **(PREMIUM SELF)**
+
+GraphQL-based sidebar for group issue boards is under development and not ready for production use.
+It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:graphql_board_lists)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:graphql_board_lists)
+```
+
+## Enable or disable adding issues to the list **(FREE SELF)**
+
+Adding issues to the list is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:add_issues_button)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:add_issues_button)
+```
diff --git a/doc/user/project/issues/associate_zoom_meeting.md b/doc/user/project/issues/associate_zoom_meeting.md
index d81fe19c5b9..f98e94c66ae 100644
--- a/doc/user/project/issues/associate_zoom_meeting.md
+++ b/doc/user/project/issues/associate_zoom_meeting.md
@@ -17,7 +17,7 @@ team members can join swiftly without requesting a link.
## Adding a Zoom meeting to an issue
To associate a Zoom meeting with an issue, you can use GitLab
-[quick actions](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+[quick actions](../quick_actions.md#issues-merge-requests-and-epics).
In an issue, leave a comment using the `/zoom` quick action followed by a valid Zoom link:
diff --git a/doc/user/project/issues/design_management.md b/doc/user/project/issues/design_management.md
index b6dff0842d8..f5eb8dd5a4d 100644
--- a/doc/user/project/issues/design_management.md
+++ b/doc/user/project/issues/design_management.md
@@ -257,6 +257,6 @@ This will be rendered as:
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/225205) in GitLab 13.2.
User activity events on designs (creation, deletion, and updates) are tracked by GitLab and
-displayed on the [user profile](../../profile/index.md#user-profile),
+displayed on the [user profile](../../profile/index.md#access-your-user-profile),
[group](../../group/index.md#view-group-activity),
and [project](../working_with_projects.md#project-activity) activity pages.
diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md
index e398c6f86d0..7c8ba4edd6b 100644
--- a/doc/user/project/issues/index.md
+++ b/doc/user/project/issues/index.md
@@ -137,7 +137,7 @@ You can mark two issues as related, so that when viewing one, the other is alway
listed in its [Related Issues](related_issues.md) section. This can help display important
context, such as past work, dependencies, or duplicates.
-Users on [GitLab Starter, GitLab Bronze, and higher tiers](https://about.gitlab.com/pricing/), can
+Users of [GitLab Premium](https://about.gitlab.com/pricing/) or higher can
also mark issues as blocking or blocked by another issue.
### Crosslinking issues
@@ -162,9 +162,9 @@ Up to five similar issues, sorted by most recently updated, are displayed below
### Health status **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36427) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10.
-> - Health status of closed issues [can't be edited](https://gitlab.com/gitlab-org/gitlab/-/issues/220867) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.4 and later.
-> - Issue health status visible in issue lists [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45141) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.6.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36427) in GitLab Ultimate 12.10.
+> - Health status of closed issues [can't be edited](https://gitlab.com/gitlab-org/gitlab/-/issues/220867) in GitLab Ultimate 13.4 and later.
+> - Issue health status visible in issue lists [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45141) in GitLab Ultimate 13.6.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/213567) in GitLab 13.7.
To help you track issue statuses, you can assign a status to each issue.
@@ -184,7 +184,7 @@ You can then see issue statuses in the [issue list](#issues-list) and the
## Other Issue actions
-- [Create an issue from a template](../../project/description_templates.md#using-the-templates)
+- [Create an issue from a template](../../project/description_templates.md#use-the-templates)
- [Set a due date](due_dates.md)
- [Bulk edit issues](../bulk_editing.md) - From the Issues List, select multiple issues
in order to change their status, assignee, milestone, or labels in bulk.
@@ -197,18 +197,18 @@ You can then see issue statuses in the [issue list](#issues-list) and the
## Enable or disable cached issue count **(FREE SELF)**
Cached issue count in the left sidebar is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
+deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can enable it.
+can disable it.
-To enable it:
+To disable it:
```ruby
-Feature.enable(:cached_sidebar_open_issues_count)
+Feature.disable(:cached_sidebar_open_issues_count)
```
-To disable it:
+To enable it:
```ruby
-Feature.disable(:cached_sidebar_open_issues_count)
+Feature.enable(:cached_sidebar_open_issues_count)
```
diff --git a/doc/user/project/issues/issue_data_and_actions.md b/doc/user/project/issues/issue_data_and_actions.md
index c3adce33826..90c918792d7 100644
--- a/doc/user/project/issues/issue_data_and_actions.md
+++ b/doc/user/project/issues/issue_data_and_actions.md
@@ -186,7 +186,7 @@ This icon is only displayed if the user has permission to edit the issue.
### Description
The plain text title and description of the issue fill the top center of the issue page.
-The description fully supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm),
+The description fully supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown),
allowing many formatting options.
[In GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/10103) and later, changes to an
@@ -249,7 +249,7 @@ Also:
### Create Merge Request
-Create a new branch and [**Draft** merge request](../merge_requests/work_in_progress_merge_requests.md)
+Create a new branch and [**Draft** merge request](../merge_requests/drafts.md)
in one action. The branch is named `issuenumber-title` by default, but you can
choose any name, and GitLab verifies that it is not already in use. The merge request
inherits the milestone and labels of the issue, and is set to automatically
@@ -281,7 +281,7 @@ or newest items to be shown first.
### Comments
Collaborate in the issue by posting comments in its thread. This text field also fully
-supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
### Submit comment, start a thread, or comment and close
@@ -301,7 +301,7 @@ You can also close the issue from here, so you don't need to scroll to the top o
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31103) in GitLab 12.3.
You can attach and remove Zoom meetings to issues using the `/zoom` and `/remove_zoom` [quick actions](../quick_actions.md) as part of
-[GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+[GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
Attaching a [Zoom](https://zoom.us) call an issue
results in a **Join Zoom meeting** button at the top of the issue, just under the header.
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index f1739726cf8..cfb22881431 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -298,7 +298,7 @@ To promote an issue to an epic:
1. In an issue, select the vertical ellipsis (**{ellipsis_v}**) button.
1. Select **Promote to epic**.
-Alternatively, you can use the `/promote` [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+Alternatively, you can use the `/promote` [quick action](../quick_actions.md#issues-merge-requests-and-epics).
Read more about promoting an issue to an epic on the [Manage epics page](../../group/epics/manage_epics.md#promote-an-issue-to-an-epic).
@@ -313,5 +313,5 @@ To add an issue to an [iteration](../../group/iterations/index.md):
1. Click an iteration you'd like to associate this issue with.
You can also use the `/iteration`
-[quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
+[quick action](../quick_actions.md#issues-merge-requests-and-epics)
in a comment or description field.
diff --git a/doc/user/project/members/img/project_members_filter_v12_6.png b/doc/user/project/members/img/project_members_filter_v12_6.png
deleted file mode 100644
index 692fdfe00a1..00000000000
--- a/doc/user/project/members/img/project_members_filter_v12_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index 00474098487..057c2930706 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -37,10 +37,7 @@ From the image above, we can deduce the following things:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21727) in GitLab 12.6.
> - [Improved](https://gitlab.com/groups/gitlab-org/-/epics/4901) in GitLab 13.9.
-> - Improvements are [deployed behind a feature flag](../../feature_flags.md), enabled by default.
-> - Improvements are enabled on GitLab.com.
-> - Improvements are recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable improvements](#enable-or-disable-improvements-to-project-member-management). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/299954) in GitLab 13.10.
The following sections illustrate how you can filter and sort members in a project. To view these options,
navigate to your desired project, go to **Members**, and include the noted search terms.
@@ -199,27 +196,3 @@ To remove a member from a project:
A **Remove member** modal appears.
1. (Optional) Select the **Also unassign this user from related issues and merge requests** checkbox.
1. Click **Remove member**.
-
-## Enable or disable improvements to project member management **(FREE SELF)**
-
-Project member management improvements are deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to disable the improvements.
-
-To disable them:
-
-```ruby
-# For the instance
-Feature.disable(:vue_project_members_list)
-# For a single project
-Feature.disable(:vue_project_members_list, Project.find(<project id>))
-```
-
-To enable them:
-
-```ruby
-# For the instance
-Feature.enable(:vue_project_members_list)
-# For a single project
-Feature.enable(:vue_project_members_list, Project.find(<project id>))
-```
diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md
index 7000988d9bf..8ca403783cb 100644
--- a/doc/user/project/members/share_project_with_groups.md
+++ b/doc/user/project/members/share_project_with_groups.md
@@ -62,4 +62,4 @@ It is possible to prevent projects in a group from [sharing
a project with another group](../members/share_project_with_groups.md).
This allows for tighter control over project access.
-Learn more about [Share with group lock](../../group/index.md#share-with-group-lock).
+Learn more about [Share with group lock](../../group/index.md#prevent-a-project-from-being-shared-with-groups).
diff --git a/doc/user/project/merge_requests/allow_collaboration.md b/doc/user/project/merge_requests/allow_collaboration.md
index 7aa7673366d..5917d67c398 100644
--- a/doc/user/project/merge_requests/allow_collaboration.md
+++ b/doc/user/project/merge_requests/allow_collaboration.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, howto
---
@@ -18,15 +18,15 @@ This feature is available for merge requests across forked projects that are
publicly accessible.
When enabled for a merge request, members with merge access to the target
-branch of the project will be granted write permissions to the source branch
+branch of the project is granted write permissions to the source branch
of the merge request.
## Enabling commit edits from upstream members
In [GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/23308),
this setting is enabled by default. It can be changed by users with Developer
-permissions to the source project. Once enabled, upstream members will also be
-able to retry the pipelines and jobs of the merge request:
+permissions to the source project. Once enabled, upstream members can
+retry the pipelines and jobs of the merge request:
1. While creating or editing a merge request, select the checkbox **Allow
commits from members who can merge to the target branch**.
@@ -64,7 +64,7 @@ Here's how the process would look like:
git checkout -b thedude-awesome-project-update-docs FETCH_HEAD
```
- This will fetch the branch of the forked project and then create a local branch
+ This fetches the branch of the forked project and then create a local branch
based off the fetched branch.
1. Make any changes you want and commit.
@@ -74,7 +74,7 @@ Here's how the process would look like:
git push git@gitlab.com:thedude/awesome-project.git thedude-awesome-project-update-docs:update-docs
```
- Note the colon (`:`) between the two branches. The above command will push the
+ Note the colon (`:`) between the two branches. The above command pushes the
local branch `thedude-awesome-project-update-docs` to the
`update-docs` branch of the `git@gitlab.com:thedude/awesome-project.git` repository.
diff --git a/doc/user/project/merge_requests/authorization_for_merge_requests.md b/doc/user/project/merge_requests/authorization_for_merge_requests.md
index 36481ac0133..aa43d34cdd9 100644
--- a/doc/user/project/merge_requests/authorization_for_merge_requests.md
+++ b/doc/user/project/merge_requests/authorization_for_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: concepts
---
diff --git a/doc/user/project/merge_requests/browser_performance_testing.md b/doc/user/project/merge_requests/browser_performance_testing.md
index 6fa2340c7a4..7a869ed071a 100644
--- a/doc/user/project/merge_requests/browser_performance_testing.md
+++ b/doc/user/project/merge_requests/browser_performance_testing.md
@@ -13,6 +13,9 @@ If your application offers a web interface and you're using
[GitLab CI/CD](../../../ci/README.md), you can quickly determine the rendering performance
impact of pending code changes in the browser.
+NOTE:
+You can automate this feature in your applications by using [Auto DevOps](../../../topics/autodevops/index.md).
+
## Overview
GitLab uses [Sitespeed.io](https://www.sitespeed.io), a free and open source
@@ -90,7 +93,7 @@ that you can later download and analyze. This implementation always takes the la
Browser Performance artifact available. If [GitLab Pages](../pages/index.md) is enabled,
you can view the report directly in your browser.
-You can also customize the jobs with environment variables:
+You can also customize the jobs with CI/CD variables:
- `SITESPEED_IMAGE`: Configure the Docker image to use for the job (default `sitespeedio/sitespeed.io`), but not the image version.
- `SITESPEED_VERSION`: Configure the version of the Docker image to use for the job (default `14.1.0`).
@@ -115,7 +118,7 @@ performance:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27599) in GitLab 13.0.
You can configure the sensitivity of degradation alerts to avoid getting alerts for minor drops in metrics.
-This is done by setting the `DEGRADATION_THRESHOLD` variable. In the example below, the alert only shows up
+This is done by setting the `DEGRADATION_THRESHOLD` CI/CD variable. In the example below, the alert only shows up
if the `Total Score` metric degrades by 5 points or more:
```yaml
@@ -186,7 +189,7 @@ GitLab version:
- In GitLab 12.4 [a job template was made available](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml).
- In 13.2 the feature was renamed from `Performance` to `Browser Performance` with
-additional template variables. The job name in the template is still `performance`
+additional template CI/CD variables. The job name in the template is still `performance`
for compatibility reasons, but may be renamed to match in a future iteration.
- For 11.5 to 12.3 no template is available and the job has to be defined manually as follows:
diff --git a/doc/user/project/merge_requests/code_quality.md b/doc/user/project/merge_requests/code_quality.md
index 55dc0bcc41a..42c2547a618 100644
--- a/doc/user/project/merge_requests/code_quality.md
+++ b/doc/user/project/merge_requests/code_quality.md
@@ -22,8 +22,7 @@ Code Quality:
[GitLab Code
Quality](https://gitlab.com/gitlab-org/ci-cd/codequality) project using [default Code Climate configurations](https://gitlab.com/gitlab-org/ci-cd/codequality/-/tree/master/codeclimate_defaults).
- Can make use of a [template](#example-configuration).
-- Is available with [Auto
- DevOps](../../../topics/autodevops/stages.md#auto-code-quality).
+- Is available by using [Auto Code Quality](../../../topics/autodevops/stages.md#auto-code-quality), provided by [Auto DevOps](../../../topics/autodevops/index.md).
- Can be extended through [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) or a [custom tool](#implementing-a-custom-tool).
## Code Quality Widget
@@ -90,7 +89,7 @@ scans your source code for code quality issues. The report is saved as a
that you can later download and analyze.
It's also possible to override the URL to the Code Quality image by
-setting the `CODE_QUALITY_IMAGE` variable. This is particularly useful if you want
+setting the `CODE_QUALITY_IMAGE` CI/CD variable. This is particularly useful if you want
to lock in a specific version of Code Quality, or use a fork of it:
```yaml
@@ -236,12 +235,12 @@ was chosen as an operational decision by the runner team, instead of exposing `d
### Disabling the code quality job
-The `code_quality` job doesn't run if the `$CODE_QUALITY_DISABLED` environment
-variable is present. Please refer to the environment variables [documentation](../../../ci/variables/README.md)
+The `code_quality` job doesn't run if the `$CODE_QUALITY_DISABLED` CI/CD variable
+is present. Please refer to the CI/CD variables [documentation](../../../ci/variables/README.md)
to learn more about how to define one.
-To disable the `code_quality` job, add `CODE_QUALITY_DISABLED` as a custom environment
-variable. This can be done:
+To disable the `code_quality` job, add `CODE_QUALITY_DISABLED` as a custom CI/CD variable.
+This can be done:
- For the whole project, [in the project settings](../../../ci/variables/README.md#create-a-custom-variable-in-the-ui)
or [CI/CD configuration](../../../ci/variables/README.md#create-a-custom-variable-in-the-ui).
@@ -268,7 +267,7 @@ code_quality:
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
```
-If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/README.md#workflowrules))
+If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/README.md#workflow))
might look like this example:
```yaml
@@ -365,7 +364,7 @@ After the Code Quality job completes:
In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/ci-cd/codequality/-/issues/10),
it is possible to generate an HTML report file by setting the `REPORT_FORMAT`
-variable to `html`. This is useful if you just want to view the report in a more
+CI/CD variable to `html`. This is useful if you just want to view the report in a more
human-readable format or to publish this artifact on GitLab Pages for even
easier reviewing.
@@ -509,6 +508,7 @@ This can be due to multiple reasons:
nothing is displayed.
- The [`artifacts:expire_in`](../../../ci/yaml/README.md#artifactsexpire_in) CI/CD
setting can cause the Code Quality artifact(s) to expire faster than desired.
+- The widgets use the pipeline of the latest commit to the target branch. If commits are made to the default branch that do not run the code quality job, this may cause the Merge Request widget to have no base report for comparison.
- If you use the [`REPORT_STDOUT` environment variable](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables), no report file is generated and nothing displays in the merge request.
- Large `gl-code-quality-report.json` files (esp. >10 MB) are [known to prevent the report from being displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/2737).
As a work-around, try removing [properties](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types)
diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md
index 5cfedc6c9f1..58e80504212 100644
--- a/doc/user/project/merge_requests/creating_merge_requests.md
+++ b/doc/user/project/merge_requests/creating_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: howto
description: "How to create Merge Requests in GitLab."
@@ -30,11 +30,16 @@ button and start a merge request from there.
## New Merge Request page
-On the **New Merge Request** page, start by filling in the title
-and description for the merge request. If there are already
-commits on the branch, the title is prefilled with the first
-line of the first commit message, and the description is
-prefilled with any additional lines in the commit message.
+On the **New Merge Request** page, start by filling in the title and description
+for the merge request. If commits already exist on the branch, GitLab suggests a
+merge request title for you:
+
+- **If a multi-line commit message exists**: GitLab adds the first line of the
+ first multi-line commit message as the title. Any additional lines in that
+ commit message become the description.
+- **If no multi-line commit message exists**: GitLab adds the branch name as the
+ title, and leaves the description blank.
+
The title is the only field that is mandatory in all cases.
From there, you can fill it with information (title, description,
diff --git a/doc/user/project/merge_requests/drafts.md b/doc/user/project/merge_requests/drafts.md
new file mode 100644
index 00000000000..a030961e219
--- /dev/null
+++ b/doc/user/project/merge_requests/drafts.md
@@ -0,0 +1,99 @@
+---
+stage: Create
+group: Code Review
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference, concepts
+disqus_identifier: 'https://docs.gitlab.com/ee/user/project/merge_requests/work_in_progress_merge_requests.html'
+---
+
+# Draft merge requests **(FREE)**
+
+If a merge request isn't ready to merge, potentially because of continued development
+or open threads, you can prevent it from being accepted before you
+[mark it as ready](#mark-merge-requests-as-ready). Flag it as a draft to disable
+the **Merge** button until you remove the **Draft** flag:
+
+![Blocked Merge Button](img/draft_blocked_merge_button_v13_10.png)
+
+## Mark merge requests as drafts
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32692) in GitLab 13.2, Work-In-Progress (WIP) merge requests were renamed to **Draft**. Support for using **WIP** is scheduled for removal in GitLab 14.0.
+> - **Mark as draft** and **Mark as ready** buttons [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227421) in GitLab 13.5.
+
+There are several ways to flag a merge request as a draft:
+
+- **Viewing a merge request**: In the top right corner of the merge request, click **Mark as draft**.
+- **Creating or editing a merge request**: Add `[Draft]`, `Draft:` or `(Draft)` to
+ the beginning of the merge request's title, or click **Start the title with Draft:**
+ below the **Title** field.
+- **Commenting in an existing merge request**: Add the `/draft`
+ [quick action](../quick_actions.md#issues-merge-requests-and-epics)
+ in a comment. This quick action is a toggle, and can be repeated to change the status
+ again. This quick action discards any other text in the comment.
+- **Creating a commit**: Add `draft:`, `Draft:`, `fixup!`, or `Fixup!` to the
+ beginning of a commit message targeting the merge request's source branch. This
+ is not a toggle, and adding this text again in a later commit doesn't mark the
+ merge request as ready.
+
+WARNING:
+Adding `WIP:` to the start of the merge request's title still marks a merge request
+as a draft. This feature is scheduled for removal in GitLab 14.0. Use `Draft:` instead.
+
+## Mark merge requests as ready
+
+When a merge request is ready to be merged, you can remove the `Draft` flag in several ways:
+
+- **Viewing a merge request**: In the top right corner of the merge request, click **Mark as ready**.
+ Users with [Developer or greater permissions](../../permissions.md)
+ can also scroll to the bottom of the merge request description and click **Mark as ready**:
+
+ ![Mark as ready](img/draft_blocked_merge_button_v13_10.png)
+
+- **Editing an existing merge request**: Remove `[Draft]`, `Draft:` or `(Draft)`
+ from the beginning of the title, or click **Remove the Draft: prefix from the title**
+ below the **Title** field.
+- **Commenting in an existing merge request**: Add the `/draft`
+ [quick action](../quick_actions.md#issues-merge-requests-and-epics)
+ in a comment in the merge request. This quick action is a toggle, and can be repeated
+ to change the status back. This quick action discards any other text in the comment.
+
+In [GitLab 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/15332),
+when you mark a merge request as ready, notifications are triggered to
+[merge request participants and watchers](../../profile/notifications.md#notifications-on-issues-merge-requests-and-epics).
+
+## Include or exclude drafts when searching
+
+When viewing or searching in your project's merge requests list, you can include or exclude
+draft merge requests:
+
+1. In your project, select **Merge Requests** from the left sidebar.
+1. In the navigation bar, click **Open**, **Merged**, **Closed**, or **All** to
+ filter by merge request status.
+1. Click the search box to display a list of filters and select **Draft**, or
+ enter the word `draft`.
+1. Select `=`.
+1. Select **Yes** to include drafts, or **No** to exclude, and press **Return**
+ to update the list of merge requests:
+
+ ![Filter draft merge requests](img/filter_draft_merge_requests_v13_10.png)
+
+## Pipelines for drafts
+
+When the [pipelines for merged results](../../../ci/merge_request_pipelines/pipelines_for_merged_results/index.md)
+feature is enabled, draft merge requests run
+[merge request pipelines](../../../ci/merge_request_pipelines/index.md) only.
+
+To run pipelines for merged results, you must
+[mark the merge request as ready](#mark-merge-requests-as-ready).
+
+<!-- ## Troubleshooting
+
+Include any troubleshooting steps that you can foresee. If you know beforehand what issues
+one might have when setting this up, or when something is changed, or on upgrading, it's
+important to describe those, too. Think of things that may go wrong and include them here.
+This is important to minimize requests for support, and to avoid doc comments with
+questions that you know someone might ask.
+
+Each scenario can be a third-level heading, e.g. `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/user/project/merge_requests/fast_forward_merge.md b/doc/user/project/merge_requests/fast_forward_merge.md
index c4a34f9c65c..b1e8d761f5c 100644
--- a/doc/user/project/merge_requests/fast_forward_merge.md
+++ b/doc/user/project/merge_requests/fast_forward_merge.md
@@ -17,7 +17,7 @@ to accept merge requests without creating merge commits.
When the fast-forward merge
([`--ff-only`](https://git-scm.com/docs/git-merge#git-merge---ff-only)) setting
-is enabled, no merge commits will be created and all merges are fast-forwarded,
+is enabled, no merge commits are created and all merges are fast-forwarded,
which means that merging is only allowed if the branch can be fast-forwarded.
When a fast-forward merge is not possible, the user is given the option to rebase.
@@ -28,19 +28,19 @@ When a fast-forward merge is not possible, the user is given the option to rebas
1. Select the **Fast-forward merge** option
1. Hit **Save changes** for the changes to take effect
-Now, when you visit the merge request page, you will be able to accept it
+Now, when you visit the merge request page, you can accept it
**only if a fast-forward merge is possible**.
![Fast forward merge request](img/ff_merge_mr.png)
If a fast-forward merge is not possible but a conflict free rebase is possible,
-a rebase button will be offered.
+a rebase button is offered.
![Fast forward merge request](img/ff_merge_rebase.png)
If the target branch is ahead of the source branch and a conflict free rebase is
not possible, you need to rebase the
-source branch locally before you will be able to do a fast-forward merge.
+source branch locally before you can do a fast-forward merge.
![Fast forward merge rebase locally](img/ff_merge_rebase_locally.png)
diff --git a/doc/user/project/merge_requests/getting_started.md b/doc/user/project/merge_requests/getting_started.md
index b1a57d9c3e6..f25228729cf 100644
--- a/doc/user/project/merge_requests/getting_started.md
+++ b/doc/user/project/merge_requests/getting_started.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: index, reference
description: "Getting started with Merge Requests."
@@ -60,7 +60,7 @@ request's page at the top-right side:
- [Close issues automatically](#merge-requests-to-close-issues) when they are merged.
- Enable the [delete source branch when merge request is accepted](#deleting-the-source-branch) option to keep your repository clean.
- Enable the [squash commits when merge request is accepted](squash_and_merge.md) option to combine all the commits into one before merging, thus keep a clean commit history in your repository.
-- Set the merge request as a [**Draft**](work_in_progress_merge_requests.md) to avoid accidental merges before it is ready.
+- Set the merge request as a [**Draft**](drafts.md) to avoid accidental merges before it is ready.
After you have created the merge request, you can also:
@@ -84,7 +84,7 @@ See also other [features associated to merge requests](reviewing_and_managing_me
Choose an assignee to designate someone as the person responsible
for the first [review of the merge request](reviewing_and_managing_merge_requests.md).
Open the drop down box to search for the user you wish to assign,
-and the merge request will be added to their
+and the merge request is added to their
[assigned merge request list](../../search/index.md#issues-and-merge-requests).
#### Multiple assignees **(PREMIUM)**
@@ -110,7 +110,7 @@ dropdown menu.
It is also possible to manage multiple assignees:
- When creating a merge request.
-- Using [quick actions](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+- Using [quick actions](../quick_actions.md#issues-merge-requests-and-epics).
### Reviewer
@@ -122,17 +122,19 @@ Requesting a code review is an important part of contributing code. However, dec
your code and asking for a review are no easy tasks. Using the "assignee" field for both authors and
reviewers makes it hard for others to determine who's doing what on a merge request.
-GitLab Merge Request Reviewers easily allow authors to request a review as well as see the status of the
-review. By selecting one or more users from the **Reviewers** field in the merge request's right-hand
-sidebar, the assigned reviewers will receive a notification of the request to review the merge request.
+The Merge Request Reviewers feature enables you to request a review of your work, and
+see the status of the review. Reviewers help distinguish the roles of the users
+involved in the merge request. In comparison to an **Assignee**, who is directly
+responsible for creating or merging a merge request, a **Reviewer** is a team member
+who may only be involved in one aspect of the merge request, such as a peer review.
-This makes it easy to determine the relevant roles for the users involved in the merge request, as well as formally requesting a review from a peer.
-
-To request it, open the **Reviewers** drop-down box to search for the user you wish to get a review from.
+To request a review of a merge request, expand the **Reviewers** select box in
+the right-hand sidebar. Search for the users you want to request a review from.
+When selected, GitLab creates a [to-do list item](../../todos.md) for each reviewer.
#### Approval Rule information for Reviewers **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233736) in GitLab 13.8. For this version only, GitLab administrators can opt to [enable it](#enable-or-disable-approval-rule-information).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233736) in GitLab 13.8.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293742) in GitLab 13.9.
When editing the **Reviewers** field in a new or existing merge request, GitLab
@@ -162,6 +164,13 @@ the author of the merge request can request a new review from the reviewer:
GitLab creates a new [to-do item](../../todos.md) for the reviewer, and sends
them a notification email.
+#### Approval status
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292936) in GitLab 13.10.
+
+If a user in the reviewer list has approved the merge request, a green tick symbol is
+shown to the right of their name.
+
### Merge requests to close issues
If the merge request is being created to resolve an issue, you can
@@ -198,9 +207,9 @@ is set for deletion, the merge request widget displays the
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/320902) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-branch-retargeting-on-merge).
+> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/320895) on GitLab 13.10.
+> - It's recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [disable it](#enable-or-disable-branch-retargeting-on-merge). **(FREE SELF)**
In specific circumstances, GitLab can retarget the destination branch of
open merge request, if the destination branch merges while the merge request is
@@ -221,6 +230,12 @@ GitLab retargets up to four merge requests when their target branch is merged in
`master`, so you don't need to perform this operation manually. Merge requests from
forks are not retargeted.
+The feature today works only one a merge. Clicking the `Remove source branch` button
+after the merge request was merged will not automatically retarget merge request.
+The feature today works only on merge. Clicking the **Remove source branch** button
+after the merge request was merged will not automatically retarget a merge request.
+This improvement is [tracked as a follow-up](https://gitlab.com/gitlab-org/gitlab/-/issues/321559).
+
## Recommendations and best practices for Merge Requests
- When working locally in your branch, add multiple commits and only push when
@@ -231,33 +246,6 @@ forks are not retargeted.
reviews are faster and your changes are less prone to errors.
- Do not use capital letters nor special chars in branch names.
-## Enable or disable Approval Rule information **(PREMIUM SELF)**
-
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293742) in GitLab 13.9.
-
-Merge Request Reviewers is under development and ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-# For the instance
-Feature.enable(:reviewer_approval_rules)
-# For a single project
-Feature.enable(:reviewer_approval_rules, Project.find(<project id>))
-```
-
-To disable it:
-
-```ruby
-# For the instance
-Feature.disable(:reviewer_approval_rules)
-# For a single project
-Feature.disable(:reviewer_approval_rules, Project.find(<project id>))
-```
-
### Enable or disable branch retargeting on merge **(FREE SELF)**
Automatically retargeting merge requests is under development but ready for production use.
diff --git a/doc/user/project/merge_requests/img/comment-on-any-diff-line.png b/doc/user/project/merge_requests/img/comment-on-any-diff-line.png
deleted file mode 100644
index cff5acb98ef..00000000000
--- a/doc/user/project/merge_requests/img/comment-on-any-diff-line.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.png b/doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.png
new file mode 100644
index 00000000000..a31fea85be9
--- /dev/null
+++ b/doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.png b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.png
new file mode 100644
index 00000000000..3bac9f7fee8
--- /dev/null
+++ b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png
deleted file mode 100644
index f7968772500..00000000000
--- a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.png b/doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.png
new file mode 100644
index 00000000000..4458df987d6
--- /dev/null
+++ b/doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/filter_wip_merge_requests.png b/doc/user/project/merge_requests/img/filter_wip_merge_requests.png
deleted file mode 100644
index 0989b41e2a4..00000000000
--- a/doc/user/project/merge_requests/img/filter_wip_merge_requests.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/multiline-comment-highlighted.png b/doc/user/project/merge_requests/img/multiline-comment-highlighted.png
deleted file mode 100644
index 1bdcc37e274..00000000000
--- a/doc/user/project/merge_requests/img/multiline-comment-highlighted.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png b/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png
deleted file mode 100644
index 9446ed66c38..00000000000
--- a/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.png b/doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.png
new file mode 100644
index 00000000000..b1c2e147134
--- /dev/null
+++ b/doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/update_approval_rule_v13_10.png b/doc/user/project/merge_requests/img/update_approval_rule_v13_10.png
new file mode 100644
index 00000000000..c0cc0db600c
--- /dev/null
+++ b/doc/user/project/merge_requests/img/update_approval_rule_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/update_approval_rule_v13_4.png b/doc/user/project/merge_requests/img/update_approval_rule_v13_4.png
deleted file mode 100644
index af713b48140..00000000000
--- a/doc/user/project/merge_requests/img/update_approval_rule_v13_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 8ccf50e48b8..99e0193d496 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -1,16 +1,29 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: index, reference
---
# Merge requests **(FREE)**
-A Merge Request (**MR**) is a _request_ to _merge_ one branch into another.
+Whenever you need to merge one branch into another branch with GitLab, you
+must create a merge request (MR).
-Use merge requests to visualize and collaborate on proposed changes
-to source code.
+Using merge requests, you can visualize and collaborate on proposed changes to
+source code. Merge requests display information about the proposed code changes,
+including:
+
+- A description of the request.
+- Code changes and inline code reviews.
+- Information about CI/CD pipelines.
+- A comment section for discussion threads.
+- The list of commits.
+
+Based on your workflow, after review you can merge a merge request into its
+target branch.
+
+To get started, read the [introduction to merge requests](getting_started.md).
## Use cases
@@ -36,21 +49,9 @@ B. Consider you're a web developer writing a webpage for your company's website:
1. Your changes are previewed with [Review Apps](../../../ci/review_apps/index.md)
1. You request your web designers for their implementation
1. You request the [approval](merge_request_approvals.md) from your manager **(STARTER)**
-1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
+1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
1. Your production team [cherry picks](cherry_pick_changes.md) the merge commit into production
-## Overview
-
-Merge requests (aka "MRs") display a great deal of information about the changes proposed.
-The body of an MR contains its description, along with its widget (displaying information
-about CI/CD pipelines, when present), followed by the discussion threads of the people
-collaborating with that MR.
-
-MRs also contain navigation tabs from which you can see the discussion happening on the thread,
-the list of commits, the list of pipelines and jobs, the code changes, and inline code reviews.
-
-To get started, read the [introduction to merge requests](getting_started.md).
-
## Merge request navigation tabs at the top
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33813) in GitLab 12.6. This positioning is experimental.
diff --git a/doc/user/project/merge_requests/load_performance_testing.md b/doc/user/project/merge_requests/load_performance_testing.md
index 9154897d42d..e8062fadcfe 100644
--- a/doc/user/project/merge_requests/load_performance_testing.md
+++ b/doc/user/project/merge_requests/load_performance_testing.md
@@ -104,8 +104,8 @@ An example configuration workflow:
1. Set up GitLab Runner to run Docker containers, like the
[Docker-in-Docker workflow](../../../ci/docker/using_docker_build.md#use-the-docker-executor-with-the-docker-image-docker-in-docker).
-1. Configure the default Load Performance Testing CI job in your `.gitlab-ci.yml` file.
- You need to include the template and configure it with variables:
+1. Configure the default Load Performance Testing CI/CD job in your `.gitlab-ci.yml` file.
+ You need to include the template and configure it with CI/CD variables:
```yaml
include:
@@ -153,7 +153,7 @@ but it can be extended to work with [review apps](../../../ci/review_apps) or
[dynamic environments](../../../ci/environments) with a few extra steps.
The best approach is to capture the dynamic URL in a [`.env` file](https://docs.docker.com/compose/env-file/)
-as a job artifact to be shared, then use a custom environment variable we've provided named `K6_DOCKER_OPTIONS`
+as a job artifact to be shared, then use a custom CI/CD variable we've provided named `K6_DOCKER_OPTIONS`
to configure the k6 Docker container to use the file. With this, k6 can then use any
environment variables from the `.env` file in scripts using standard JavaScript,
such as: ``http.get(`${__ENV.ENVIRONMENT_URL}`)``.
diff --git a/doc/user/project/merge_requests/merge_request_approvals.md b/doc/user/project/merge_requests/merge_request_approvals.md
index 1fcc09a9d8a..3d3e04842f8 100644
--- a/doc/user/project/merge_requests/merge_request_approvals.md
+++ b/doc/user/project/merge_requests/merge_request_approvals.md
@@ -79,7 +79,8 @@ An individual user can be added as an approver for a project if they are a membe
- The project's immediate parent group.
- A group that has access to the project via a [share](../members/share_project_with_groups.md).
-A group of users can also be added as approvers. In the future, group approvers may be
+A group of users can also be added as approvers, though they only count as approvers if
+they have direct membership to the group. In the future, group approvers may be
[restricted to only groups with share access to the project](https://gitlab.com/gitlab-org/gitlab/-/issues/2048).
If a user is added as an individual approver and is also part of a group approver,
@@ -138,17 +139,17 @@ to push or merge code to any branches.
To enable this access:
-1. [Create a new group](../../group/index.md#create-a-new-group), and then
+1. [Create a new group](../../group/index.md#create-a-group), and then
[add the user to the group](../../group/index.md#add-users-to-a-group),
ensuring you select the Reporter role for the user.
1. [Share the project with your group](../members/share_project_with_groups.md#sharing-a-project-with-a-group-of-users),
based on the Reporter role.
1. Navigate to your project's **Settings > General**, and in the
**Merge request approvals** section, click **Expand**.
-1. [Add the group](../../group/index.md#create-a-new-group) to the permission list
- for the protected branch.
+1. Select **Add approval rule** or **Update approval rule**.
+1. [Add the group](../../group/index.md#create-a-group) to the permission list.
-![Update approval rule](img/update_approval_rule_v13_4.png)
+![Update approval rule](img/update_approval_rule_v13_10.png)
#### Adding / editing a default approval rule
@@ -239,7 +240,7 @@ the **Target branch** dropdown.
Alternatively, you can select a very specific protected branch from the **Target branch** dropdown:
-![Scoped to protected branch](img/scoped_to_protected_branch_v12_8.png)
+![Scoped to protected branch](img/scoped_to_protected_branch_v13_10.png)
To enable this configuration, see [Code Owner’s approvals for protected branches](../protected_branches.md#protected-branches-approval-by-code-owners).
diff --git a/doc/user/project/merge_requests/merge_request_dependencies.md b/doc/user/project/merge_requests/merge_request_dependencies.md
index 646d77391a3..2d7ba853258 100644
--- a/doc/user/project/merge_requests/merge_request_dependencies.md
+++ b/doc/user/project/merge_requests/merge_request_dependencies.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
@@ -40,8 +40,7 @@ require changes to `awesome-lib`, and so necessitate two merge requests. Merging
the `awesome-project` merge request before the `awesome-lib` one would
break the `master`branch.
-The `awesome-project` merge request could be [marked as
-**Draft**](work_in_progress_merge_requests.md),
+The `awesome-project` merge request could be [marked as **Draft**](drafts.md),
and the reason for the draft stated included in the comments. However, this
requires the state of the `awesome-lib` merge request to be manually
tracked, and doesn't scale well if the `awesome-project` merge request
@@ -85,7 +84,7 @@ merge request widget:
![Dependencies in merge request widget](img/dependencies_view_v12_2.png)
Until all dependencies have, themselves, been merged, the **Merge**
-button will be disabled for the dependent merge request. In
+button is disabled for the dependent merge request. In
particular, note that **closed merge requests** still prevent their
dependents from being merged - it is impossible to automatically
determine whether the dependency expressed by a closed merge request
diff --git a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
index d33a8e40aac..58f2c310375 100644
--- a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
+++ b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
@@ -94,7 +94,7 @@ merge-request-pipeline-job:
```
You should avoid configuration like this, and only use branch (`push`) pipelines
-or merge request pipelines, when possible. See [`rules` documentation](../../../ci/yaml/README.md#prevent-duplicate-pipelines)
+or merge request pipelines, when possible. See [`rules` documentation](../../../ci/yaml/README.md#avoid-duplicate-pipelines)
for details on avoiding two pipelines for a single merge request.
### Skipped pipelines
diff --git a/doc/user/project/merge_requests/resolve_conflicts.md b/doc/user/project/merge_requests/resolve_conflicts.md
index a53b5032e1d..4d5d89d6508 100644
--- a/doc/user/project/merge_requests/resolve_conflicts.md
+++ b/doc/user/project/merge_requests/resolve_conflicts.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
diff --git a/doc/user/project/merge_requests/revert_changes.md b/doc/user/project/merge_requests/revert_changes.md
index d5d0578c07c..a798f2c9b85 100644
--- a/doc/user/project/merge_requests/revert_changes.md
+++ b/doc/user/project/merge_requests/revert_changes.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
@@ -13,27 +13,26 @@ by clicking the **Revert** button in merge requests and commit details.
## Reverting a merge request
NOTE:
-The **Revert** button will only be available for merge requests
+The **Revert** button is available only for merge requests
created in GitLab 8.5 and later. However, you can still revert a merge request
by reverting the merge commit from the list of Commits page.
NOTE:
-The **Revert** button will only be shown for projects that use the
+The **Revert** button is shown only for projects that use the
merge method "Merge Commit", which can be set under the project's
**Settings > General > Merge request**. [Fast-forward commits](fast_forward_merge.md)
-can not be reverted via the MR view.
+can not be reverted by using the merge request view.
-After the Merge Request has been merged, a **Revert** button will be available
+After the merge request has been merged, use the **Revert** button
to revert the changes introduced by that merge request.
-![Revert Merge Request](img/cherry_pick_changes_mr.png)
+![Revert merge request](img/cherry_pick_changes_mr.png)
-After you click that button, a modal will appear where you can choose to
+After you click that button, a modal appears where you can choose to
revert the changes directly into the selected branch or you can opt to
create a new merge request with the revert changes.
-After the merge request has been reverted, the **Revert** button will not be
-available anymore.
+After the merge request has been reverted, the **Revert** button is no longer available.
## Reverting a commit
@@ -45,14 +44,13 @@ Similar to reverting a merge request, you can opt to revert the changes
directly into the target branch or create a new merge request to revert the
changes.
-After the commit has been reverted, the **Revert** button will not be available
-anymore.
+After a commit is reverted, the **Revert** button is no longer available.
-Please note that when reverting merge commits, the mainline will always be the
-first parent. If you want to use a different mainline then you need to do that
+When reverting merge commits, the mainline is always the
+first parent. If you want to use a different mainline, you need to do that
from the command line.
-Here is a quick example to revert a merge commit using the second parent as the
+Here's an example to revert a merge commit using the second parent as the
mainline:
```shell
diff --git a/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md b/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
index 94f48fa544f..406a79217d0 100644
--- a/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
+++ b/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: index, reference
---
@@ -187,27 +187,31 @@ Feature.disable(:local_file_reviews)
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13950) in GitLab 11.5.
In a merge request, you can leave comments in any part of the file being changed.
-In the Merge Request Diff UI, click the **{comment}** **comment** icon in the gutter
-to expand the diff lines and leave a comment, just as you would for a changed line.
+In the Merge Request Diff UI, you can:
-![Comment on any diff file line](img/comment-on-any-diff-line.png)
+- **Comment on a single line**: Click the **{comment}** **comment** icon in the
+ gutter to expand the diff lines and display a comment box.
+- [**Comment on multiple lines**](#commenting-on-multiple-lines).
### Commenting on multiple lines
> - [Introduced](https://gitlab.com/gitlab-org/ux-research/-/issues/870) in GitLab 13.2.
+> - [Added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49875) click-and-drag features in GitLab 13.8.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/299121) in GitLab 13.9.
-GitLab provides a way to select which lines of code a comment refers to. After starting a comment
-a dropdown selector is shown to select the first line that this comment refers to.
-The last line is the line that the comment icon was initially clicked on.
+When commenting on a diff, you can select which lines of code your comment refers
+to by either:
-New comments default to single line comments by having the first and last lines
-the same. Selecting a different starting line turns this into a multiline comment.
+![Comment on any diff file line](img/comment-on-any-diff-line_v13_10.png)
-![Multiline comment selection highlighted](img/multiline-comment-highlighted.png)
+- Clicking and dragging the **{comment}** **comment** icon in the gutter to highlight
+ lines in the diff. GitLab expands the diff lines and displays a comment box.
+- After starting a comment by clicking the **{comment}** **comment** icon in the
+ gutter, select the first line number your comment refers to in the **Commenting on lines**
+ select box. New comments default to single-line comments, unless you select
+ a different starting line.
-Once a multiline comment is saved the lines of code pertaining to that comment are listed directly
-above it.
+Multiline comments display the comment's line numbers above the body of the comment:
![Multiline comment selection displayed above comment](img/multiline-comment-saved.png)
diff --git a/doc/user/project/merge_requests/squash_and_merge.md b/doc/user/project/merge_requests/squash_and_merge.md
index 1b99b1b5c44..f500c18a32e 100644
--- a/doc/user/project/merge_requests/squash_and_merge.md
+++ b/doc/user/project/merge_requests/squash_and_merge.md
@@ -31,7 +31,7 @@ NOTE:
The squashed commit in this example is followed by a merge commit, because the merge method for this repository uses a merge commit. You can disable merge commits in
**Project Settings > General > Merge requests > Merge method > Fast-forward merge**.
-The squashed commit's commit message will be either:
+The squashed commit's commit message is either:
- Taken from the first multi-line commit message in the merge.
- The merge request's title if no multi-line commit message is found.
@@ -60,7 +60,7 @@ This way, the history of your base branch remains clean with
meaningful commit messages and:
- It's simpler to [revert](revert_changes.md) if necessary.
-- The merged branch will retain the full commit history.
+- The merged branch retains the full commit history.
## Enabling squash for a merge request
@@ -113,18 +113,18 @@ squashing can itself be considered equivalent to rebasing.
With Squash Commits Options you can configure the behavior of Squash and Merge for your project.
To set it up, navigate to your project's **Settings > General** and expand **Merge requests**.
-You will find the following options to choose, which will affect existing and new merge requests
+You can choose from these options, which affect existing and new merge requests
submitted to your project:
- **Do not allow**: users cannot use Squash and Merge to squash all the commits immediately before
- merging. The checkbox to enable or disable it will be unchecked and hidden from the users.
-- **Allow**: users will have the option to enable Squash and Merge on a merge request basis.
- The checkbox will be unchecked (disabled) by default, but and the user is allowed to enable it.
-- **Encourage**: users will have the option to enable Squash and Merge on a merge request basis.
- The checkbox will be checked (enabled) by default to encourage its use, but the user is allowed to
+ merging. The checkbox to enable or disable it is unchecked and hidden from the users.
+- **Allow**: users can enable Squash and Merge on a merge request basis.
+ The checkbox is unchecked (disabled) by default, but and the user is allowed to enable it.
+- **Encourage**: users can enable Squash and Merge on a merge request basis.
+ The checkbox is checked (enabled) by default to encourage its use, but the user is allowed to
disable it.
-- **Require**: Squash and Merge is enabled for all merge requests, so it will always be performed.
- The checkbox to enable or disable it will be checked and hidden from the users.
+- **Require**: Squash and Merge is enabled for all merge requests, so it is always performed.
+ The checkbox to enable or disable it is checked and hidden from the users.
The Squash and Merge checkbox is displayed when you create a merge request and when you edit the description of an existing one, except when Squash Commit Options is set to **Do not allow** or **Require**.
diff --git a/doc/user/project/merge_requests/test_coverage_visualization.md b/doc/user/project/merge_requests/test_coverage_visualization.md
index e60f2f712d3..02b557e22b9 100644
--- a/doc/user/project/merge_requests/test_coverage_visualization.md
+++ b/doc/user/project/merge_requests/test_coverage_visualization.md
@@ -146,7 +146,7 @@ coverage-jdk11:
# The `visualize` stage does not exist by default.
# Please define it first, or chose an existing stage like `deploy`.
stage: visualize
- image: haynes/jacoco2cobertura:1.0.4
+ image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
script:
# convert report from jacoco to cobertura
- 'python /opt/cover2cover.py target/site/jacoco/jacoco.xml src/main/java > target/site/cobertura.xml'
@@ -186,7 +186,7 @@ coverage-jdk11:
# The `visualize` stage does not exist by default.
# Please define it first, or chose an existing stage like `deploy`.
stage: visualize
- image: haynes/jacoco2cobertura:1.0.4
+ image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
script:
# convert report from jacoco to cobertura
- 'python /opt/cover2cover.py build/jacoco/jacoco.xml src/main/java > build/cobertura.xml'
@@ -219,3 +219,32 @@ run tests:
reports:
cobertura: coverage.xml
```
+
+### C/C++ example
+
+The following [`gitlab-ci.yml`](../../../ci/yaml/README.md) example for C/C++ with
+`gcc` or `g++` as the compiler uses [`gcovr`](https://gcovr.com/en/stable/) to generate the coverage
+output file in Cobertura XML format.
+
+This example assumes:
+
+- That the `Makefile` is created by `cmake` in the `build` directory,
+ within another job in a previous stage.
+ (If you use `automake` to generate the `Makefile`,
+ then you need to call `make check` instead of `make test`.)
+- `cmake` (or `automake`) has set the compiler option `--coverage`.
+
+```yaml
+run tests:
+ stage: test
+ script:
+ - cd build
+ - make test
+ - gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o coverage.xml --root ${CI_PROJECT_DIR}
+ coverage: /^\s*lines:\s*\d+.\d+\%/
+ artifacts:
+ name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}
+ expire_in: 2 days
+ reports:
+ cobertura: build/coverage.xml
+```
diff --git a/doc/user/project/merge_requests/versions.md b/doc/user/project/merge_requests/versions.md
index 8f3ce9186f1..2c77957c98d 100644
--- a/doc/user/project/merge_requests/versions.md
+++ b/doc/user/project/merge_requests/versions.md
@@ -64,7 +64,7 @@ In GitLab 12.10, we added a comparison mode, which
shows a diff calculated by simulating how it would look like once merged - a more accurate
representation of the changes rather than using the base of the two
branches. The new mode is available from the comparison target drop down
-by selecting **master (HEAD)**. In GitLab 13.9, it
+by selecting **master (HEAD)**. In GitLab 13.9, it
[replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/198458) the
old default comparison. For technical details, additional information is available in the
[developer documentation](../../../development/diffs.md#merge-request-diffs-against-the-head-of-the-target-branch).
diff --git a/doc/user/project/merge_requests/work_in_progress_merge_requests.md b/doc/user/project/merge_requests/work_in_progress_merge_requests.md
index 43ab03114fa..4b854da116e 100644
--- a/doc/user/project/merge_requests/work_in_progress_merge_requests.md
+++ b/doc/user/project/merge_requests/work_in_progress_merge_requests.md
@@ -1,78 +1,8 @@
---
-stage: Create
-group: Source Code
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference, concepts
+redirect_to: 'drafts.md'
---
-# Draft merge requests **(FREE)**
+This document was moved to [another location](drafts.md).
-If a merge request is not yet ready to be merged, perhaps due to continued development
-or open threads, you can prevent it from being accepted before it's ready by flagging
-it as a **Draft**. This disables the **Merge** button, preventing it from
-being merged. It stays disabled until the **Draft** flag has been removed.
-
-![Blocked Merge Button](img/draft_blocked_merge_button_v13_2.png)
-
-When [pipelines for merged results](../../../ci/merge_request_pipelines/pipelines_for_merged_results/index.md)
-is enabled, draft merge requests run [merge request pipelines](../../../ci/merge_request_pipelines/index.md)
-only.
-
-To run pipelines for merged results, you must [remove the draft status](#removing-the-draft-flag-from-a-merge-request).
-
-## Adding the "Draft" flag to a merge request
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32692) in GitLab 13.2, Work-In-Progress (WIP) merge requests were renamed to **Draft**. Support for using **WIP** is scheduled for removal in GitLab 14.0.
-> - **Mark as draft** and **Mark as ready** buttons [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227421) in GitLab 13.5.
-
-There are several ways to flag a merge request as a Draft:
-
-- Click the **Mark as draft** button on the top-right corner of the merge request's page.
-- Add `[Draft]`, `Draft:` or `(Draft)` to the start of the merge request's title. Clicking on
- **Start the title with Draft:**, under the title box, when editing the merge request's
- description has the same effect.
-- **Deprecated** Add `[WIP]` or `WIP:` to the start of the merge request's title.
- **WIP** still works but was deprecated in favor of **Draft**. It is scheduled for removal in the next major version (GitLab 14.0).
-- Add the `/draft` (or `/wip`) [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
- in a comment in the merge request. This is a toggle, and can be repeated
- to change the status back. Note that any other text in the comment is discarded.
-- Add `draft:`, `Draft:`, `fixup!`, or `Fixup!` to the beginning of a commit message targeting the
- merge request's source branch. This is not a toggle, and doing it again in another
- commit has no effect.
-
-## Removing the "Draft" flag from a merge request
-
-Similar to above, when a Merge Request is ready to be merged, you can remove the
-`Draft` flag in several ways:
-
-- Click the **Mark as ready** button on the top-right corner of the merge request's page.
-- Remove `[Draft]`, `Draft:` or `(Draft)` from the start of the merge request's title. Clicking on
- **Remove the Draft: prefix from the title**, under the title box, when editing the merge
- request's description, has the same effect.
-- Add the `/draft` (or `/wip`) [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
- in a comment in the merge request. This is a toggle, and can be repeated
- to change the status back. Note that any other text in the comment is discarded.
-- Click on the **Resolve Draft status** button near the bottom of the merge request description,
- next to the **Merge** button (see [image above](#draft-merge-requests)).
- Must have at least Developer level permissions on the project for the button to
- be visible.
-
-## Including/excluding WIP merge requests when searching
-
-When viewing/searching the merge requests list, you can choose to include or exclude
-WIP merge requests. Add a **WIP** filter in the search box, and choose **Yes**
-to include, or **No** to exclude.
-
-![Filter WIP MRs](img/filter_wip_merge_requests.png)
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+<!-- This redirect file can be deleted after <2021-05-19>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/milestones/burndown_charts.md b/doc/user/project/milestones/burndown_charts.md
deleted file mode 100644
index 2985e5da2ab..00000000000
--- a/doc/user/project/milestones/burndown_charts.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'burndown_and_burnup_charts.md'
----
-
-This document was moved to [another location](burndown_and_burnup_charts.md).
-
-<!-- This redirect file can be deleted after February 1, 2021. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/pages/getting_started/pages_ci_cd_template.md b/doc/user/project/pages/getting_started/pages_ci_cd_template.md
index e0d5e8be535..30dd337d9d8 100644
--- a/doc/user/project/pages/getting_started/pages_ci_cd_template.md
+++ b/doc/user/project/pages/getting_started/pages_ci_cd_template.md
@@ -41,7 +41,7 @@ configuration for the Pages site to generate properly.
If everything is configured correctly, the site can take approximately 30 minutes to deploy.
-You can watch the pipeline run by navigating to **CI / CD > Pipelines**.
+You can watch the pipeline run by navigating to **CI/CD > Pipelines**.
When the pipeline is finished, go to **Settings > Pages** to find the link to
your Pages website.
diff --git a/doc/user/project/pages/getting_started/pages_from_scratch.md b/doc/user/project/pages/getting_started/pages_from_scratch.md
index 3f2df634e3a..8368b38bc80 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -152,7 +152,7 @@ pages:
```
Now save and commit the `.gitlab-ci.yml` file. You can watch the pipeline run
-by going to **CI / CD > Pipelines**.
+by going to **CI/CD > Pipelines**.
When it succeeds, go to **Settings > Pages** to view the URL where your site
is now available.
@@ -396,7 +396,7 @@ but also pushes with **continuous tests** to feature-branches,
For more information, see the following blog posts.
- [Use GitLab CI/CD `environments` to deploy your
- web app to staging and production](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/).
+ web app to staging and production](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/).
- Learn [how to run jobs sequentially,
in parallel, or build a custom pipeline](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/).
- Learn [how to pull specific directories from different projects](https://about.gitlab.com/blog/2016/12/07/building-a-new-gitlab-docs-site-with-nanoc-gitlab-ci-and-gitlab-pages/)
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 6eb06972945..2a0e1207bf5 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -46,9 +46,9 @@ To create a GitLab Pages website:
| Document | Description |
| -------- | ----------- |
-| [Fork a sample project](getting_started/pages_forked_sample_project.md) | Create a new project with Pages already configured by forking a sample project. |
| [Use a new project template](getting_started/pages_new_project_template.md) | Create a new project with Pages already configured by using a new project template. |
| [Use a `.gitlab-ci.yml` template](getting_started/pages_ci_cd_template.md) | Add a Pages site to an existing project. Use a pre-populated CI template file. |
+| [Fork a sample project](getting_started/pages_forked_sample_project.md) | Create a new project with Pages already configured by forking a sample project. |
| [Create a `gitlab-ci.yml` file from scratch](getting_started/pages_from_scratch.md) | Add a Pages site to an existing project. Learn how to create and configure your own CI file. |
To update a GitLab Pages website:
@@ -116,7 +116,7 @@ to use and adapt to your own needs:
- [Posting to your GitLab Pages blog from iOS](https://about.gitlab.com/blog/2016/08/19/posting-to-your-gitlab-pages-blog-from-ios/).
- [GitLab CI: Run jobs sequentially, in parallel, or build a custom pipeline](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/).
-- [GitLab CI: Deployment & environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/).
+- [GitLab CI: Deployment & environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/).
- [Building a new GitLab docs site with Nanoc, GitLab CI, and GitLab Pages](https://about.gitlab.com/blog/2016/12/07/building-a-new-gitlab-docs-site-with-nanoc-gitlab-ci-and-gitlab-pages/).
- [Publish code coverage reports with GitLab Pages](https://about.gitlab.com/blog/2016/11/03/publish-code-coverage-report-with-gitlab-pages/).
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index 4629c87f41e..aef96ff12c9 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -35,7 +35,7 @@ See the [Changelog](#changelog) section for changes over time.
## Configuring protected branches
To protect a branch, you need to have at least Maintainer permission level.
-The `master` branch is protected by default.
+The default branch for your repository is protected by default.
1. In your project, go to **Settings > Repository**.
1. Scroll to find the **Protected branches** section.
@@ -177,6 +177,41 @@ Deleting a protected branch is allowed only by using the web interface; not from
This means that you can't accidentally delete a protected branch from your
command line or a Git client application.
+## Allow force push on protected branches **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15611) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-allow-force-push-on-protected-branches).
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+You can allow force pushes to protected branches by either setting **Allow force push**
+when you protect a new branch, or by configuring an already-protected branch.
+
+To protect a new branch and enable Force push:
+
+1. Navigate to your project's **Settings > Repository**.
+1. Expand **Protected branches**, and scroll to **Protect a branch**.
+ ![Code Owners approval - new protected branch](img/code_owners_approval_new_protected_branch_v13_10.png)
+1. Select a **Branch** or wildcard you'd like to protect.
+1. Select the user levels **Allowed to merge** and **Allowed to push**.
+1. To allow all users with push access to force push, toggle the **Allow force push** slider.
+1. To reject code pushes that change files listed in the `CODEOWNERS` file, toggle
+ **Require approval from code owners**.
+1. Click **Protect**.
+
+To enable force pushes on branches already protected:
+
+1. Navigate to your project's **Settings > Repository**.
+1. Expand **Protected branches** and scroll to **Protected branch**.
+ ![Code Owners approval - branch already protected](img/code_owners_approval_protected_branch_v13_10.png)
+1. Toggle the **Allow force push** slider for the chosen branch.
+
+When enabled, members who are allowed to push to this branch can also force push.
+
## Protected branches approval by Code Owners **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13251) in GitLab Premium 12.4.
@@ -193,14 +228,14 @@ To protect a new branch and enable Code Owner's approval:
1. Scroll down to **Protect a branch**, select a **Branch** or wildcard you'd like to protect, select who's **Allowed to merge** and **Allowed to push**, and toggle the **Require approval from code owners** slider.
1. Click **Protect**.
-![Code Owners approval - new protected branch](img/code_owners_approval_new_protected_branch_v12_4.png)
+![Code Owners approval - new protected branch](img/code_owners_approval_new_protected_branch_v13_10.png)
To enable Code Owner's approval to branches already protected:
1. Navigate to your project's **Settings > Repository** and expand **Protected branches**.
1. Scroll down to **Protected branch** and toggle the **Code owner approval** slider for the chosen branch.
-![Code Owners approval - branch already protected](img/code_owners_approval_protected_branch_v12_4.png)
+![Code Owners approval - branch already protected](img/code_owners_approval_protected_branch_v13_10.png)
When enabled, all merge requests targeting these branches require approval
by a Code Owner per matched rule before they can be merged.
@@ -216,6 +251,25 @@ run CI/CD pipelines and execute actions on jobs that are related to those branch
See [Security on protected branches](../../ci/pipelines/index.md#pipeline-security-on-protected-branches)
for details about the pipelines security model.
+## Enable or disable allow force push on protected branches **(FREE SELF)**
+
+Allow force push on protected branches is under development and not ready for
+production use. It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:allow_force_push_to_protected_branches)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:allow_force_push_to_protected_branches)
+```
+
## Changelog
- **13.5**: [Allow Deploy keys to push to protected branches once more](https://gitlab.com/gitlab-org/gitlab/-/issues/30769).
diff --git a/doc/user/project/push_options.md b/doc/user/project/push_options.md
index f94a4075363..c557c7718c9 100644
--- a/doc/user/project/push_options.md
+++ b/doc/user/project/push_options.md
@@ -34,12 +34,12 @@ git push -o <push_option>
## Push options for GitLab CI/CD
-You can use push options to skip a CI/CD pipeline, or pass environment variables.
+You can use push options to skip a CI/CD pipeline, or pass CI/CD variables.
| Push option | Description | Introduced in version |
| ------------------------------ | ------------------------------------------------------------------------------------------- |---------------------- |
| `ci.skip` | Do not create a CI pipeline for the latest push. | [11.7](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/15643) |
-| `ci.variable="<name>=<value>"` | Provide [environment variables](../../ci/variables/README.md) to be used in a CI pipeline, if one is created due to the push. | [12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/27983) |
+| `ci.variable="<name>=<value>"` | Provide [CI/CD variables](../../ci/variables/README.md) to be used in a CI pipeline, if one is created due to the push. | [12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/27983) |
An example of using `ci.skip`:
@@ -47,7 +47,7 @@ An example of using `ci.skip`:
git push -o ci.skip
```
-An example of passing some environment variables for a pipeline:
+An example of passing some CI/CD variables for a pipeline:
```shell
git push -o ci.variable="MAX_RETRIES=10" -o ci.variable="MAX_TIME=600"
@@ -66,7 +66,7 @@ time as pushing changes:
| `merge_request.remove_source_branch` | Set the merge request to remove the source branch when it's merged. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.title="<title>"` | Set the title of the merge request. Ex: `git push -o merge_request.title="The title I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.description="<description>"` | Set the description of the merge request. Ex: `git push -o merge_request.description="The description I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
-| `merge_request.label="<label>"` | Add labels to the merge request. If the label does not exist, it will be created. For example, for two labels: `git push -o merge_request.label="label1" -o merge_request.label="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
+| `merge_request.label="<label>"` | Add labels to the merge request. If the label does not exist, it is created. For example, for two labels: `git push -o merge_request.label="label1" -o merge_request.label="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
| `merge_request.unlabel="<label>"` | Remove labels from the merge request. For example, for two labels: `git push -o merge_request.unlabel="label1" -o merge_request.unlabel="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
If you use a push option that requires text with spaces in it, you need to enclose it
@@ -108,7 +108,7 @@ option](#push-options-for-merge-requests):
git config --global alias.mwps "push -o merge_request.create -o merge_request.target=master -o merge_request.merge_when_pipeline_succeeds"
```
-Then to quickly push a local branch that will target master and merge when the
+Then to quickly push a local branch that targets the default branch and merges when the
pipeline succeeds:
```shell
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index ac65fabd6a7..284deabb33c 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -5,7 +5,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Quick Actions
+# GitLab quick actions **(FREE)**
> - Introduced in [GitLab 12.1](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26672):
> once an action is executed, an alert appears when a quick action is successfully applied.
@@ -15,114 +15,113 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> `/` into a description or comment field, all available quick actions are displayed in a scrollable list.
> - The rebase quick action was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49800) in GitLab 13.8.
-Quick actions are textual shortcuts for common actions on issues, epics, merge requests,
-and commits that are usually done by clicking buttons or dropdowns in the GitLab UI.
-You can enter these commands in the description or in comments of issues, epics, merge requests, and commits.
-Each command should be on a separate line in order to be properly detected and executed.
-
-## Quick Actions for issues, merge requests and epics
-
-The following quick actions are applicable to descriptions, discussions and threads in:
-
-- Issues
-- Merge requests
-- Epics **(PREMIUM)**
-
-| Command | Issue | Merge request | Epic | Action |
-| :------------------------------------ | :---- | :------------ | :--- | :------------------------------------------------------------------------------------------------------------------------------ |
-| `/approve` | | ✓ | | Approve the merge request. **(STARTER)** |
-| `/assign @user` | ✓ | ✓ | | Assign one user. |
-| `/assign @user1 @user2` | ✓ | ✓ | | Assign multiple users. **(STARTER)** |
-| `/assign me` | ✓ | ✓ | | Assign yourself. |
-| `/assign_reviewer @user` or `/reviewer @user` or `/request_review @user` | | ✓ | | Assign one user as a reviewer. |
-| `/assign_reviewer @user1 @user2` or `/reviewer @user1 @user2` or `/request_review @user1 @user2` | | ✓ | | Assign multiple users as reviewers. **(STARTER)** |
-| `/assign_reviewer me` or `/reviewer me` or `/request_review me` | | ✓ | | Assign yourself as a reviewer. |
-| `/award :emoji:` | ✓ | ✓ | ✓ | Toggle emoji award. |
-| `/child_epic <epic>` | | | ✓ | Add child epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). **(ULTIMATE)** |
-| `/clear_weight` | ✓ | | | Clear weight. **(STARTER)** |
-| `/clone <path/to/project> [--with_notes]`| ✓ | | | Clone the issue to given project, or the current one if no arguments are given ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9421) in GitLab 13.7). Copies as much data as possible as long as the target project contains equivalent labels, milestones, and so on. Does not copy comments or system notes unless `--with_notes` is provided as an argument. |
-| `/close` | ✓ | ✓ | ✓ | Close. |
-| `/confidential` | ✓ | | | Make confidential. |
-| `/copy_metadata <!merge_request>` | ✓ | ✓ | | Copy labels and milestone from another merge request in the project. |
-| `/copy_metadata <#issue>` | ✓ | ✓ | | Copy labels and milestone from another issue in the project. |
-| `/create_merge_request <branch name>` | ✓ | | | Create a new merge request starting from the current issue. |
-| `/done` | ✓ | ✓ | ✓ | Mark to do as done. |
-| `/draft` | | ✓ | | Toggle the draft status. |
-| `/due <date>` | ✓ | | | Set due date. Examples of valid `<date>` include `in 2 days`, `this Friday` and `December 31st`. |
-| `/duplicate <#issue>` | ✓ | | | Close this issue and mark as a duplicate of another issue. **(FREE)** Also, mark both as related. **(STARTER)** |
-| `/epic <epic>` | ✓ | | | Add to epic `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic. **(PREMIUM)** |
-| `/estimate <<W>w <DD>d <hh>h <mm>m>` | ✓ | ✓ | | Set time estimate. For example, `/estimate 1w 3d 2h 14m`. |
-| `/iteration *iteration:"iteration name"` | ✓ | | | Set iteration. For example, to set the `Late in July` iteration: `/iteration *iteration:"Late in July"` ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)). **(STARTER)** |
-| `/label ~label1 ~label2` | ✓ | ✓ | ✓ | Add one or more labels. Label names can also start without a tilde (`~`), but mixed syntax is not supported. |
-| `/lock` | ✓ | ✓ | | Lock the discussions. |
-| `/merge` | | ✓ | | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), adding to a [Merge Train](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md), etc. |
-| `/milestone %milestone` | ✓ | ✓ | | Set milestone. |
-| `/move <path/to/project>` | ✓ | | | Move this issue to another project. |
-| `/parent_epic <epic>` | | | ✓ | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). **(ULTIMATE)** |
-| `/promote` | ✓ | | | Promote issue to epic. **(PREMIUM)** |
-| `/publish` | ✓ | | | Publish issue to an associated [Status Page](../../operations/incident_management/status_page.md) ([Introduced in GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30906)) **(ULTIMATE)** |
-| `/reassign @user1 @user2` | ✓ | ✓ | | Replace current assignees with those specified. **(STARTER)** |
-| `/rebase` | | ✓ | | Rebase source branch. This schedules a background task that attempts to rebase the changes in the source branch on the latest commit of the target branch. If `/rebase` is used, `/merge` is ignored to avoid a race condition where the source branch is merged or deleted before it is rebased. If there are merge conflicts, GitLab displays a message that a rebase cannot be scheduled. Rebase failures are displayed with the merge request status. |
-| `/reassign_reviewer @user1 @user2` | | ✓ | | Replace current reviewers with those specified. **(STARTER)** |
-| `/relabel ~label1 ~label2` | ✓ | ✓ | ✓ | Replace current labels with those specified. |
-| `/relate #issue1 #issue2` | ✓ | | | Mark issues as related. **(STARTER)** |
-| `/remove_child_epic <epic>` | | | ✓ | Remove child epic from `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). **(ULTIMATE)** |
-| `/remove_due_date` | ✓ | | | Remove due date. |
-| `/remove_epic` | ✓ | | | Remove from epic. **(PREMIUM)** |
-| `/remove_estimate` | ✓ | ✓ | | Remove time estimate. |
-| `/remove_iteration` | ✓ | | | Remove iteration ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)) **(STARTER)** |
-| `/remove_milestone` | ✓ | ✓ | | Remove milestone. |
-| `/remove_parent_epic` | | | ✓ | Remove parent epic from epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). **(ULTIMATE)** |
-| `/remove_time_spent` | ✓ | ✓ | | Remove time spent. |
-| `/remove_zoom` | ✓ | | | Remove Zoom meeting from this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
-| `/reopen` | ✓ | ✓ | ✓ | Reopen. |
-| `/shrug <comment>` | ✓ | ✓ | ✓ | Append the comment with `¯\_(ツ)_/¯`. |
-| `/spend <time(-<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | ✓ | ✓ | | Subtract spent time. Optionally, specify the date that time was spent on. For example, `/spend time(-1h 30m)` or `/spend time(-1h 30m) date(2018-08-26)`. |
-| `/spend <time(<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | ✓ | ✓ | | Add spent time. Optionally, specify the date that time was spent on. For example, `/spend time(1h 30m)` or `/spend time(1h 30m) date(2018-08-26)`. |
-| `/submit_review` | | ✓ | | Submit a pending review ([introduced in GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/8041)). **(PREMIUM)** |
-| `/subscribe` | ✓ | ✓ | ✓ | Subscribe to notifications. |
-| `/tableflip <comment>` | ✓ | ✓ | ✓ | Append the comment with `(╯°□°)╯︵ ┻━┻`. |
-| `/target_branch <local branch name>` | | ✓ | | Set target branch. |
-| `/title <new title>` | ✓ | ✓ | ✓ | Change title. |
-| `/todo` | ✓ | ✓ | ✓ | Add a to-do item. |
-| `/unassign @user1 @user2` | ✓ | ✓ | | Remove specific assignees. **(STARTER)** |
-| `/unassign` | | ✓ | | Remove all assignees. |
-| `/unassign_reviewer @user1 @user2` or `/remove_reviewer @user1 @user2` | | ✓ | | Remove specific reviewers. **(STARTER)** |
-| `/unassign_reviewer` or `/remove_reviewer` | | ✓ | | Remove all reviewers. |
-| `/unlabel ~label1 ~label2` or `/remove_label ~label1 ~label2` | ✓ | ✓ | ✓ | Remove specified labels. |
-| `/unlabel` or `/remove_label` | ✓ | ✓ | ✓ | Remove all labels. |
-| `/unlock` | ✓ | ✓ | | Unlock the discussions. |
-| `/unsubscribe` | ✓ | ✓ | ✓ | Unsubscribe from notifications. |
-| `/weight <value>` | ✓ | | | Set weight. Valid options for `<value>` include `0`, `1`, `2`, and so on. **(STARTER)** |
-| `/wip` | | ✓ | | Toggle the draft status. |
-| `/zoom <Zoom URL>` | ✓ | | | Add Zoom meeting to this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
-
-## Autocomplete characters
-
-Many quick actions require a parameter, for example: username, milestone, and
-label. [Autocomplete characters](autocomplete_characters.md) can make it easier
-to enter a parameter, compared to selecting items from a list.
-
-## Quick actions parameters
-
-The easiest way to set parameters for quick actions is to use autocomplete. If
-you manually enter a parameter, it must be enclosed in double quotation marks
+Quick actions are text-based shortcuts for common actions that are usually done
+by selecting buttons or dropdowns in the GitLab user interface. You can enter
+these commands in the descriptions or comments of issues, epics, merge requests,
+and commits.
+
+Be sure to enter each quick action on a separate line to allow GitLab to
+properly detect and execute the commands.
+
+## Parameters
+
+Many quick actions require a parameter. For example, the `/assign` quick action
+requires a username. GitLab uses [autocomplete characters](autocomplete_characters.md)
+with quick actions to help users enter parameters, by providing a list of
+available values.
+
+If you manually enter a parameter, it must be enclosed in double quotation marks
(`"`), unless it contains only these characters:
-1. ASCII letters.
-1. Numerals (0-9).
-1. Underscore (`_`), hyphen (`-`), question mark (`?`), dot (`.`), or ampersand (`&`).
+- ASCII letters
+- Numbers (0-9)
+- Underscore (`_`), hyphen (`-`), question mark (`?`), dot (`.`), or ampersand (`&`)
-Parameters are also case-sensitive. Autocomplete handles this, and the insertion
+Parameters are case-sensitive. Autocomplete handles this, and the insertion
of quotation marks, automatically.
-## Quick actions for commit messages
+## Issues, merge requests, and epics
+
+The following quick actions are applicable to descriptions, discussions, and
+threads. Some quick actions might not be available to all subscription tiers.
+
+| Command | Issue | Merge request | Epic | Action |
+|:--------------------------------------|:-----------------------|:-----------------------|:-----------------------|:-------|
+| `/approve` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Approve the merge request. |
+| `/assign @user` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign one user. |
+| `/assign @user1 @user2` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign multiple users. |
+| `/assign me` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign yourself. |
+| `/assign_reviewer @user` or `/reviewer @user` or `/request_review @user` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign one user as a reviewer. |
+| `/assign_reviewer @user1 @user2` or `/reviewer @user1 @user2` or `/request_review @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign multiple users as reviewers. |
+| `/assign_reviewer me` or `/reviewer me` or `/request_review me` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign yourself as a reviewer. |
+| `/award :emoji:` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Toggle emoji award. |
+| `/child_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Add child epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). |
+| `/clear_weight` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Clear weight. |
+| `/clone <path/to/project> [--with_notes]`| **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Clone the issue to given project, or the current one if no arguments are given ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9421) in GitLab 13.7). Copies as much data as possible as long as the target project contains equivalent labels, milestones, and so on. Does not copy comments or system notes unless `--with_notes` is provided as an argument. |
+| `/close` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Close. |
+| `/confidential` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Make confidential. |
+| `/copy_metadata <!merge_request>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Copy labels and milestone from another merge request in the project. |
+| `/copy_metadata <#issue>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Copy labels and milestone from another issue in the project. |
+| `/create_merge_request <branch name>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Create a new merge request starting from the current issue. |
+| `/done` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Mark to do as done. |
+| `/draft` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Toggle the draft status. |
+| `/due <date>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set due date. Examples of valid `<date>` include `in 2 days`, `this Friday` and `December 31st`. |
+| `/duplicate <#issue>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Close this issue and mark as a duplicate of another issue. **(FREE)** Also, mark both as related. |
+| `/epic <epic>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add to epic `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic. |
+| `/estimate <<W>w <DD>d <hh>h <mm>m>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set time estimate. For example, `/estimate 1w 3d 2h 14m`. |
+| `/invite_email email1 email2` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add up to six email participants. This action is behind feature flag `issue_email_participants`. |
+| `/iteration *iteration:"iteration name"` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set iteration. For example, to set the `Late in July` iteration: `/iteration *iteration:"Late in July"` ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)). |
+| `/label ~label1 ~label2` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Add one or more labels. Label names can also start without a tilde (`~`), but mixed syntax is not supported. |
+| `/lock` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Lock the discussions. |
+| `/merge` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), or adding to a [Merge Train](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md). |
+| `/milestone %milestone` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set milestone. |
+| `/move <path/to/project>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Move this issue to another project. |
+| `/parent_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). |
+| `/promote` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to epic. |
+| `/publish` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Publish issue to an associated [Status Page](../../operations/incident_management/status_page.md) ([Introduced in GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30906)) |
+| `/reassign @user1 @user2` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Replace current assignees with those specified. |
+| `/rebase` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Rebase source branch. This schedules a background task that attempts to rebase the changes in the source branch on the latest commit of the target branch. If `/rebase` is used, `/merge` is ignored to avoid a race condition where the source branch is merged or deleted before it is rebased. If there are merge conflicts, GitLab displays a message that a rebase cannot be scheduled. Rebase failures are displayed with the merge request status. |
+| `/reassign_reviewer @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Replace current reviewers with those specified. |
+| `/relabel ~label1 ~label2` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Replace current labels with those specified. |
+| `/relate #issue1 #issue2` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Mark issues as related. |
+| `/remove_child_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Remove child epic from `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). |
+| `/remove_due_date` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove due date. |
+| `/remove_epic` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove from epic. |
+| `/remove_estimate` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove time estimate. |
+| `/remove_iteration` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove iteration ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)). |
+| `/remove_milestone` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove milestone. |
+| `/remove_parent_epic` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Remove parent epic from epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). |
+| `/remove_time_spent` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove time spent. |
+| `/remove_zoom` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove Zoom meeting from this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
+| `/reopen` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Reopen. |
+| `/shrug <comment>` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Append the comment with `¯\_(ツ)_/¯`. |
+| `/spend <time(-<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Subtract spent time. Optionally, specify the date that time was spent on. For example, `/spend time(-1h 30m)` or `/spend time(-1h 30m) date(2018-08-26)`. |
+| `/spend <time(<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Add spent time. Optionally, specify the date that time was spent on. For example, `/spend time(1h 30m)` or `/spend time(1h 30m) date(2018-08-26)`. |
+| `/submit_review` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Submit a pending review ([introduced in GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/8041)). |
+| `/subscribe` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Subscribe to notifications. |
+| `/tableflip <comment>` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Append the comment with `(╯°□°)╯︵ ┻━┻`. |
+| `/target_branch <local branch name>` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Set target branch. |
+| `/title <new title>` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Change title. |
+| `/todo` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Add a to-do item. |
+| `/unassign @user1 @user2` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove specific assignees. |
+| `/unassign` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove all assignees. |
+| `/unassign_reviewer @user1 @user2` or `/remove_reviewer @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove specific reviewers. |
+| `/unassign_reviewer` or `/remove_reviewer` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove all reviewers. |
+| `/unlabel ~label1 ~label2` or `/remove_label ~label1 ~label2` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Remove specified labels. |
+| `/unlabel` or `/remove_label` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Remove all labels. |
+| `/unlock` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Unlock the discussions. |
+| `/unsubscribe` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Unsubscribe from notifications. |
+| `/weight <value>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set weight. Valid options for `<value>` include `0`, `1`, `2`, and so on. |
+| `/wip` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Toggle the draft status. |
+| `/zoom <Zoom URL>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add Zoom meeting to this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
+
+## Commit messages
The following quick actions are applicable for commit messages:
| Command | Action |
-| :---------------------- | :---------------------------------------- |
-| `/tag v1.2.3 <message>` | Tags this commit with an optional message |
+|:----------------------- |:------------------------------------------|
+| `/tag v1.2.3 <message>` | Tags the commit with an optional message. |
<!-- ## Troubleshooting
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index b5751797870..7348e17a017 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -66,14 +66,11 @@ To create a new release through the GitLab UI:
1. Navigate to **Project overview > Releases** and click the **New release**
button.
-1. In the [**Tag name**](#tag-name) box, enter a name.
-
- Creating a release based on an existing tag using the user
- interface is not yet supported. However, this is possible using the
- [Releases API](../../../api/releases/index.md#create-a-release).
-
-1. In the **Create from** list, select a branch, tag, or commit SHA to use when
- creating the new tag.
+1. Open the [**Tag name**](#tag-name) dropdown. Select an existing tag or type
+ in a new tag name. Selecting an existing tag that is already associated with
+ a release will result in a validation error.
+1. If creating a new tag, open the **Create from** dropdown. Select a
+ branch, tag, or commit SHA to use when creating the new tag.
1. Optionally, fill out any additional information about the release, such as its
[title](#title), [milestones](#associate-milestones-with-a-release),
[release notes](#release-notes-description), or [assets links](#links).
@@ -214,7 +211,7 @@ To set a deploy freeze window in the UI, complete these steps:
1. Sign in to GitLab as a user with project Maintainer [permissions](../../permissions.md).
1. Navigate to **Project overview**.
-1. In the left navigation menu, navigate to **Settings > CI / CD**.
+1. In the left navigation menu, navigate to **Settings > CI/CD**.
1. Scroll to **Deploy freezes**.
1. Click **Expand** to see the deploy freeze table.
1. Click **Add deploy freeze** to open the deploy freeze modal.
@@ -475,7 +472,7 @@ terminal.
Read the [Release CLI documentation](https://gitlab.com/gitlab-org/release-cli/-/blob/master/docs/index.md)
for details.
-## Release Metrics **(PREMIUM)**
+## Release Metrics **(ULTIMATE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259703) in GitLab Premium 13.9.
diff --git a/doc/user/project/repository/branches/img/branch_filter_search_box.png b/doc/user/project/repository/branches/img/branch_filter_search_box.png
deleted file mode 100644
index 5dc300cf24e..00000000000
--- a/doc/user/project/repository/branches/img/branch_filter_search_box.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.png b/doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.png
new file mode 100644
index 00000000000..da7d5268b3b
--- /dev/null
+++ b/doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.png
Binary files differ
diff --git a/doc/user/project/repository/branches/img/compare_branches.png b/doc/user/project/repository/branches/img/compare_branches.png
deleted file mode 100644
index e6f88da4989..00000000000
--- a/doc/user/project/repository/branches/img/compare_branches.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/branches/img/compare_branches_v13_10.png b/doc/user/project/repository/branches/img/compare_branches_v13_10.png
new file mode 100644
index 00000000000..2b9a5751938
--- /dev/null
+++ b/doc/user/project/repository/branches/img/compare_branches_v13_10.png
Binary files differ
diff --git a/doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.png b/doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.png
new file mode 100644
index 00000000000..fdda3858c3b
--- /dev/null
+++ b/doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.png
Binary files differ
diff --git a/doc/user/project/repository/branches/index.md b/doc/user/project/repository/branches/index.md
index 4d0cf28593d..d049b2108ee 100644
--- a/doc/user/project/repository/branches/index.md
+++ b/doc/user/project/repository/branches/index.md
@@ -64,7 +64,7 @@ against accidental deletion and forced pushes.
By default, when you create a new project in GitLab, the initial branch is called `master`.
For self-managed instances, a GitLab administrator can customize the initial branch name to something
-else. This way, every new project created from then on will start from the custom branch name rather than `master`. To do so:
+else. This way, every new project created from then on starts from the custom branch name rather than `master`. To do so:
1. Go to the **Admin Area > Settings > Repository** and expand **Default initial
branch name**.
@@ -96,10 +96,11 @@ To compare branches in a repository:
1. Navigate to your project's repository.
1. Select **Repository > Compare** in the sidebar.
-1. Select branches to compare using the [branch filter search box](#branch-filter-search-box)
+1. Select the target repository to compare with the [repository filter search box](#repository-filter-search-box).
+1. Select branches to compare using the [branch filter search box](#branch-filter-search-box).
1. Click **Compare** to view the changes inline:
-![compare branches](img/compare_branches.png)
+ ![compare branches](img/compare_branches_v13_10.png)
## Delete merged branches
@@ -108,17 +109,30 @@ To compare branches in a repository:
![Delete merged branches](img/delete_merged_branches.png)
This feature allows merged branches to be deleted in bulk. Only branches that
-have been merged and [are not protected](../../protected_branches.md) will be deleted as part of
+have been merged and [are not protected](../../protected_branches.md) are deleted as part of
this operation.
It's particularly useful to clean up old branches that were not deleted
automatically when a merge request was merged.
+## Repository filter search box
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52967) in GitLab 13.10.
+
+This feature allows you to search and select a repository quickly when [comparing branches](#compare).
+
+![Repository filter search box](img/repository_filter_search_box_v13_10.png)
+
+Search results appear in the following order:
+
+- Repositories with names exactly matching the search terms.
+- Other repositories with names that include search terms, sorted alphabetically.
+
## Branch filter search box
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22166) in GitLab 11.5.
-![Branch filter search box](img/branch_filter_search_box.png)
+![Branch filter search box](img/branch_filter_search_box_v13_10.png)
This feature allows you to search and select branches quickly. Search results appear in the following order:
@@ -127,8 +141,8 @@ This feature allows you to search and select branches quickly. Search results ap
Sometimes when you have hundreds of branches you may want a more flexible matching pattern. In such cases you can use the following:
-- `^feature` will only match branch names that begin with 'feature'.
-- `feature$` will only match branch names that end with 'feature'.
+- `^feature` matches only branch names that begin with 'feature'.
+- `feature$` matches only branch names that end with 'feature'.
<!-- ## Troubleshooting
diff --git a/doc/user/project/repository/file_finder.md b/doc/user/project/repository/file_finder.md
index df3e24fbf30..3af7a5045c4 100644
--- a/doc/user/project/repository/file_finder.md
+++ b/doc/user/project/repository/file_finder.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
disqus_identifier: 'https://docs.gitlab.com/ee/workflow/file_finder.html'
---
-# File finder
+# File finder **(FREE)**
> [Introduced](https://github.com/gitlabhq/gitlabhq/pull/9889) in GitLab 8.4.
diff --git a/doc/user/project/repository/forking_workflow.md b/doc/user/project/repository/forking_workflow.md
index 1a5e169ec6b..c8922890deb 100644
--- a/doc/user/project/repository/forking_workflow.md
+++ b/doc/user/project/repository/forking_workflow.md
@@ -31,25 +31,25 @@ Forking a project is, in most cases, a two-step process.
![Choose namespace](img/forking_workflow_choose_namespace_v13_2.png)
-The fork is created. The permissions you have in the namespace are the permissions you will have in the fork.
+The fork is created. The permissions you have in the namespace are your permissions in the fork.
WARNING:
-When a public project with the repository feature set to "Members
-only" is forked, the repository will be public in the fork. The owner
-of the fork will need to manually change the visibility. This is being
+When a public project with the repository feature set to **Members Only**
+is forked, the repository is public in the fork. The owner
+of the fork must manually change the visibility. This is being
fixed in [#36662](https://gitlab.com/gitlab-org/gitlab/-/issues/36662).
## Repository mirroring
You can use [repository mirroring](repository_mirroring.md) to keep your fork synced with the original repository. You can also use `git remote add upstream` to achieve the same result.
-The main difference is that with repository mirroring your remote fork will be automatically kept up-to-date.
+The main difference is that with repository mirroring, your remote fork is automatically kept up-to-date.
-Without mirroring, to work locally you'll have to use `git pull` to update your local repository
+Without mirroring, to work locally you must use `git pull` to update your local repository
with the upstream project, then push the changes back to your fork to update it.
WARNING:
-With mirroring, before approving a merge request, you'll likely be asked to sync; hence automating it is recommended.
+With mirroring, before approving a merge request, you are asked to sync. Because of this, automating it is recommended.
Read more about [How to keep your fork up to date with its origin](https://about.gitlab.com/blog/2016/12/01/how-to-keep-your-fork-up-to-date-with-its-origin/).
@@ -60,7 +60,7 @@ When you are ready to send your code back to the upstream project,
choose your forked project's branch. For **Target branch**, choose the original project's branch.
NOTE:
-When creating a merge request, if the forked project's visibility is more restrictive than the parent project (for example the fork is private, the parent is public), the target branch will default to the forked project's default branch. This prevents potentially exposing the private code of the forked project.
+When creating a merge request, if the forked project's visibility is more restrictive than the parent project (for example the fork is private, the parent is public), the target branch defaults to the forked project's default branch. This prevents potentially exposing the private code of the forked project.
![Selecting branches](img/forking_workflow_branch_select.png)
diff --git a/doc/user/project/repository/git_blame.md b/doc/user/project/repository/git_blame.md
index 81995291911..0f49932d0c6 100644
--- a/doc/user/project/repository/git_blame.md
+++ b/doc/user/project/repository/git_blame.md
@@ -18,13 +18,12 @@ You can find the **Blame** button with each file in a project.
![File blame button](img/file_blame_button_v12_6.png "Blame button")
-When you select the **Blame** button, you'll see a screen with the
-noted information:
+When you select the **Blame** button, this information is shown:
![Git blame output](img/file_blame_output_v12_6.png "Blame button output")
-If you hover over a commit in the UI, you'll see a precise date and time
-for that commit.
+If you hover over a commit in the UI, the commit's precise date and time
+are shown.
## Blame previous commit
@@ -45,7 +44,7 @@ about a `README.md` file in the local directory, run the following command:
git blame README.md
```
-You'll see output similar to the following, which includes the commit time
+The output looks similar to the following, which includes the commit time
in UTC format:
```shell
diff --git a/doc/user/project/repository/git_history.md b/doc/user/project/repository/git_history.md
index 2e27cab4177..1b30a0b0f5f 100644
--- a/doc/user/project/repository/git_history.md
+++ b/doc/user/project/repository/git_history.md
@@ -17,13 +17,12 @@ You can find the **History** button with each file in a project.
![File history button](img/file_history_button_v12_6.png "History button")
-When you select the **History** button, you'll see a screen with the
-noted information:
+When you select the **History** button, this information displays:
![Git log output](img/file_history_output_v12_6.png "History button output")
-If you hover over a commit in the UI, you'll see a precise date and time
-that commit was last modified.
+If you hover over a commit in the UI, the precise date and time of the commit modification
+are shown.
## Associated `git` command
@@ -36,7 +35,7 @@ following command:
git log README.md
```
-You'll see output similar to the following, which includes the commit
+Git displays output similar to the following, which includes the commit
time in UTC format:
```shell
diff --git a/doc/user/project/repository/gpg_signed_commits/index.md b/doc/user/project/repository/gpg_signed_commits/index.md
index 1a46c140507..c41b3ed8615 100644
--- a/doc/user/project/repository/gpg_signed_commits/index.md
+++ b/doc/user/project/repository/gpg_signed_commits/index.md
@@ -40,7 +40,7 @@ For a commit to be verified by GitLab:
## Generating a GPG key
-If you don't already have a GPG key, the following steps will help you get
+If you don't already have a GPG key, the following steps can help you get
started:
1. [Install GPG](https://www.gnupg.org/download/index.html) for your operating system.
@@ -225,8 +225,8 @@ git config --global commit.gpgsign true
## Verifying commits
1. Within a project or [merge request](../../merge_requests/index.md), navigate to
- the **Commits** tab. Signed commits will show a badge containing either
- "Verified" or "Unverified", depending on the verification status of the GPG
+ the **Commits** tab. Signed commits show a badge containing either
+ **Verified** or **Unverified**, depending on the verification status of the GPG
signature.
![Signed and unsigned commits](img/project_signed_and_unsigned_commits.png)
@@ -240,8 +240,8 @@ git config --global commit.gpgsign true
## Revoking a GPG key
Revoking a key **unverifies** already signed commits. Commits that were
-verified by using this key will change to an unverified state. Future commits
-will also stay unverified once you revoke this key. This action should be used
+verified by using this key changes to an unverified state. Future commits
+stay unverified after you revoke this key. This action should be used
in case your key has been compromised.
To revoke a GPG key:
@@ -282,6 +282,7 @@ For more details about GPG, see:
- [Managing OpenPGP Keys](https://riseup.net/en/security/message-security/openpgp/gpg-keys)
- [OpenPGP Best Practices](https://riseup.net/en/security/message-security/openpgp/best-practices)
- [Creating a new GPG key with subkeys](https://www.void.gr/kargig/blog/2013/12/02/creating-a-new-gpg-key-with-subkeys/) (advanced)
+- [Review existing GPG keys in your instance](../../../admin_area/credentials_inventory.md#review-existing-gpg-keys)
<!-- ## Troubleshooting
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 5a915ebef89..b9145364e3b 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -19,8 +19,8 @@ To create a new repository, all you need to do is
Once you create a new project, you can add new files via UI
(read the section below) or via command line.
-To add files from the command line, follow the instructions that will
-be presented on the screen when you create a new project, or read
+To add files from the command line, follow the instructions
+presented on the screen when you create a new project, or read
through them in the [command line basics](../../../gitlab-basics/start-using-git.md)
documentation.
@@ -31,8 +31,7 @@ that you [connect with GitLab via SSH](../../../ssh/README.md).
## Files
Use a repository to store your files in GitLab. In [GitLab 12.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/33806),
-you'll see on the repository's file tree an icon next to the filename
-according to its extension:
+an icon identifying the extension is shown next to the filename:
![Repository file icons](img/file_ext_icons_repo_v12_10.png)
@@ -76,7 +75,7 @@ markup languages](https://en.wikipedia.org/wiki/Lightweight_markup_language))
that you can use for the content of your files in a repository. They are mostly
used for documentation purposes.
-Just pick the right extension for your files and GitLab will render them
+Just pick the right extension for your files and GitLab renders them
according to the markup language.
| Markup language | Extensions |
@@ -93,7 +92,7 @@ according to the markup language.
### Repository README and index files
-When a `README` or `index` file is present in a repository, its contents will be
+When a `README` or `index` file is present in a repository, its contents are
automatically pre-rendered by GitLab without opening it.
They can either be plain text or have an extension of a
@@ -101,12 +100,12 @@ They can either be plain text or have an extension of a
Some things to note about precedence:
-1. When both a `README` and an `index` file are present, the `README` will always
- take precedence.
+1. When both a `README` and an `index` file are present, the `README` always
+ takes precedence.
1. When more than one file is present with different extensions, they are
- ordered alphabetically, with the exception of a file without an extension
- which will always be last in precedence. For example, `README.adoc` will take
- precedence over `README.md`, and `README.rst` will take precedence over
+ ordered alphabetically, with the exception of a file without an extension,
+ which is always last in precedence. For example, `README.adoc` takes
+ precedence over `README.md`, and `README.rst` takes precedence over
`README`.
### Jupyter Notebook files
@@ -159,18 +158,18 @@ Via command line, you can commit multiple times before pushing.
- **Commit message:**
A commit message is important to identity what is being changed and,
more importantly, why. In GitLab, you can add keywords to the commit
- message that will perform one of the actions below:
+ message that performs one of the actions below:
- **Trigger a GitLab CI/CD pipeline:**
If you have your project configured with [GitLab CI/CD](../../../ci/README.md),
- you will trigger a pipeline per push, not per commit.
+ you trigger a pipeline per push, not per commit.
- **Skip pipelines:**
- You can add to you commit message the keyword
- [`[ci skip]`](../../../ci/yaml/README.md#skip-pipeline)
- and GitLab CI/CD will skip that pipeline.
+ You can add to your commit message the keyword
+ [`[ci skip]`](../../../ci/yaml/README.md#skip-pipeline),
+ and GitLab CI/CD skips that pipeline.
- **Cross-link issues and merge requests:**
[Cross-linking](../issues/crosslinking_issues.md#from-commit-messages)
is great to keep track of what's is somehow related in your workflow.
- If you mention an issue or a merge request in a commit message, they will be shown
+ If you mention an issue or a merge request in a commit message, they are shown
on their respective thread.
- **Cherry-pick a commit:**
In GitLab, you can
@@ -211,9 +210,9 @@ Find it under your project's **Repository > Graph**.
## Repository Languages
-For the default branch of each repository, GitLab will determine what programming languages
-were used and display this on the projects pages. If this information is missing, it will
-be added after updating the default branch on the project. This process can take up to 5
+For the default branch of each repository, GitLab determines what programming languages
+were used and displays this on the project's pages. If this information is missing, it's
+added after updating the default branch for the project. This process can take up to five
minutes.
![Repository Languages bar](img/repository_languages_v12_2.gif)
@@ -253,8 +252,8 @@ into Xcode on macOS. To do that:
1. Click **Clone**.
1. Select **Xcode**.
-The project will be cloned onto your computer in a folder of your choice and you'll
-be prompted to open in XCode.
+The project is cloned onto your computer in a folder of your choice and you are
+prompted to open XCode.
### Clone and open in Visual Studio Code
@@ -264,10 +263,10 @@ All projects can be cloned into Visual Studio Code. To do that:
1. From the GitLab UI, go to the project's overview page.
1. Click **Clone**.
-1. Select **VS Code**
+1. Select **VS Code**.
+1. Select a folder to clone the project into.
-You'll be prompted to select a folder to clone the project into. When VS Code has
-successfully cloned your project, it will open the folder.
+When VS Code has successfully cloned your project, it opens the folder.
## Download Source Code
@@ -275,7 +274,7 @@ successfully cloned your project, it will open the folder.
> - Support for [including Git LFS blobs](../../../topics/git/lfs#lfs-objects-in-project-archives) was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15079) in GitLab 13.5.
The source code stored in a repository can be downloaded from the UI.
-By clicking the download icon, a dropdown will open with links to download the following:
+By clicking the download icon, a dropdown opens with links to download the following:
![Download source code](img/download_source_code.png)
@@ -297,8 +296,8 @@ and Git push/pull redirects.
Depending on the situation, different things apply.
-When [renaming a user](../../profile/index.md#changing-your-username),
-[changing a group path](../../group/index.md#changing-a-groups-path) or [renaming a repository](../settings/index.md#renaming-a-repository):
+When [renaming a user](../../profile/index.md#change-your-username),
+[changing a group path](../../group/index.md#change-a-groups-path) or [renaming a repository](../settings/index.md#renaming-a-repository):
- Existing web URLs for the namespace and anything under it (such as projects) will
redirect to the new URLs.
diff --git a/doc/user/project/repository/jupyter_notebooks/index.md b/doc/user/project/repository/jupyter_notebooks/index.md
index 123df9097f9..e4a3e6d6ef1 100644
--- a/doc/user/project/repository/jupyter_notebooks/index.md
+++ b/doc/user/project/repository/jupyter_notebooks/index.md
@@ -12,12 +12,12 @@ type: reference
interactive computing in many fields and contain a complete record of the
user's sessions and include code, narrative text, equations, and rich output.
-When added to a repository, Jupyter Notebooks with a `.ipynb` extension will be
+When added to a repository, Jupyter Notebooks with a `.ipynb` extension are
rendered to HTML when viewed.
![Jupyter Notebook Rich Output](img/jupyter_notebook.png)
-Interactive features, including JavaScript plots, will not work when viewed in
+Interactive features, including JavaScript plots, don't work when viewed in
GitLab.
## Jupyter Hub as a GitLab Managed App
diff --git a/doc/user/project/repository/repository_mirroring.md b/doc/user/project/repository/repository_mirroring.md
index 4d5e4a5ef02..980c5417da6 100644
--- a/doc/user/project/repository/repository_mirroring.md
+++ b/doc/user/project/repository/repository_mirroring.md
@@ -7,19 +7,19 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.htm
# Repository mirroring **(FREE)**
-Repository mirroring allows for mirroring of repositories to and from external sources. It can be
-used to mirror branches, tags, and commits between repositories. It is useful when you want to use
+Repository mirroring allows for the mirroring of repositories to and from external sources. You
+can use it to mirror branches, tags, and commits between repositories. It's useful when you want to use
a repository outside of GitLab.
-A repository mirror at GitLab will be updated automatically. You can also manually trigger an update
-at most once every 5 minutes on GitLab.com with [the limit set by the administrator on self-managed instances](../../../administration/instance_limits.md#pull-mirroring-interval).
+A repository mirror at GitLab updates automatically. You can also manually trigger an update
+at most once every five minutes on GitLab.com with [the limit set by the administrator on self-managed instances](../../../administration/instance_limits.md#pull-mirroring-interval).
There are two kinds of repository mirroring supported by GitLab:
- [Push](#pushing-to-a-remote-repository): for mirroring a GitLab repository to another location. **(FREE)**
- [Pull](#pulling-from-a-remote-repository): for mirroring a repository from another location to GitLab. **(PREMIUM)**
-When the mirror repository is updated, all new branches, tags, and commits will be visible in the
+When the mirror repository is updated, all new branches, tags, and commits are visible in the
project's activity feed.
Users with at least [Developer access](../../permissions.md) to the project can also force an
@@ -37,7 +37,7 @@ The following are some possible use cases for repository mirroring:
- You migrated to GitLab but still need to keep your project in another source. In that case, you
can simply set it up to mirror to GitLab (pull) and all the essential history of commits, tags,
- and branches will be available in your GitLab instance. **(PREMIUM)**
+ and branches are available in your GitLab instance. **(PREMIUM)**
- You have old projects in another source that you don't use actively anymore, but don't want to
remove for archiving purposes. In that case, you can create a push mirror so that your active
GitLab repository can push its changes to the old location.
@@ -49,25 +49,23 @@ The following are some possible use cases for repository mirroring:
## Pushing to a remote repository **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/249) in GitLab Enterprise Edition 8.7.
-> - [Moved to GitLab Free](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18715) in 10.8.
-> - [LFS support over HTTPS added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in 13.5
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in GitLab 13.5: LFS support over HTTPS.
For an existing project, you can set up push mirroring as follows:
-1. Navigate to your project's **Settings > Repository** and expand the **Mirroring repositories** section.
+1. In your project, go to **Settings > Repository**, and then expand the **Mirroring repositories** section.
1. Enter a repository URL.
-1. Select **Push** from the **Mirror direction** dropdown.
+1. In the **Mirror direction** dropdown, select **Push**.
1. Select an authentication method from the **Authentication method** dropdown.
You can authenticate with either a password or an [SSH key](#ssh-authentication).
-1. Check the **Only mirror protected branches** box, if necessary.
-1. Check the **Keep divergent refs** box, if desired.
-1. Click the **Mirror repository** button to save the configuration.
+1. Select the **Only mirror protected branches** check box, if necessary.
+1. Select the **Keep divergent refs** check box, if desired.
+1. Select **Mirror repository** to save the configuration.
![Repository mirroring push settings screen](img/repository_mirroring_push_settings.png)
When push mirroring is enabled, only push commits directly to the mirrored repository to prevent the
-mirror diverging. All changes will end up in the mirrored repository whenever:
+mirror diverging. The mirrored repository receives all changes when:
- Commits are pushed to GitLab.
- A [forced update](#forcing-an-update) is initiated.
@@ -77,7 +75,7 @@ Changes pushed to files in the repository are automatically pushed to the remote
- Within five minutes of being received.
- Within one minute if **Only mirror protected branches** is enabled.
-In the case of a diverged branch, you will see an error indicated at the **Mirroring repositories**
+In the case of a diverged branch, an error displays in the **Mirroring repositories**
section.
### Configuring push mirrors through the API
@@ -87,20 +85,20 @@ You can also create and modify project push mirrors through the
### Keep divergent refs
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
By default, if any ref on the remote mirror has diverged from the local
-repository, the *entire push* will fail, and nothing will be updated.
+repository, the *entire push* fails, and no updates occur.
For example, if a repository has `master`, `develop`, and `stable` branches that
have been mirrored to a remote, and then a new commit is added to `develop` on
-the mirror, the next push attempt will fail, leaving `master` and `stable`
+the mirror, the next push attempt fails, leaving `master` and `stable`
out-of-date despite not having diverged. No change on any branch can be mirrored
until the divergence is resolved.
With the **Keep divergent refs** option enabled, the `develop` branch is
-skipped, allowing `master` and `stable` to be updated. The mirror status will
-reflect that `develop` has diverged and was skipped, and be marked as a failed
+skipped, allowing `master` and `stable` to be updated. The mirror status
+reflects that `develop` has diverged and was skipped, and be marked as a failed
update.
NOTE:
@@ -110,18 +108,18 @@ After the mirror is created, this option can currently only be modified via the
To set up a mirror from GitLab to GitHub, you need to follow these steps:
-1. Create a [GitHub personal access token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) with the `public_repo` box checked.
+1. Create a [GitHub personal access token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) with the `public_repo` box checked.
1. Fill in the **Git repository URL** field using this format: `https://<your_github_username>@github.com/<your_github_group>/<your_github_project>.git`.
1. Fill in **Password** field with your GitHub personal access token.
-1. Click the **Mirror repository** button.
+1. Select **Mirror repository**.
-The mirrored repository will be listed. For example, `https://*****:*****@github.com/<your_github_group>/<your_github_project>.git`.
+The mirrored repository is listed. For example, `https://*****:*****@github.com/<your_github_group>/<your_github_project>.git`.
-The repository will push soon. To force a push, click the **Update now** (**{retry}**) button.
+The repository pushes shortly thereafter. To force a push, select the **Update now** (**{retry}**) button.
### Setting up a push mirror from GitLab to AWS CodeCommit
-AWS CodeCommit push mirroring is currently the best way to connect GitLab repositories to AWS CodePipeline, as GitLab is not yet supported as one of their Source Code Management (SCM) providers.
+AWS CodeCommit push mirroring is currently the best way to connect GitLab repositories to AWS CodePipeline, as GitLab isn't yet supported as one of their Source Code Management (SCM) providers.
Each new AWS CodePipeline needs significant AWS infrastructure setup. It also requires an individual pipeline per branch.
@@ -159,9 +157,9 @@ To set up a mirror from GitLab to AWS CodeCommit:
}
```
-1. After the user was created, click the AWS IAM user name.
-1. Click the **Security credentials** tab.
-1. Under **HTTPS Git credentials for AWS CodeCommit** click **Generate credentials**.
+1. After the user was created, select the AWS IAM user name.
+1. Select the **Security credentials** tab.
+1. Under **HTTPS Git credentials for AWS CodeCommit** select **Generate credentials**.
NOTE:
This Git user ID and password is specific to communicating with CodeCommit. Do
@@ -169,9 +167,9 @@ To set up a mirror from GitLab to AWS CodeCommit:
1. Copy or download special Git HTTPS user ID and password.
1. In the AWS CodeCommit console, create a new repository to mirror from your GitLab repository.
-1. Open your new repository and click **Clone URL > Clone HTTPS** (not **Clone HTTPS (GRC)**).
+1. Open your new repository, and then select **Clone URL > Clone HTTPS** (not **Clone HTTPS (GRC)**).
1. In GitLab, open the repository to be push-mirrored.
-1. Click **Settings > Repository** and expand **Mirroring repositories**.
+1. Go to **Settings > Repository**, and then expand **Mirroring repositories**.
1. Fill in the **Git repository URL** field using this format:
```plaintext
@@ -185,17 +183,17 @@ To set up a mirror from GitLab to AWS CodeCommit:
1. For **Authentication method**, select **Password** and fill in the **Password** field with the special IAM Git clone user ID **password** created earlier in AWS.
1. The option **Only mirror protected branches** should be good for CodeCommit as it pushes more
frequently (from every five minutes to every minute).
- CodePipeline requires individual pipeline setups for named branches you wish to have a AWS CI setup for. Since feature branches that have dynamic names will not be supported anyway, configuring **Only mirror protected branches** does not cause flexibility problems with CodePipeline integration as long as you are also willing to protect all the named branches you want to build CodePipelines for.
+ CodePipeline requires individual pipeline setups for named branches you wish to have a AWS CI setup for. Because feature branches that have dynamic names are unsupported, configuring **Only mirror protected branches** doesn't cause flexibility problems with CodePipeline integration as long as you are also willing to protect all the named branches you want to build CodePipelines for.
-1. Click **Mirror repository**. You should see the mirrored repository appear:
+1. Select **Mirror repository**. You should see the mirrored repository appear:
```plaintext
https://*****:*****@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
```
-To test mirroring by forcing a push, click the half-circle arrows button (hover text is **Update now**).
+To test mirroring by forcing a push, select the half-circle arrows button (hover text is **Update now**).
If **Last successful update** shows a date, you have configured mirroring correctly.
-If it is not working correctly a red `error` tag appears and shows the error message as hover text.
+If it isn't working correctly, a red `error` tag appears and shows the error message as hover text.
### Setting up a push mirror to another GitLab instance with 2FA activated
@@ -203,11 +201,10 @@ If it is not working correctly a red `error` tag appears and shows the error mes
1. On the source GitLab instance:
1. Fill in the **Git repository URL** field using this format: `https://oauth2@<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git`.
1. Fill in the **Password** field with the GitLab personal access token created on the destination GitLab instance.
- 1. Click the **Mirror repository** button.
+ 1. Select **Mirror repository**.
## Pulling from a remote repository **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51) in GitLab Enterprise Edition 8.2.
> - [Added Git LFS support](https://gitlab.com/gitlab-org/gitlab/-/issues/10871) in GitLab 11.11.
> - Moved to GitLab Premium in 13.9.
@@ -219,16 +216,20 @@ to be able to browse its content and its activity using the familiar GitLab inte
To configure mirror pulling for an existing project:
-1. Navigate to your project's **Settings > Repository** and expand the **Mirroring repositories**
- section.
-1. Enter a repository URL.
-1. Select **Pull** from the **Mirror direction** dropdown.
-1. Select an authentication method from the **Authentication method** dropdown, if necessary.
-1. If necessary, check the following boxes:
- - **Overwrite diverged branches**.
- - **Trigger pipelines for mirror updates**.
- - **Only mirror protected branches**.
-1. Click the **Mirror repository** button to save the configuration.
+1. If you [configured two-factor authentication (2FA)](https://docs.github.com/en/github/authenticating-to-github/securing-your-account-with-two-factor-authentication-2fa)
+ for GitHub, create a [personal access token for GitHub](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
+ with the `read_repository` scope. If 2FA is enabled, this personal access
+ token serves as your GitHub password.
+1. In your project, go to **Settings > Repository**, and then expand the
+ **Mirroring repositories** section.
+1. In the **Git repository URL** field, enter a repository URL.
+1. In the **Mirror direction** dropdown, select **Pull**.
+1. In the **Authentication method** dropdown, select your authentication method.
+1. Select from the following checkboxes, if needed:
+ - **Overwrite diverged branches**
+ - **Trigger pipelines for mirror updates**
+ - **Only mirror protected branches**
+1. Select **Mirror repository** to save the configuration.
![Repository mirroring pull settings screen - upper part](img/repository_mirroring_pull_settings_upper.png)
@@ -238,15 +239,15 @@ To configure mirror pulling for an existing project:
Because GitLab is now set to pull changes from the upstream repository, you should not push commits
directly to the repository on GitLab. Instead, any commits should be pushed to the remote repository.
-Changes pushed to the remote repository will be pulled into the GitLab repository, either:
+Changes pushed to the remote repository are pulled into the GitLab repository, either:
- Automatically within a certain period of time.
- When a [forced update](#forcing-an-update) is initiated.
WARNING:
-If you do manually update a branch in the GitLab repository, the branch will become diverged from
-upstream and GitLab will no longer automatically update this branch to prevent any changes from being lost.
-Also note that deleted branches and tags in the upstream repository will not be reflected in the GitLab repository.
+If you do manually update a branch in the GitLab repository, the branch becomes diverged from
+upstream, and GitLab no longer automatically updates this branch to prevent any changes from being lost.
+Deleted branches and tags in the upstream repository are not reflected in the GitLab repository.
### How it works
@@ -259,13 +260,12 @@ Once per minute, a Sidekiq cron job schedules repository mirrors to update, base
Repository mirrors are updated as Sidekiq becomes available to process them. If the process of updating the repository mirror:
-- Succeeds, an update will be enqueued again with at least a 30 minute wait.
-- Fails (for example, a branch diverged from upstream), it will be attempted again later. Mirrors can fail
- up to 14 times before they will not be enqueued for update again.
+- **Succeeds**: An update is enqueued again with at least a 30 minute wait.
+- **Fails**: (For example, a branch diverged from upstream.), The update attempted again later. Mirrors can fail
+ up to 14 times before they are no longer enqueued for updates.
### Overwrite diverged branches **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4559) in GitLab 10.6.
> - Moved to GitLab Premium in 13.9.
You can choose to always update your local branches with remote versions, even if they have
@@ -278,42 +278,39 @@ To use this option, check the **Overwrite diverged branches** box when creating
### Trigger pipelines for mirror updates **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
-If this option is enabled, pipelines will be triggered when branches or tags are
+If this option is enabled, pipelines trigger when branches or tags are
updated from the remote repository. Depending on the activity of the remote
repository, this may greatly increase the load on your CI runners. Only enable
-this if you know they can handle the load. CI will run using the credentials
+this if you know they can handle the load. CI uses the credentials
assigned when you set up pull mirroring.
### Hard failure **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3117) in GitLab 10.2.
> - Moved to GitLab Premium in 13.9.
-Once the mirroring process is unsuccessfully retried 14 times in a row, it will get marked as hard
-failed. This will become visible in either the:
+After 14 consecutive unsuccessful retries, the mirroring process is marked as a hard failure
+and mirroring attempts stop. This failure is visible in either the:
- Project's main dashboard.
- Pull mirror settings page.
-When a project is hard failed, it will no longer get picked up for mirroring.
You can resume the project mirroring again by [forcing an update](#forcing-an-update).
### Trigger an update using the API **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3453) in GitLab 10.3.
> - Moved to GitLab Premium in 13.9.
Pull mirroring uses polling to detect new branches and commits added upstream, often minutes
afterwards. If you notify GitLab by [API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project),
-updates will be pulled immediately.
+updates are pulled immediately.
For more information, see [Start the pull mirroring process for a Project](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project).
## Mirror only protected branches **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
Based on the mirror direction that you choose, you can opt to mirror only the
[protected branches](../protected_branches.md) from/to your remote repository.
@@ -324,7 +321,6 @@ creating a repository mirror. **(PREMIUM)**
## SSH authentication
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2551) in GitLab 9.5 for Pull mirroring.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22982) in GitLab 11.6 for Push mirroring.
SSH authentication is mutual:
@@ -336,15 +332,15 @@ You provide your credentials as a password or public key. The server that the
other repository resides on provides its credentials as a "host key", the
fingerprint of which needs to be verified manually.
-If you're mirroring over SSH (that is, using an `ssh://` URL), you can authenticate using:
+If you're mirroring over SSH (using an `ssh://` URL), you can authenticate using:
- Password-based authentication, just as over HTTPS.
- Public key authentication. This is often more secure than password authentication,
- especially when the other repository supports [deploy keys](../../../ssh/README.md#deploy-keys).
+ especially when the other repository supports [deploy keys](../deploy_keys/index.md).
To get started:
-1. Navigate to your project's **Settings > Repository** and expand the **Mirroring repositories** section.
+1. In your project, go to **Settings > Repository**, and then expand the **Mirroring repositories** section.
1. Enter an `ssh://` URL for mirroring.
NOTE:
@@ -355,9 +351,9 @@ Entering the URL adds two buttons to the page:
- **Detect host keys**.
- **Input host keys manually**.
-If you click the:
+If you select the:
-- **Detect host keys** button, GitLab will fetch the host keys from the server and display the fingerprints.
+- **Detect host keys** button, GitLab fetches the host keys from the server and display the fingerprints.
- **Input host keys manually** button, a field is displayed where you can paste in host keys.
Assuming you used the former, you now need to verify that the fingerprints are
@@ -366,13 +362,13 @@ fingerprints in the open for you to check:
- [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html#regions-fingerprints)
- [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
-- [GitHub](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/githubs-ssh-key-fingerprints)
+- [GitHub](https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints)
- [GitLab.com](../../gitlab_com/index.md#ssh-host-keys-fingerprints)
- [Launchpad](https://help.launchpad.net/SSHFingerprints)
- [Savannah](http://savannah.gnu.org/maintenance/SshAccess/)
- [SourceForge](https://sourceforge.net/p/forge/documentation/SSH%20Key%20Fingerprints/)
-Other providers will vary. If you're running self-managed GitLab, or otherwise
+Other providers vary. If you're running self-managed GitLab, or otherwise
have access to the server for the other repository, you can securely gather the
key fingerprints:
@@ -386,28 +382,28 @@ $ cat /etc/ssh/ssh_host*pub | ssh-keygen -E md5 -l -f -
NOTE:
You may need to exclude `-E md5` for some older versions of SSH.
-When mirroring the repository, GitLab will now check that at least one of the
+When mirroring the repository, GitLab checks that at least one of the
stored host keys matches before connecting. This can prevent malicious code from
being injected into your mirror, or your password being stolen.
### SSH public key authentication
-To use SSH public key authentication, you'll also need to choose that option
+To use SSH public key authentication, you must also choose that option
from the **Authentication method** dropdown. When the mirror is created,
-GitLab generates a 4096-bit RSA key that can be copied by clicking the **Copy SSH public key** button.
+GitLab generates a 4096-bit RSA key that can be copied by selecting the **Copy SSH public key** button.
![Repository mirroring copy SSH public key to clipboard button](img/repository_mirroring_copy_ssh_public_key_button.png)
You then need to add the public SSH key to the other repository's configuration:
- If the other repository is hosted on GitLab, you should add the public SSH key
- as a [deploy key](../../../ssh/README.md#deploy-keys).
+ as a [deploy key](../../project/deploy_keys/index.md).
- If the other repository is hosted elsewhere, you may need to add the key to
your user's `authorized_keys` file. Paste the entire public SSH key into the
file on its own line and save it.
If you need to change the key at any time, you can remove and re-add the mirror
-to generate a new key. You'll have to update the other repository with the new
+to generate a new key. Update the other repository with the new
key to keep the mirror running.
NOTE:
@@ -423,17 +419,17 @@ update button which is available on the **Mirroring repositories** section of th
## Bidirectional mirroring **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
WARNING:
Bidirectional mirroring may cause conflicts.
If you configure a GitLab repository to both pull from, and push to, the same remote source, there
-is no guarantee that either repository will update correctly. If you set up a repository for
-bidirectional mirroring, you should prepare for the likely conflicts by deciding who will resolve
-them and how they will be resolved.
+is no guarantee that either repository updates correctly. If you set up a repository for
+bidirectional mirroring, you should prepare for the likely conflicts by deciding who resolves
+them and how.
-Rewriting any mirrored commit on either remote will cause conflicts and mirroring to fail. This can
+Rewriting any mirrored commit on either remote causes conflicts and mirroring to fail. This can
be prevented by [mirroring only protected branches](#mirror-only-protected-branches).
You should [protect the branches](../protected_branches.md) you wish to mirror on both
@@ -447,34 +443,35 @@ protected branches.
### Configure a webhook to trigger an immediate pull to GitLab
-Assuming you have already configured the [push](#setting-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated) and [pull](#pulling-from-a-remote-repository) mirrors in the upstream GitLab instance, to trigger an immediate pull as suggested above, you will need to configure a [Push Event Web Hook](../integrations/webhooks.md#push-events) in the downstream instance.
+Assuming you have already configured the [push](#setting-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated) and [pull](#pulling-from-a-remote-repository) mirrors in the upstream GitLab instance, to trigger an immediate pull as suggested above, you must configure a [Push Event Web Hook](../integrations/webhooks.md#push-events) in the downstream instance.
To do this:
-- Create a [personal access token](../../profile/personal_access_tokens.md) with `API` scope.
-- Navigate to **Settings > Webhooks**
-- Add the webhook URL which in this case will use the [Pull Mirror API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project) request to trigger an immediate pull after updates to the repository.
+1. Create a [personal access token](../../profile/personal_access_tokens.md) with `API` scope.
+1. In your project, go to **Settings > Webhooks**.
+1. Add the webhook URL which (in this case) uses the [Pull Mirror API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project) request to trigger an immediate pull after updates to the repository.
- ```plaintext
- https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
- ```
+ ```plaintext
+ https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
+ ```
+
+1. Ensure the **Push Events** checkbox is selected.
+1. Select **Add Webhook** to save the webhook.
-- Ensure that the **Push Events** checkbox is selected.
-- Click on **Add Webhook** button to save the webhook.
-- To test the integration click on the **Test** button and confirm GitLab does not return any error.
+To test the integration, select the **Test** button and confirm GitLab doesn't return an error message.
### Preventing conflicts using a `pre-receive` hook
WARNING:
-The solution proposed will negatively impact the performance of
-Git push operations because they will be proxied to the upstream Git
+The solution proposed negatively affects the performance of
+Git push operations because they are proxied to the upstream Git
repository.
A server-side `pre-receive` hook can be used to prevent the race condition
described above by only accepting the push after first pushing the commit to
the upstream Git repository. In this configuration one Git repository acts as
the authoritative upstream, and the other as downstream. The `pre-receive` hook
-will be installed on the downstream repository.
+is installed on the downstream repository.
Read about [configuring Server hooks](../../../administration/server_hooks.md) on the GitLab server.
@@ -540,11 +537,11 @@ fi
Note that this sample has a few limitations:
- This example may not work verbatim for your use case and might need modification.
- - It does not regard different types of authentication mechanisms for the mirror.
- - It does not work with forced updates (rewriting history).
- - Only branches that match the `allowlist` patterns will be proxy pushed.
+ - It doesn't regard different types of authentication mechanisms for the mirror.
+ - It doesn't work with forced updates (rewriting history).
+ - Only branches that match the `allowlist` patterns are proxy pushed.
- The script circumvents the Git hook quarantine environment because the update of `$TARGET_REPO`
- is seen as a ref update and Git will complain about it.
+ is seen as a ref update, and Git displays warnings about it.
### Mirroring with Perforce Helix via Git Fusion **(PREMIUM)**
@@ -560,22 +557,22 @@ mirror projects with GitLab. This may be useful in some situations when migratin
to GitLab where overlapping Perforce Helix workspaces cannot be migrated simultaneously to GitLab.
If using mirroring with Perforce Helix, you should only mirror protected branches. Perforce Helix
-will reject any pushes that rewrite history. Only the fewest number of branches should be mirrored
+rejects any pushes that rewrite history. Only the fewest number of branches should be mirrored
due to the performance limitations of Git Fusion.
When configuring mirroring with Perforce Helix via Git Fusion, the following Git Fusion
settings are recommended:
-- `change-pusher` should be disabled. Otherwise, every commit will be rewritten as being committed
+- `change-pusher` should be disabled. Otherwise, every commit is rewritten as being committed
by the mirroring account, rather than being mapped to existing Perforce Helix users or the `unknown_git` user.
-- `unknown_git` user will be used as the commit author if the GitLab user does not exist in
+- `unknown_git` user is used as the commit author if the GitLab user doesn't exist in
Perforce Helix.
Read about [Git Fusion settings on Perforce.com](https://www.perforce.com/manuals/git-fusion/Content/Git-Fusion/section_vss_bdw_w3.html#section_zdp_zz1_3l).
## Troubleshooting
-Should an error occur during a push, GitLab will display an "Error" highlight for that repository. Details on the error can then be seen by hovering over the highlight text.
+Should an error occur during a push, GitLab displays an **Error** highlight for that repository. Details on the error can then be seen by hovering over the highlight text.
### 13:Received RST_STREAM with error code 2 with GitHub
@@ -584,3 +581,9 @@ If you receive an "13:Received RST_STREAM with error code 2" while mirroring to
### 4:Deadline Exceeded
When upgrading to GitLab 11.11.8 or newer, a change in how usernames are represented means that you may need to update your mirroring username and password to ensure that `%40` characters are replaced with `@`.
+
+### Connection blocked because server only allows public key authentication
+
+As the error indicates, the connection is getting blocked between GitLab and the remote repository. Even if a [TCP Check](../../../administration/raketasks/maintenance.md#check-tcp-connectivity-to-a-remote-site) is successful, you must check any networking components in the route from GitLab to the remote Server to ensure there's no blockage.
+
+For example, we've seen this error when a Firewall was performing a `Deep SSH Inspection` on outgoing packets.
diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index a9e249bb8c3..efa35c1ceac 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# GitLab Web Editor
+# GitLab Web Editor **(FREE)**
Sometimes it's easier to make quick changes directly from the GitLab interface
than to clone the project and use the Git command-line tool. In this feature
@@ -108,7 +108,7 @@ You can see a **Create merge request** dropdown below the issue description.
The **Create merge request** button doesn't display if:
- A branch with the same name already exists.
-- The branch already has a referenced merge request.
+- A merge request already exists for this branch.
- Your project has an active fork relationship.
To make this button appear, one possible workaround is to
diff --git a/doc/user/project/repository/x509_signed_commits/index.md b/doc/user/project/repository/x509_signed_commits/index.md
index 29c1c32145d..c89f3a267ba 100644
--- a/doc/user/project/repository/x509_signed_commits/index.md
+++ b/doc/user/project/repository/x509_signed_commits/index.md
@@ -39,7 +39,7 @@ recommend using certificates from a PKI that are in line with
## Obtaining an X.509 key pair
-If your organization has Public Key Infrastructure (PKI), that PKI will provide
+If your organization has Public Key Infrastructure (PKI), that PKI provides
an S/MIME key.
If you do not have an S/MIME key pair from a PKI, you can either create your
@@ -49,7 +49,7 @@ and some of them generate keys for free.
## Associating your X.509 certificate with Git
-To take advantage of X.509 signing, you will need Git 2.19.0 or later. You can
+To take advantage of X.509 signing, you need Git 2.19.0 or later. You can
check your Git version with:
```shell
diff --git a/doc/user/project/requirements/index.md b/doc/user/project/requirements/index.md
index c7dda81685c..bd37acafd22 100644
--- a/doc/user/project/requirements/index.md
+++ b/doc/user/project/requirements/index.md
@@ -96,18 +96,20 @@ As soon as a requirement is reopened, it no longer appears in the **Archived** t
## Search for a requirement
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/212543) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/212543) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
+> - Searching by status [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/224614) in GitLab 13.10.
You can search for a requirement from the requirements list page based on the following criteria:
-- Requirement title
+- Title
- Author's username
+- Status (satisfied, failed, or missing)
To search for a requirement:
1. In a project, go to **Requirements > List**.
1. Select the **Search or filter results** field. A dropdown menu appears.
-1. Select the requirement author from the dropdown or enter plain text to search by requirement title.
+1. Select the requirement author or status from the dropdown or enter plain text to search by requirement title.
1. Press <kbd>Enter</kbd> on your keyboard to filter the list.
You can also sort the requirements list by:
@@ -183,7 +185,7 @@ requirements_confirmation:
### Add the manual job to CI conditionally
To configure your CI to include the manual job only when there are some open
-requirements, add a rule which checks `CI_HAS_OPEN_REQUIREMENTS` CI variable.
+requirements, add a rule which checks `CI_HAS_OPEN_REQUIREMENTS` CI/CD variable.
```yaml
requirements_confirmation:
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index debe5c51d51..383b4df9612 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -73,7 +73,7 @@ To enable Service Desk in your project:
1. Enable the **Activate Service Desk** toggle. This reveals a unique email address to email issues
to the project.
-Service Desk is now enabled for this project! To access it in a project, in the left sidebar, select
+Service Desk is now enabled for this project! To access it in a project, in the left sidebar, select
**Issues > Service Desk**.
WARNING:
@@ -137,13 +137,13 @@ You can use these placeholders to be automatically replaced in each email:
#### New Service Desk issues
-You can select one [issue description template](description_templates.md#creating-issue-templates)
+You can select one [issue description template](description_templates.md#create-an-issue-template)
**per project** to be appended to every new Service Desk issue's description.
Issue description templates should reside in your repository's `.gitlab/issue_templates/` directory.
To use a custom issue template with Service Desk, in your project:
-1. [Create a description template](description_templates.md#creating-issue-templates)
+1. [Create a description template](description_templates.md#create-an-issue-template)
1. Go to **Settings > General > Service Desk**.
1. From the dropdown **Template to append to all Service Desk issues**, select your template.
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index 6f230f1798a..7b5a0cbb377 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -118,16 +118,16 @@ The following items will be exported:
- Issue boards
- Pipelines history
- Push Rules
+- Awards
The following items will **not** be exported:
- Build traces and artifacts
- Container registry images
-- CI variables
+- CI/CD variables
- Webhooks
- Any encrypted tokens
- Merge Request Approvers
-- Awards
NOTE:
For more details on the specific data persisted in a project export, see the
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 8ab82fe7296..785618a862a 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -44,6 +44,7 @@ Compliance framework labels do not affect your project settings.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276221) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
+> - It can be enabled or disabled for a single group
> - It's disabled on GitLab.com.
> - It's not recommended for production use.
> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-custom-compliance-frameworks). **(PREMIUM)**
@@ -103,8 +104,7 @@ Some features depend on others:
When the **Issues** option is disabled, you can still access **Milestones**
from merge requests.
-- Additionally, if you disable both **Issues** and **Merge Requests**, you will no
- longer have access to:
+- Additionally, if you disable both **Issues** and **Merge Requests**, you cannot access:
- **Labels**
- **Milestones**
@@ -220,7 +220,7 @@ To rename a repository:
1. Click **Change path**.
Remember that this can have unintended side effects since everyone with the
-old URL won't be able to push or pull. Read more about what happens with the
+old URL can't push or pull. Read more about what happens with the
[redirects when renaming repositories](../repository/index.md#redirects-when-changing-repository-paths).
#### Transferring an existing project into another namespace
@@ -243,7 +243,7 @@ To transfer a project:
project to.
1. Confirm the transfer by typing the project's path as instructed.
-Once done, you will be taken to the new project's namespace. At this point,
+Once done, you are redirected to the new project's namespace. At this point,
read what happens with the
[redirects from the old project to the new one](../repository/index.md#redirects-when-changing-repository-paths).
@@ -266,7 +266,7 @@ This action:
- Deletes a project including all associated resources (issues, merge requests etc).
- From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) on [Premium](https://about.gitlab.com/pricing/) or higher tiers,
-group owners can [configure](../../group/index.md#enabling-delayed-project-removal) projects within a group
+group owners can [configure](../../group/index.md#enable-delayed-project-removal) projects within a group
to be deleted after a delayed period.
When enabled, actual deletion happens after number of days
specified in [instance settings](../../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
@@ -293,7 +293,7 @@ If you want to use the fork for yourself and don't need to send
you can safely remove the fork relationship.
WARNING:
-Once removed, the fork relationship cannot be restored. You will no longer be able to send merge requests to the source, and if anyone has forked your project, their fork will also lose the relationship.
+Once removed, the fork relationship cannot be restored. You can't send merge requests to the source, and if anyone has forked your project, their fork also loses the relationship.
To do so:
@@ -330,11 +330,11 @@ can enable it.
To enable it:
```ruby
-Feature.enable(:ff_custom_compliance_frameworks)
+Feature.enable(:ff_custom_compliance_frameworks, Group.find(<group id>))
```
To disable it:
```ruby
-Feature.disable(:ff_custom_compliance_frameworks)
+Feature.disable(:ff_custom_compliance_frameworks, Group.find(<group id>))
```
diff --git a/doc/user/project/settings/project_access_tokens.md b/doc/user/project/settings/project_access_tokens.md
index 590f549577e..cda39508835 100644
--- a/doc/user/project/settings/project_access_tokens.md
+++ b/doc/user/project/settings/project_access_tokens.md
@@ -78,33 +78,3 @@ the following table.
| `write_registry` | Allows write-access (push) to [container registry](../../packages/container_registry/index.md). |
| `read_repository` | Allows read-only access (pull) to the repository. |
| `write_repository` | Allows read-write access (pull, push) to the repository. |
-
-### Enable or disable project access tokens
-
-Project access tokens are deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can disable it for your instance, globally or by project.
-
-To disable it globally:
-
-```ruby
-Feature.disable(:resource_access_token)
-```
-
-To disable it for a specific project:
-
-```ruby
-Feature.disable(:resource_access_token, project)
-```
-
-To enable it globally:
-
-```ruby
-Feature.enable(:resource_access_token)
-```
-
-To enable it for a specific project:
-
-```ruby
-Feature.enable(:resource_access_token, project)
-```
diff --git a/doc/user/project/static_site_editor/index.md b/doc/user/project/static_site_editor/index.md
index 002eb398406..431250a817d 100644
--- a/doc/user/project/static_site_editor/index.md
+++ b/doc/user/project/static_site_editor/index.md
@@ -102,7 +102,7 @@ To edit a file:
in the bottom-right corner.
1. When you're done, click **Submit changes...**.
1. (Optional) Adjust the default title and description of the merge request, to submit
- with your changes. Alternatively, select a [merge request template](../../../user/project/description_templates.md#creating-merge-request-templates)
+ with your changes. Alternatively, select a [merge request template](../../../user/project/description_templates.md#create-a-merge-request-template)
from the dropdown menu and edit it accordingly.
1. Click **Submit changes**.
1. A new merge request is automatically created and you can assign a colleague for review.
diff --git a/doc/user/project/time_tracking.md b/doc/user/project/time_tracking.md
index 2b0ca38c57c..d1e9fe155b4 100644
--- a/doc/user/project/time_tracking.md
+++ b/doc/user/project/time_tracking.md
@@ -40,7 +40,8 @@ Below is an example of how you can use those new quick actions inside a comment.
![Time tracking example in a comment](img/time_tracking_example_v12_2.png)
-Adding time entries (time spent or estimates) is limited to project members.
+Adding time entries (time spent or estimates) is limited to project members
+with [Reporter and higher permission levels](../permissions.md).
### Estimates
diff --git a/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png b/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
index ccb9cf6f126..8eca352a4d0 100644
--- a/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
+++ b/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
Binary files differ
diff --git a/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png b/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png
deleted file mode 100644
index 6257d78d29e..00000000000
--- a/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index 07f46cb94f7..57b79875909 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -71,19 +71,16 @@ Single file editing is based on the [Ace Editor](https://ace.c9.io).
### Themes
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in GitLab in 13.0.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in GitLab 13.0.
> - Full Solarized Dark Theme [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/219228) in GitLab 13.1.
+> - Full [Solarized Light](https://gitlab.com/gitlab-org/gitlab/-/issues/221035) and [Monokai](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) Themes introduced in GitLab 13.6.
-All the themes GitLab supports for syntax highlighting are added to the Web IDE's code editor.
+All the themes GitLab supports for syntax highlighting are applied to the Web IDE's entire screen.
You can pick a theme from your [profile preferences](../../profile/preferences.md).
-The themes are available only in the Web IDE file editor, except for the [dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/209808) and
-the [Solarized dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/219228),
-which apply to the entire Web IDE screen.
-
-| Solarized Light Theme | Solarized Dark Theme | Dark Theme |
-|---------------------------------------------------------------|-------------------------------------------------------------|-----------------------------------------|
-| ![Solarized Light Theme](img/solarized_light_theme_v13_0.png) | ![Solarized Dark Theme](img/solarized_dark_theme_v13_1.png) | ![Dark Theme](img/dark_theme_v13_0.png) |
+| Solarized Dark Theme | Dark Theme |
+|-------------------------------------------------------------|-----------------------------------------|
+| ![Solarized Dark Theme](img/solarized_dark_theme_v13_1.png) | ![Dark Theme](img/dark_theme_v13_0.png) |
## Schema based validation
@@ -237,7 +234,7 @@ different branch.
When you edit Markdown files in the Web IDE, you can preview your changes by
clicking the **Preview Markdown** tab above the file editor. The Markdown preview
-supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
You can also upload any local images by pasting them directly in the Markdown file.
The image is uploaded to the same directory and is named `image.png` by default.
@@ -424,7 +421,7 @@ terminal:
See [this issue](https://gitlab.com/gitlab-org/webide-file-sync/-/issues/7) for
more information.
- `$CI_PROJECT_DIR` is a
- [predefined environment variable](../../../ci/variables/predefined_variables.md)
+ [predefined CI/CD variable](../../../ci/variables/predefined_variables.md)
for GitLab Runners. This is where your project's repository resides.
After you have configured the web terminal for file syncing, then when the web
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index 187fcb5b3f9..eb8270b8740 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -24,9 +24,9 @@ a separate Git repository.
## First time creating the Home page
-The first time you visit a Wiki, you will be directed to create the Home page.
-The Home page is necessary to be created since it serves as the landing page
-when viewing a Wiki. You only have to fill in the **Content** section and click
+The first time you visit a Wiki, you are directed to create the Home page.
+The Home page is necessary to be created because it serves as the landing page
+when viewing a Wiki. Complete the **Content** section, and then select
**Create page**. You can always edit it later, so go ahead and write a welcome
message.
@@ -37,38 +37,38 @@ message.
NOTE:
Requires Developer [permissions](../../permissions.md).
-Create a new page by clicking the **New page** button that can be found
+Create a new page by selecting the **New page** button that can be found
in all wiki pages.
-You will be asked to fill in a title for your new wiki page.
+Enter a title for your new wiki page.
You can specify a full path for the wiki page by using '/' in the
-title to indicate subdirectories. Any missing directories will be created
-automatically. For example, a title of `docs/my-page` will create a wiki
+title to indicate subdirectories. Any missing directories are created
+automatically. For example, a title of `docs/my-page` creates a wiki
page with a path `/wikis/docs/my-page`.
-Once you enter the page name, it's time to fill in its content. GitLab wikis
+After you enter the page name, it's time to fill in its content. GitLab wikis
support Markdown, RDoc, AsciiDoc, and Org. For Markdown based pages, all the
[Markdown features](../../markdown.md) are supported and for links there is
some [wiki specific](../../markdown.md#wiki-specific-markdown) behavior.
In the web interface the commit message is optional, but the GitLab Wiki is
-based on Git and needs a commit message, so one will be created for you if you
-do not enter one.
+based on Git and needs a commit message, so one is created for you if you
+don't enter one.
-When you're ready, click the **Create page** and the new page will be created.
+When you're ready, select **Create page** and the new page is created.
![New page](img/wiki_create_new_page.png)
### Attachment storage
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33475) in GitLab 11.3.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33475) in GitLab 11.3.
-Starting with GitLab 11.3, any file that is uploaded to the wiki via the GitLab
-interface will be stored in the wiki Git repository, and it will be available
+Any file uploaded to the wiki with the GitLab
+interface is stored in the wiki Git repository, and is available
if you clone the wiki repository locally. All uploaded files prior to GitLab
11.3 are stored in GitLab itself. If you want them to be part of the wiki's Git
-repository, you will have to upload them again.
+repository, you must upload them again.
### Special characters in page titles
@@ -80,7 +80,7 @@ Wiki pages are stored as files in a Git repository, so certain characters have a
### Length restrictions for file and directory names
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24364) in GitLab 12.8.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24364) in GitLab 12.8.
Many common file systems have a [limit of 255 bytes for file and directory names](https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits), and while Git and GitLab both support paths exceeding those limits, the presence of them makes it impossible for users on those file systems to checkout a wiki repository locally.
@@ -99,9 +99,9 @@ Please note that:
You need Developer [permissions](../../permissions.md) or higher to edit a wiki page.
To do so:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Edit the content.
-1. Click **Save changes**.
+1. Select **Save changes**.
### Adding a table of contents
@@ -114,7 +114,7 @@ You need Maintainer [permissions](../../permissions.md) or higher to delete a wi
To do so:
1. Open the page you want to delete.
-1. Click the **Delete page** button.
+1. Select **Delete page**.
1. Confirm the deletion.
## Moving a wiki page
@@ -122,22 +122,22 @@ To do so:
You need Developer [permissions](../../permissions.md) or higher to move a wiki page.
To do so:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Add the new path to the **Title** field.
-1. Click **Save changes**.
+1. Select **Save changes**.
For example, if you have a wiki page called `about` under `company` and you want to
move it to the wiki's root:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Change the **Title** from `about` to `/about`.
-1. Click **Save changes**.
+1. Select **Save changes**.
If you want to do the opposite:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Change the **Title** from `about` to `company/about`.
-1. Click **Save changes**.
+1. Select **Save changes**.
## Viewing a list of all created wiki pages
@@ -148,41 +148,41 @@ found. The list is ordered alphabetically.
![Wiki sidebar](img/wiki_sidebar_v13_5.png)
-If you have many pages, not all will be listed in the sidebar. Click on
+If you have many pages, not all are listed in the sidebar. Select
**View All Pages** to see all of them.
## Viewing the history of a wiki page
The changes of a wiki page over time are recorded in the wiki's Git repository,
-and you can view them by clicking the **Page history** button.
+and you can view them by selecting **Page history**.
From the history page you can see the revision of the page (Git commit SHA), its
author, the commit message, and when it was last updated.
-To see how a previous version of the page looked like, click on a revision
+To see how a previous version of the page looked like, select a revision
number in the **Page version** column.
![Wiki page history](img/wiki_page_history.png)
### Viewing the changes between page versions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15242) in GitLab 13.2.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15242) in GitLab 13.2.
Similar to versioned diff file views, you can see the changes made in a given Wiki page version:
1. Navigate to the Wiki page you're interested in.
-1. Click on **Page history** to see all page versions.
-1. Click on the commit message in the **Changes** column for the version you're interested in:
+1. Select **Page history** to see all page versions.
+1. Select the commit message in the **Changes** column for the version you're interested in.
![Wiki page changes](img/wiki_page_diffs_v13_2.png)
## Wiki activity records
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14902) in **GitLab 12.10.**
-> - Git events were [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216014) in **GitLab 13.0.**
+> - Git events were [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216014) in **GitLab 13.0.**
> - [Feature flag for Git events was removed](https://gitlab.com/gitlab-org/gitlab/-/issues/258665) in **GitLab 13.5**
Wiki events (creation, deletion, and updates) are tracked by GitLab and
-displayed on the [user profile](../../profile/index.md#user-profile),
+displayed on the [user profile](../../profile/index.md#access-your-user-profile),
[group](../../group/index.md#view-group-activity),
and [project](../working_with_projects.md#project-activity) activity pages.
@@ -191,12 +191,12 @@ and [project](../working_with_projects.md#project-activity) activity pages.
Since wikis are based on Git repositories, you can clone them locally and edit
them like you would do with every other Git repository.
-On the right sidebar, click on **Clone repository** and follow the on-screen
+In the right sidebar, select **Clone repository** and follow the on-screen
instructions.
Files that you add to your wiki locally must have one of the following
supported extensions, depending on the markup language you wish to use,
-otherwise they will not display when pushed to GitLab:
+otherwise they don't display when pushed to GitLab:
- Markdown extensions: `.mdown`, `.mkd`, `.mkdn`, `.md`, `.markdown`.
- AsciiDoc extensions: `.adoc`, `.ad`, `.asciidoc`.
@@ -204,11 +204,11 @@ otherwise they will not display when pushed to GitLab:
## Customizing sidebar
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23109) in GitLab 13.8, the sidebar can be customized by clicking the **Edit sidebar** button.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23109) in GitLab 13.8, the sidebar can be customized by selecting the **Edit sidebar** button.
To customize the Wiki's navigation sidebar, you need Developer permissions to the project.
-On the top-right, click **Edit sidebar** and make your changes. This creates a wiki page named `_sidebar` which fully replaces the default sidebar navigation.
+In the top-right, select **Edit sidebar** and make your changes. This creates a wiki page named `_sidebar` which fully replaces the default sidebar navigation.
Example for `_sidebar` (using Markdown format):
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 3fe6193c414..43df1cce70f 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -212,7 +212,7 @@ To delete a project, first navigate to the home page for that project.
1. Click **Delete project**
1. Confirm this action by typing in the expected text.
-Projects in personal namespaces are deleted immediately on request. For information on delayed deletion of projects in a group, please see [Enabling delayed project removal](../group/index.md#enabling-delayed-project-removal).
+Projects in personal namespaces are deleted immediately on request. For information on delayed deletion of projects in a group, please see [Enable delayed project removal](../group/index.md#enable-delayed-project-removal).
## Project settings
@@ -278,7 +278,7 @@ databases if the module name or a prefix of it appears in `GONOPRIVATE` or
### Authenticate Go requests
To authenticate requests to private projects made by Go, use a [`.netrc`
-file](https://ec.haxx.se/usingcurl-netrc.html) and a [personal access
+file](https://everything.curl.dev/usingcurl/netrc) and a [personal access
token](../profile/personal_access_tokens.md) in the password field. **This only
works if your GitLab instance can be accessed with HTTPS.** The `go` command
does not transmit credentials over insecure connections. This authenticates
diff --git a/doc/user/search/advanced_global_search.md b/doc/user/search/advanced_global_search.md
deleted file mode 100644
index 2d1a05cd966..00000000000
--- a/doc/user/search/advanced_global_search.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-stage: Enablement
-group: Global Search
-info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference
----
-
-# Advanced Search **(PREMIUM)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/109) in GitLab 8.4.
-> - [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
-
-NOTE:
-Advanced Search (powered by Elasticsearch) is enabled for Bronze and above on GitLab.com since 2020-07-10.
-
-Leverage Elasticsearch for faster, more advanced code search across your entire
-GitLab instance.
-
-This is the user documentation. To install and configure Elasticsearch,
-visit the [administrator documentation](../../integration/elasticsearch.md).
-
-## Overview
-
-The Advanced Search in GitLab is a powerful search service that saves
-you time. Instead of creating duplicate code and wasting time, you can
-now search for code within other projects that can help your own project.
-
-GitLab leverages the search capabilities of [Elasticsearch](https://www.elastic.co/elasticsearch/) and enables it when
-searching in:
-
-- Projects
-- Issues
-- Merge requests
-- Milestones
-- Comments
-- Code
-- Commits
-- Wiki
-- Users
-
-## Use cases
-
-The Advanced Search can be useful in various scenarios.
-
-### Faster searches
-
-Advanced Search is based on Elasticsearch, which is a purpose built full text search engine that can be horizontally scaled so that it can provide search results in 1-2 seconds in most cases.
-
-### Promote innersourcing
-
-Your company may consist of many different developer teams each of which has
-their own group where the various projects are hosted. Some of your applications
-may be connected to each other, so your developers need to instantly search
-throughout the GitLab instance and find the code they search for.
-
-## Searching globally
-
-Just use the search as before and GitLab will show you matching code from each
-project you have access to.
-
-![Advanced Search](img/advanced_global_search.png)
-
-You can also use the [Advanced Search Syntax](advanced_search_syntax.md) which
-provides some useful queries.
-
-NOTE:
-Elasticsearch has only data for the default branch. That means that if you go
-to the repository tree and switch the branch from the default to something else,
-then the "Code" tab in the search result page will be served by the basic
-search even if Elasticsearch is enabled.
diff --git a/doc/user/search/advanced_search_syntax.md b/doc/user/search/advanced_search.md
index 19f7305124e..d11f02addea 100644
--- a/doc/user/search/advanced_search_syntax.md
+++ b/doc/user/search/advanced_search.md
@@ -5,28 +5,53 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Advanced Search Syntax **(PREMIUM)**
+# GitLab Advanced Search **(PREMIUM)**
-> - Introduced in [GitLab](https://about.gitlab.com/pricing/) 9.2.
-> - [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
-Use advanced queries for more targeted search results.
-
-This is the user documentation. To install and configure Elasticsearch,
+NOTE:
+This is the user documentation. To configure the Advanced Search,
visit the [administrator documentation](../../integration/elasticsearch.md).
-## Overview
-
-The Advanced Search Syntax is a subset of the
-[Advanced Search](advanced_global_search.md), which you can use if you
-want to have more specific search results.
-
-Advanced Search only supports searching the [default branch](../project/repository/branches/index.md#default-branch).
-
-## Using the Advanced Search Syntax
-
-The Advanced Search Syntax supports fuzzy or exact search queries with prefixes,
-boolean operators, and much more.
+GitLab Advanced Search expands on the Basic Search with an additional set of
+features for faster, more advanced searches across the entire GitLab instance
+when searching in:
+
+- Projects
+- Issues
+- Merge requests
+- Milestones
+- Epics
+- Comments
+- Code
+- Commits
+- Wiki
+- Users
+
+The Advanced Search can be useful in various scenarios:
+
+- **Faster searches:**
+ Advanced Search is based on Elasticsearch, which is a purpose-built full
+ text search engine that can be horizontally scaled so that it can provide
+ search results in 1-2 seconds in most cases.
+- **Promote innersourcing:**
+ Your company may consist of many different developer teams each of which has
+ their own group where the various projects are hosted. Some of your applications
+ may be connected to each other, so your developers need to instantly search
+ throughout the GitLab instance and find the code they search for.
+
+## Use the Advanced Search syntax
+
+Elasticsearch has only data for the default branch. That means that if you go
+to the repository tree and switch the branch from the default to something else,
+then the "Code" tab in the search result page will be served by the basic
+search even if Elasticsearch is enabled.
+
+The Advanced Search syntax supports fuzzy or exact search queries with prefixes,
+boolean operators, and much more. Use the search as before and GitLab will show
+you matching code from each project you have access to.
+
+![Advanced Search](img/advanced_search_v13.10.png)
Full details can be found in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/query-dsl-simple-query-string-query.html#_simple_query_string_syntax), but
here's a quick guide:
@@ -40,14 +65,14 @@ here's a quick guide:
- To match a partial word, use `*`. In this example, I want to find bugs with any 500 errors. : [`bug error 50*`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=issues&repository_ref=&search=bug+error+50*&group_id=9970&project_id=278964)
- To use one of symbols above literally, escape the symbol with a preceding `\`: [`argument \-last`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=blobs&repository_ref=&search=argument+%5C-last&group_id=9970&project_id=278964)
-### Syntax search filters
+## Syntax search filters
-The Advanced Search Syntax also supports the use of filters. The available filters are:
+Advanced Search also supports the use of filters. The available filters are:
-- filename: Filters by filename. You can use the glob (`*`) operator for fuzzy matching.
-- path: Filters by path. You can use the glob (`*`) operator for fuzzy matching.
-- extension: Filters by extension in the filename. Please write the extension without a leading dot. Exact match only.
-- blob: Filters by Git `object ID`. Exact match only.
+- `filename`: Filters by filename. You can use the glob (`*`) operator for fuzzy matching.
+- `path`: Filters by path. You can use the glob (`*`) operator for fuzzy matching.
+- `extension`: Filters by extension in the filename. Please write the extension without a leading dot. Exact match only.
+- `blob`: Filters by Git `object ID`. Exact match only.
To use them, add them to your keyword in the format `<filter_name>:<value>` without
any spaces between the colon (`:`) and the value. When no keyword is provided, an asterisk (`*`) will be used as the keyword.
@@ -64,7 +89,7 @@ Examples:
- Finding the files represented by the Git object ID `998707b421c89bd9a3063333f9f728ef3e43d101`: [`* blob:998707b421c89bd9a3063333f9f728ef3e43d101`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=false&scope=blobs&repository_ref=&search=*+blob%3A998707b421c89bd9a3063333f9f728ef3e43d101&group_id=9970)
- Syntax filters can be combined for complex filtering. Finding any file starting with `search` containing `eventHub` and with the `.js` extension: [`eventHub filename:search* extension:js`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=blobs&repository_ref=&search=eventHub+filename%3Asearch*+extension%3Ajs&group_id=9970&project_id=278964)
-#### Excluding filters
+### Excluding filters
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31684) in GitLab Starter 13.3.
@@ -82,7 +107,7 @@ Examples:
- Finding `import` excluding minified JavaScript (`.min.js`) files: [`import -extension:min.js`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=blobs&repository_ref=&search=import+-extension%3Amin.js&group_id=9970&project_id=278964)
- Finding `docs` for all files outside the `docs/` folder: [`docs -path:docs/`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=blobs&repository_ref=&search=docs+-path%3Adocs%2F&group_id=9970&project_id=278964)
-### Search by issue or merge request ID
+## Search by issue or merge request ID
You can search a specific issue or merge request by its ID with a special prefix.
diff --git a/doc/user/search/img/advanced_global_search.png b/doc/user/search/img/advanced_global_search.png
deleted file mode 100644
index 4903bbb07e1..00000000000
--- a/doc/user/search/img/advanced_global_search.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/advanced_search_v13.10.png b/doc/user/search/img/advanced_search_v13.10.png
new file mode 100644
index 00000000000..39cd54fea75
--- /dev/null
+++ b/doc/user/search/img/advanced_search_v13.10.png
Binary files differ
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index ffd331248be..f327288ea0a 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: index, reference, howto
---
-# Search through GitLab
+# Search through GitLab **(FREE)**
## Issues and merge requests
@@ -298,34 +298,29 @@ redirected to the commit result and given the option to return to the search res
Leverage Elasticsearch for faster, more advanced code search across your entire
GitLab instance.
-[Learn how to use the Advanced Search.](advanced_global_search.md)
+[Learn how to use the Advanced Search.](advanced_search.md)
-## Advanced Search Syntax **(PREMIUM)**
-
-Use advanced queries for more targeted search results.
-
-[Learn how to use the Advanced Search Syntax.](advanced_search_syntax.md)
-
-## Search project settings
+## Search settings
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292941) in GitLab 13.8.
+> - [Added to Group, Admin, and User settings](https://gitlab.com/groups/gitlab-org/-/epics/4842) in GitLab 13.9
> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
> - It's disabled on GitLab.com.
> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-search-project-settings). **(FREE SELF)**
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-search-settings). **(FREE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-You can search inside the project’s settings sections by entering a search
-term in the search box located at the top of the page. The search results
+You can search inside a Project, Group, Admin, or User’s settings by entering
+a search term in the search box located at the top of the page. The search results
appear highlighted in the sections that match the search term.
![Search project settings](img/project_search_general_settings_v13_8.png)
-### Enable or disable Search project settings **(FREE SELF)**
+### Enable or disable Search settings **(FREE SELF)**
-Search project settings is under development and not ready for production use. It is
+Search settings is under development and not ready for production use. It is
deployed behind a feature flag that is **disabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
can enable it.
diff --git a/doc/user/shortcuts.md b/doc/user/shortcuts.md
index 014555cffed..2a3ee09b40b 100644
--- a/doc/user/shortcuts.md
+++ b/doc/user/shortcuts.md
@@ -6,25 +6,32 @@ type: reference
disqus_identifier: 'https://docs.gitlab.com/ee/workflow/shortcuts.html'
---
-# GitLab keyboard shortcuts
+# GitLab keyboard shortcuts **(FREE)**
+
+GitLab has several keyboard shortcuts you can use to access its different
+features.
+
+To display a window in GitLab that lists its keyboard shortcuts, use one of the
+following methods:
+
+- Press <kbd>?</kbd>.
+- In the Help menu in the top right of the appication, select **Keyboard shortcuts**.
-GitLab has many useful keyboard shortcuts to make it easier to access different features.
-You can see a modal listing keyboard shortcuts within GitLab itself by pressing <kbd>?</kbd>,
-or clicking **Keyboard shortcuts** in the Help menu at the top right.
In [GitLab 12.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22113),
-keyboard shortcuts can be disabled using the **Enable**/**Disable** toggle in this modal window.
+you can disable keyboard shortcuts by using the **Keyboard shortcuts** toggle
+at the top of the keyboard shortcut window.
-The [Global Shortcuts](#global-shortcuts) work from any area of GitLab, but you must
-be in specific pages for the other shortcuts to be available, as explained in each
-section below.
+Although [global shortcuts](#global-shortcuts) work from any area of GitLab,
+you must be in specific pages for the other shortcuts to be available, as
+explained in each section.
-## Global Shortcuts
+## Global shortcuts
-These shortcuts are available in most areas of GitLab
+These shortcuts are available in most areas of GitLab:
-| Keyboard Shortcut | Description |
-| ------------------------------- | ----------- |
-| <kbd>?</kbd> | Show/hide shortcut reference sheet. |
+| Keyboard shortcut | Description |
+|---------------------------------|-------------|
+| <kbd>?</kbd> | Show or hide the shortcut reference sheet. |
| <kbd>Shift</kbd> + <kbd>p</kbd> | Go to your Projects page. |
| <kbd>Shift</kbd> + <kbd>g</kbd> | Go to your Groups page. |
| <kbd>Shift</kbd> + <kbd>a</kbd> | Go to your Activity page. |
@@ -34,41 +41,41 @@ These shortcuts are available in most areas of GitLab
| <kbd>Shift</kbd> + <kbd>i</kbd> | Go to your Issues page. |
| <kbd>Shift</kbd> + <kbd>m</kbd> | Go to your Merge requests page.|
| <kbd>Shift</kbd> + <kbd>t</kbd> | Go to your To-Do List page. |
-| <kbd>p</kbd> + <kbd>b</kbd> | Show/hide the Performance Bar. |
+| <kbd>p</kbd> + <kbd>b</kbd> | Show or hide the Performance Bar. |
| <kbd>g</kbd> + <kbd>x</kbd> | Toggle between [GitLab](https://gitlab.com/) and [GitLab Next](https://next.gitlab.com/) (GitLab SaaS only). |
-Additionally, the following shortcuts are available when editing text in text fields,
-for example comments, replies, issue descriptions, and merge request descriptions:
+Additionally, the following shortcuts are available when editing text in text
+fields (for example, comments, replies, issue descriptions, and merge request
+descriptions):
-| Keyboard Shortcut | Description |
-| ---------------------------------------------------------------------- | ----------- |
-| <kbd>↑</kbd> | Edit your last comment. You must be in a blank text field below a thread, and you must already have at least one comment in the thread. |
-| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> | Toggle Markdown preview, when editing text in a text field that has **Write** and **Preview** tabs at the top. |
+| Keyboard shortcut | Description |
+|---------------------------------------------------------------------------|-------------|
+| <kbd>↑</kbd> | Edit your last comment. You must be in a blank text field below a thread, and you must already have at least one comment in the thread. |
+| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> | Toggle Markdown preview when editing text in a text field that has **Write** and **Preview** tabs at the top. |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>b</kbd> | Bold the selected text (surround it with `**`). |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>i</kbd> | Italicize the selected text (surround it with `_`). |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>k</kbd> | Add a link (surround the selected text with `[]()`). |
-NOTE:
-The shortcuts for editing in text fields are always enabled, even when
-other keyboard shortcuts are disabled as explained above.
+The shortcuts for editing in text fields are always enabled, even if other
+keyboard shortcuts are disabled.
## Project
-These shortcuts are available from any page within a project. You must type them
+These shortcuts are available from any page in a project. You must type them
relatively quickly to work, and they take you to another page in the project.
-| Keyboard Shortcut | Description |
-| --------------------------- | ----------- |
+| Keyboard shortcut | Description |
+|-----------------------------|-------------|
| <kbd>g</kbd> + <kbd>p</kbd> | Go to the project home page (**Project > Details**). |
| <kbd>g</kbd> + <kbd>v</kbd> | Go to the project activity feed (**Project > Activity**). |
| <kbd>g</kbd> + <kbd>r</kbd> | Go to the project releases list (**Project > Releases**). |
| <kbd>g</kbd> + <kbd>f</kbd> | Go to the [project files](#project-files) list (**Repository > Files**). |
-| <kbd>t</kbd> | Go to the project file search page. (**Repository > Files**, click **Find Files**). |
+| <kbd>t</kbd> | Go to the project file search page. (**Repository > Files**, select **Find Files**). |
| <kbd>g</kbd> + <kbd>c</kbd> | Go to the project commits list (**Repository > Commits**). |
| <kbd>g</kbd> + <kbd>n</kbd> | Go to the [repository graph](#repository-graph) page (**Repository > Graph**). |
| <kbd>g</kbd> + <kbd>d</kbd> | Go to repository charts (**Analytics > Repository Analytics**). |
| <kbd>g</kbd> + <kbd>i</kbd> | Go to the project issues list (**Issues > List**). |
-| <kbd>i</kbd> | Go to the New Issue page (**Issues**, click **New Issue** ). |
+| <kbd>i</kbd> | Go to the New Issue page (**Issues**, select **New Issue** ). |
| <kbd>g</kbd> + <kbd>b</kbd> | Go to the project issue boards list (**Issues > Boards**). |
| <kbd>g</kbd> + <kbd>m</kbd> | Go to the project merge requests list (**Merge Requests**). |
| <kbd>g</kbd> + <kbd>j</kbd> | Go to the CI/CD jobs list (**CI/CD > Jobs**). |
@@ -78,52 +85,52 @@ relatively quickly to work, and they take you to another page in the project.
| <kbd>g</kbd> + <kbd>s</kbd> | Go to the project snippets list (**Snippets**). |
| <kbd>g</kbd> + <kbd>w</kbd> | Go to the project wiki (**Wiki**), if enabled. |
-### Issues and Merge Requests
+### Issues and merge requests
-These shortcuts are available when viewing issues and merge requests.
+These shortcuts are available when viewing issues and merge requests:
-| Keyboard Shortcut | Description |
-| ---------------------------- | ----------- |
+| Keyboard shortcut | Description |
+|------------------------------|-------------|
| <kbd>e</kbd> | Edit description. |
| <kbd>a</kbd> | Change assignee. |
| <kbd>m</kbd> | Change milestone. |
| <kbd>l</kbd> | Change label. |
-| <kbd>r</kbd> | Start writing a comment. If any text is selected, it is quoted in the comment. Can't be used to reply within a thread. |
+| <kbd>r</kbd> | Start writing a comment. Pre-selected text is quoted in the comment. Can't be used to reply in a thread. |
| <kbd>n</kbd> | Move to next unresolved discussion (merge requests only). |
| <kbd>p</kbd> | Move to previous unresolved discussion (merge requests only). |
| <kbd>]</kbd> or <kbd>j</kbd> | Move to next file (merge requests only). |
| <kbd>[</kbd> or <kbd>k</kbd> | Move to previous file (merge requests only). |
| <kbd>b</kbd> | Copy source branch name (merge requests only). |
-### Project Files
+### Project files
-These shortcuts are available when browsing the files in a project (navigate to
-**Repository** > **Files**):
+These shortcuts are available when browsing the files in a project (go to
+**Repository > Files**):
-| Keyboard Shortcut | Description |
-| ----------------- | ----------- |
+| Keyboard shortcut | Description |
+|-------------------|-------------|
| <kbd>↑</kbd> | Move selection up. |
| <kbd>↓</kbd> | Move selection down. |
| <kbd>enter</kbd> | Open selection. |
-| <kbd>Escape</kbd> | Go back to file list screen (only while searching for files, **Repository > Files** then click on **Find File**). |
+| <kbd>Escape</kbd> | Go back to file list screen (only while searching for files, **Repository > Files**, then select **Find File**). |
| <kbd>y</kbd> | Go to file permalink (only while viewing a file). |
### Web IDE
These shortcuts are available when editing a file with the [Web IDE](project/web_ide/index.md):
-| Keyboard Shortcut | Description |
-| ------------------------------------------------------- | ----------- |
+| Keyboard shortcut | Description |
+|------------------------------------------------------------|-------------|
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>p</kbd> | Search for, and then open another file for editing. |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>Enter</kbd> | Commit (when editing the commit message). |
-### Repository Graph
+### Repository graph
These shortcuts are available when viewing the project [repository graph](project/repository/index.md#repository-graph)
page (navigate to **Repository > Graph**):
-| Keyboard Shortcut | Description |
-| ------------------------------------------------------------------ | ----------- |
+| Keyboard shortcut | Description |
+|--------------------------------------------------------------------|-------------|
| <kbd>←</kbd> or <kbd>h</kbd> | Scroll left. |
| <kbd>→</kbd> or <kbd>l</kbd> | Scroll right. |
| <kbd>↑</kbd> or <kbd>k</kbd> | Scroll up. |
@@ -135,25 +142,25 @@ page (navigate to **Repository > Graph**):
This shortcut is available when viewing a [wiki page](project/wiki/index.md):
-| Keyboard Shortcut | Description |
-| ----------------- | ----------- |
+| Keyboard shortcut | Description |
+|-------------------|-------------|
| <kbd>e</kbd> | Edit wiki page. |
-### Filtered Search
+### Filtered search
These shortcuts are available when using a [filtered search input](search/index.md):
-| Keyboard Shortcut | Description |
-| ----------------------------------------------------- | ----------- |
-| <kbd>⌘</kbd> (Mac) + <kbd>⌫</kbd> | Clear entire search filter. |
-| <kbd>⌥</kbd> (Mac) / <kbd>Control</kbd> + <kbd>⌫</kbd> | Clear one token at a time. |
+| Keyboard shortcut | Description |
+|--------------------------------------------------------|-------------|
+| <kbd>⌘</kbd> (Mac) + <kbd>⌫</kbd> | Clear entire search filter. |
+| <kbd>⌥</kbd> (Mac) / <kbd>Control</kbd> + <kbd>⌫</kbd> | Clear one token at a time. |
## Epics **(ULTIMATE)**
-These shortcuts are available when viewing [Epics](group/epics/index.md):
+These shortcuts are available when viewing [epics](group/epics/index.md):
-| Keyboard Shortcut | Description |
-| ----------------- | ----------- |
-| <kbd>r</kbd> | Start writing a comment. If any text is selected, it is quoted in the comment. Can't be used to reply within a thread. |
+| Keyboard shortcut | Description |
+|-------------------|-------------|
+| <kbd>r</kbd> | Start writing a comment. Pre-selected text is quoted in the comment. Can't be used to reply in a thread. |
| <kbd>e</kbd> | Edit description. |
| <kbd>l</kbd> | Change label. |
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index e919e73f404..c087e68f000 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -5,85 +5,104 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Snippets
+# Snippets **(FREE)**
+
+With GitLab snippets, you can store and share bits of code and text with other users.
+You can [comment on](#comment-on-snippets), [clone](#clone-snippets), and
+[use version control](#versioned-snippets) in snippets. They can
+[contain multiple files](#add-or-remove-multiple-files). They also support
+[syntax highlighting](#filenames), [embedding](#embed-snippets), [downloading](#download-snippets),
+and you can maintain your snippets with the [snippets API](../api/snippets.md).
+
+GitLab provides two types of snippets:
+
+- **Personal snippets**: Created independent of any project.
+ You can set a [visibility level](../public_access/public_access.md)
+ for your snippet: public, internal, or private.
+- **Project snippets**: Always related to a specific project.
+ Project snippets can be visible publicly or to only group members.
+
+## Create snippets
+
+You can create snippets in multiple ways, depending on whether you want to create a personal or project snippet:
+
+1. Select the kind of snippet you want to create:
+ - **To create a personal snippet**: On the
+ [Snippets dashboard](https://gitlab.com/dashboard/snippets), click
+ **New snippet**, or:
+ - *If you're on a project's page,* select the plus icon (**{plus-square-o}**)
+ in the top navigation bar, and then select **New snippet** from the
+ **GitLab** (GitLab SaaS) or **Your Instance** (self-managed) section
+ of the same dropdown menu.
+ - *For all other pages,* select the plus icon (**{plus-square-o}**)
+ in the top navigation bar, then select **New snippet** from the dropdown
+ menu.
+ - **To create a project snippet**: Go to your project's page. Select the
+ plus icon (**{plus-square-o}**), and then select **New snippet** from the
+ **This project** section of the dropdown menu.
+1. Add a **Title** and **Description**.
+1. Name your **File** with an appropriate extension, such as `example.rb` or `index.html`.
+ Filenames with appropriate extensions display [syntax highlighting](#filenames).
+ Failure to add a filename can cause a known
+ [copy-pasting bug](https://gitlab.com/gitlab-org/gitlab/-/issues/22870). If you don't provide a filename, GitLab [creates a name for you](#filenames).
+1. (Optional) Add [multiple files](#add-or-remove-multiple-files) to your snippet.
+1. Select a visibility level, and select **Create snippet**.
+
+After you create a snippet, you can still [add more files to it](#add-or-remove-multiple-files).
+In GitLab versions 13.0 and later, snippets are [versioned by default](#versioned-snippets).
-With GitLab Snippets you can store and share bits of code and text with other users.
-
-![GitLab Snippet](img/gitlab_snippet_v13_0.png)
-
-Snippets can be maintained using [snippets API](../api/snippets.md).
-
-There are two types of snippets:
-
-- Personal snippets.
-- Project snippets.
-
-## Personal snippets
-
-Personal snippets are not related to any project and can be created completely
-independently. There are 3 visibility levels that can be set, public, internal
-and private. See [Public access](../public_access/public_access.md) for more information.
-
-## Project snippets
-
-Project snippets are always related to a specific project.
-See [Project features](project/index.md#project-features) for more information.
-
-## Create a snippet
-
-To create a personal snippet, click the plus icon (**{plus-square-o}**)
-on the top navigation and select **New snippet** from the dropdown menu:
-
-![New personal snippet from non-project pages](img/new_personal_snippet_v12_10.png)
-
-If you're on a project's page but you want to create a new personal snippet,
-click the plus icon (**{plus-square-o}**) and select **New snippet** from the
-lower part of the dropdown (**GitLab** on GitLab.com; **Your Instance** on
-self-managed instances):
+## Discover snippets
-![New personal snippet from project pages](img/new_personal_snippet_from_project_v12_10.png)
+To discover all snippets visible to you in GitLab, you can:
-To create a project snippet, navigate to your project's page and click the
-plus icon (**{plus-square-o}**), then select **New snippet** from the upper
-part of the dropdown (**This project**).
+- **View all snippets visible to you**: In the top navigation bar of your GitLab
+ instance, go to **More > Snippets** to view your snippets dashboard.
+- **Visit [GitLab snippets](http://snippets.gitlab.com/)** for your snippets on GitLab.com.
+- **Explore all public snippets**: In the top navigation bar of your GitLab
+ instance, go to **More > Snippets** and select **Explore snippets** to view
+ [all public snippets](https://gitlab.com/explore/snippets).
+- **View a project's snippets**: In your project,
+ go to **Snippets**.
-![New personal snippet from project pages](img/new_project_snippet_from_project_v12_10.png)
+## Change default visibility of snippets
-From there, add the **Title**, **Description**, and a **File** name with the
-appropriate extension (for example, `example.rb`, `index.html`).
+Project snippets are enabled and available by default. To change their
+default visibility:
-WARNING:
-Make sure to add the filename to get code highlighting and to avoid this
-[copy-pasting bug](https://gitlab.com/gitlab-org/gitlab/-/issues/22870).
+1. In your project,
+ go to **Settings**.
+1. Expand the **Visibility, project features, permissions** section, and scroll to **Snippets**.
+1. Toggle the default visibility, and select whether snippets can be viewed by
+ everyone, or only project members.
+1. Select **Save changes**.
-## Versioned Snippets
+## Versioned snippets
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/239) in GitLab 13.0.
-Starting in 13.0, snippets (both personal and project snippets)
+In GitLab versions 13.0 and later, snippets (both personal and project snippets)
have version control enabled by default.
This means that all snippets get their own underlying repository initialized with
-a `master` branch at the moment the snippet is created. Whenever a change to the snippet is saved, a
-new commit to the `master` branch is recorded. Commit messages are automatically
-generated. The snippet's repository has only one branch (`master`) by default, deleting
-it or creating other branches is not supported.
+a default branch at the moment the snippet is created. Whenever a change to the snippet is saved, a
+new commit to the default branch is recorded. Commit messages are automatically
+generated. The snippet's repository has only one branch. You can't delete this branch,
+or create other branches.
-Existing snippets are automatically migrated in 13.0. Their current
-content is saved as the initial commit to the snippets' repository.
+Existing snippets were automatically migrated in 13.0. Their current
+content was saved as the initial commit to the snippets' repository.
-### Filenames
+## Filenames
Snippets support syntax highlighting based on the filename and
extension provided for them. While you can submit a snippet
-without specifying a filename and extension, it needs a valid name so the
+without a filename and extension, it needs a valid name so the
content can be created as a file in the snippet's repository.
-If you don't attribute a filename and extension to a snippet,
+If you don't give a snippet a filename and extension,
GitLab adds a filename in the format `snippetfile<x>.txt`
where `<x>` represents a number added to the file, starting with 1. This
-number increments when more snippets without an attributed
-filename are added.
+number increments if you add more unnamed snippets.
When upgrading from an earlier version of GitLab to 13.0, existing snippets
without a supported filename are renamed to a compatible format. For
@@ -92,139 +111,110 @@ changed to `http-a-weird-filename-me` to be included in the snippet's
repository. As snippets are stored by ID, changing their filenames breaks
direct or embedded links to the snippet.
-### Multiple files by Snippet
+## Add or remove multiple files
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2829) in GitLab 13.5.
-GitLab Snippets support multiple files in one single snippet. This is helpful
-when your code snippet is composed of multiple parts or when they relate
-to a certain context. For example:
+A single snippet can support up to 10 files, which helps keep related files together, such as:
- A snippet that includes a script and its output.
-- A snippet that includes HTML, CSS, and JS code.
+- A snippet that includes HTML, CSS, and JavaScript code.
- A snippet with a `docker-compose.yml` file and its associated `.env` file.
-- A `gulpfile.js` file coupled with a `package.json` file, which together can be
+- A `gulpfile.js` file and a `package.json` file, which together can be
used to bootstrap a project and manage its dependencies.
-Snippets support between 1 and 10 files. They can be managed via Git (because they're [versioned](#versioned-snippets)
-by a Git repository), through the [Snippets API](../api/snippets.md), or in the GitLab UI.
-
-![Multi-file Snippet](img/gitlab_snippet_v13_5.png)
+You can manage these by using Git (because they're [versioned](#versioned-snippets)
+by a Git repository), through the [Snippets API](../api/snippets.md), and in the GitLab UI.
To add a new file to your snippet through the GitLab UI:
1. Go to your snippet in the GitLab UI.
-1. Click **Edit** in the top right.
+1. Select **Edit** in the top right corner.
1. Select **Add another file**.
1. Add your content to the file in the form fields provided.
-1. Click **Save changes**.
+1. Select **Save changes**.
To delete a file from your snippet through the GitLab UI:
1. Go to your snippet in the GitLab UI.
-1. Click **Edit** in the top right.
+1. Select **Edit** in the top right corner.
1. Select **Delete file** alongside the filename of each file
you wish to delete.
-1. Click **Save changes**.
-
-### Cloning snippets
+1. Select **Save changes**.
-Snippets can be cloned as a regular Git repository using SSH or HTTPS. Click the **Clone**
-button above the snippet content to copy the URL of your choice.
+## Clone snippets
-![Clone Snippet](img/snippet_clone_button_v13_0.png)
+Instead of copying a snippet to a local file, you may want to clone a snippet to
+preserve its relationship with the repository, so you can receive or make updates
+as needed. Select the **Clone** button on a snippet to display the URLs to clone with SSH or HTTPS:
-This allows you to have a local copy of the snippet's repository and make
-changes as needed. You can commit those changes and push them to the remote
-`master` branch.
+![Clone snippet](img/snippet_clone_button_v13_0.png)
-### Reduce snippets repository size
-
-Because versioned Snippets are considered as part of the [namespace storage size](../user/admin_area/settings/account_and_limit_settings.md),
-it's recommended to keep snippets' repositories as compact as possible.
-
-For more information about tools to compact repositories,
-see the documentation on [reducing repository size](../user/project/repository/reducing_the_repo_size_using_git.md).
+You can commit changes to a cloned snippet, and push the changes to GitLab.
-### Limitations
+## Embed snippets
-- Binary files are not supported.
-- Creating or deleting branches is not supported. Only a default `master` branch is used.
-- Git tags are not supported in snippet repositories.
-- Snippets' repositories are limited to 10 files. Attempting to push more
- than 10 files results in an error.
-- Revisions are not visible to the user on the GitLab UI, but this feature is planned
- in future iterations. See the [revisions tab issue](https://gitlab.com/gitlab-org/gitlab/-/issues/39271)
- for updates.
-- The [maximum size for a snippet](../administration/snippets/index.md#snippets-content-size-limit)
- is 50 MB, by default.
-- Git LFS is not supported.
+Public snippets can be shared and embedded on any website. You can reuse a GitLab snippet in multiple places, and any change to the source
+is reflected in the embedded snippets. When embedded, users can download it, or view the snippet in raw format.
-## Discover snippets
+To embed a snippet:
-There are two main ways of how you can discover snippets in GitLab.
+1. Confirm your snippet is publicly visible:
+ - *If it's a project snippet*, the project must be public.
+ - The snippet is publicly visible.
+ - In **Project > Settings > Permissions**, the snippets
+ permissions are set to **Everyone with access**.
+1. In your snippet's **Embed** section, select **Copy** to copy a one-line script you can add to any website or blog post. For example:
-For exploring all snippets that are visible to you, you can go to the Snippets
-dashboard of your GitLab instance via the top navigation. For GitLab.com you can
-navigate to an [overview]((https://gitlab.com/dashboard/snippets)) that shows snippets
-you created and allows you to explore all snippets.
+ ```html
+ <script src="https://gitlab.com/namespace/project/snippets/SNIPPET_ID.js"></script>
+ ```
-To discover snippets that belong to a specific project, navigate
-to the Snippets page via the left side navigation on the project page.
-Project snippets are enabled and available by default. You can
-disable them by navigating to your project's **Settings**, expanding
-**Visibility, project features, permissions** and scrolling down to
-**Snippets**. From there, you can toggle to disable them or select a
-different visibility level from the dropdown menu.
+1. Add your script to your file.
-## Snippet comments
+Embedded snippets display a header that shows:
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/12910) in GitLab 9.2.
+- The filename, if defined.
+- The snippet size.
+- A link to GitLab.
+- The actual snippet content.
-With GitLab Snippets you engage in a conversation about that piece of code,
-encouraging user collaboration.
+For example:
-## Downloading snippets
+<script src="https://gitlab.com/gitlab-org/gitlab-foss/snippets/1717978.js"></script>
-You can download the raw content of a snippet.
+## Download snippets
-By default snippets are downloaded with Linux-style line endings (`LF`). If
+You can download the raw content of a snippet. By default, they download with Linux-style line endings (`LF`). If
you want to preserve the original line endings you need to add a parameter `line_ending=raw`
(For example: `https://gitlab.com/snippets/SNIPPET_ID/raw?line_ending=raw`). In case a
snippet was created using the GitLab web interface the original line ending is Windows-like (`CRLF`).
-## Embedded snippets
-
-> Introduced in GitLab 10.8.
+## Comment on snippets
-Public snippets can not only be shared, but also embedded on any website. With
-this, you can reuse a GitLab snippet in multiple places and any change to the source
-is automatically reflected in the embedded snippet.
+With snippets, you engage in a conversation about that piece of code,
+which can encourage user collaboration.
-To embed a snippet, first make sure that:
+## Troubleshooting
-- The project is public (if it's a project snippet)
-- The snippet is public
-- In **Project > Settings > Permissions**, the snippets permissions are
- set to **Everyone with access**
+### Snippet limitations
-After the above conditions are met, the **Embed** section appears in your
-snippet. Click the **Copy** button to copy a one-line
-script that you can add to any website or blog post. For example:
-
-```html
-<script src="https://gitlab.com/namespace/project/snippets/SNIPPET_ID.js"></script>
-```
-
-Here's what an embedded snippet looks like:
-
-<script src="https://gitlab.com/gitlab-org/gitlab-foss/snippets/1717978.js"></script>
+- Binary files are not supported.
+- Creating or deleting branches is not supported. Only the default branch is used.
+- Git tags are not supported in snippet repositories.
+- Snippets' repositories are limited to 10 files. Attempting to push more
+ than 10 files results in an error.
+- Revisions are not visible to the user on the GitLab UI, but this feature is planned
+ in future iterations. See the [revisions tab issue](https://gitlab.com/gitlab-org/gitlab/-/issues/39271)
+ for updates.
+- The [maximum size for a snippet](../administration/snippets/index.md#snippets-content-size-limit)
+ is 50 MB, by default.
+- Git LFS is not supported.
-Embedded snippets are displayed with a header that shows:
+### Reduce snippets repository size
-- The filename, if defined.
-- The snippet size.
-- A link to GitLab.
-- The actual snippet content.
+Because versioned snippets are considered as part of the [namespace storage size](../user/admin_area/settings/account_and_limit_settings.md),
+it's recommended to keep snippets' repositories as compact as possible.
-Actions in the header enable users to see the snippet in raw format, and download it.
+For more information about tools to compact repositories,
+see the documentation on [reducing repository size](../user/project/repository/reducing_the_repo_size_using_git.md).
diff --git a/doc/user/upgrade_email_bypass.md b/doc/user/upgrade_email_bypass.md
index 183ce5e4312..199c1a47e04 100644
--- a/doc/user/upgrade_email_bypass.md
+++ b/doc/user/upgrade_email_bypass.md
@@ -116,7 +116,7 @@ LDAP Users remain confirmed if all of the following conditions are met:
- The ["User email confirmation at sign-up" option](../security/user_email_confirmation.md) is set to false.
- The first sign-in is based on user LDAP credentials.
-- The user has added and verified [a secondary email address](profile/index.md#user-settings) some time later.
+- The user has added and verified [a secondary email address](profile/index.md) some time later.
NOTE:
Confirmation timestamps (primary vs. secondary) are different.
@@ -124,6 +124,6 @@ Confirmation timestamps (primary vs. secondary) are different.
Users remain unconfirmed by the background migration if any of the following conditions are met:
- They [create an account through GitLab](profile/account/create_accounts.md).
-- They [swap their primary email address](profile/index.md#user-settings) and verify it.
+- They [swap their primary email address](profile/index.md#change-the-email-displayed-on-your-commits) and verify it.
- If they have two email addresses with the same `confirmed_at` timestamp due to the linked [security issue](https://gitlab.com/gitlab-org/gitlab/-/issues/121664).
- [LDAP is introduced](../administration/auth/ldap/index.md), and users' primary email address matches that in LDAP.