diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-02-09 12:09:19 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-02-09 12:09:19 +0300 |
commit | e7462f7b49a60b2ee7be14682c23190f7f7c5ba7 (patch) | |
tree | 3437f7c7c7931ff2e017de00e69dea10f3d00b57 | |
parent | 43d38aaae05e2ac7e84c035c50844e084c3e54d3 (diff) |
Add latest changes from gitlab-org/gitlab@master
77 files changed, 1386 insertions, 602 deletions
diff --git a/app/assets/javascripts/artifacts_settings/graphql/queries/get_keep_latest_artifact_application_setting.query.graphql b/app/assets/javascripts/artifacts_settings/graphql/queries/get_keep_latest_artifact_application_setting.query.graphql new file mode 100644 index 00000000000..9d833d81a3f --- /dev/null +++ b/app/assets/javascripts/artifacts_settings/graphql/queries/get_keep_latest_artifact_application_setting.query.graphql @@ -0,0 +1,5 @@ +query getKeepLatestArtifactApplicationSetting { + ciApplicationSettings { + keepLatestArtifact + } +} diff --git a/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue b/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue index 5684033f3af..a0cf91bbe7a 100644 --- a/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue +++ b/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue @@ -2,12 +2,22 @@ import { GlAlert, GlFormCheckbox, GlLink } from '@gitlab/ui'; import { __ } from '~/locale'; import GetKeepLatestArtifactProjectSetting from './graphql/queries/get_keep_latest_artifact_project_setting.query.graphql'; +import GetKeepLatestArtifactApplicationSetting from './graphql/queries/get_keep_latest_artifact_application_setting.query.graphql'; import UpdateKeepLatestArtifactProjectSetting from './graphql/mutations/update_keep_latest_artifact_project_setting.mutation.graphql'; -const FETCH_ERROR = __('There was a problem fetching the keep latest artifact setting.'); -const UPDATE_ERROR = __('There was a problem updating the keep latest artifact setting.'); - export default { + errors: { + fetchError: __('There was a problem fetching the keep latest artifacts setting.'), + updateError: __('There was a problem updating the keep latest artifacts setting.'), + }, + i18n: { + enabledHelpText: __( + 'The latest artifacts created by jobs in the most recent successful pipeline will be stored.', + ), + disabledHelpText: __('This feature is disabled at the instance level.'), + helpLinkText: __('More information'), + checkboxText: __('Keep artifacts from most recent successful jobs'), + }, components: { GlAlert, GlFormCheckbox, @@ -33,21 +43,33 @@ export default { return data.project?.ciCdSettings?.keepLatestArtifact; }, error() { - this.reportError(FETCH_ERROR); + this.reportError(this.$options.errors.fetchError); + }, + }, + projectSettingDisabled: { + query: GetKeepLatestArtifactApplicationSetting, + update(data) { + return !data.ciApplicationSettings?.keepLatestArtifact; }, }, }, data() { return { - keepLatestArtifact: true, + keepLatestArtifact: null, errorMessage: '', isAlertDismissed: false, + projectSettingDisabled: true, }; }, computed: { shouldShowAlert() { return this.errorMessage && !this.isAlertDismissed; }, + helpText() { + return this.projectSettingDisabled + ? this.$options.i18n.disabledHelpText + : this.$options.i18n.enabledHelpText; + }, }, methods: { reportError(error) { @@ -65,10 +87,10 @@ export default { }); if (data.ciCdSettingsUpdate.errors.length) { - this.reportError(UPDATE_ERROR); + this.reportError(this.$options.errors.updateError); } } catch (error) { - this.reportError(UPDATE_ERROR); + this.reportError(this.$options.errors.updateError); } }, }, @@ -84,16 +106,13 @@ export default { @dismiss="isAlertDismissed = true" >{{ errorMessage }}</gl-alert > - <gl-form-checkbox v-model="keepLatestArtifact" @change="updateSetting" - ><b class="gl-mr-3">{{ __('Keep artifacts from most recent successful jobs') }}</b> - <gl-link :href="helpPagePath">{{ __('More information') }}</gl-link></gl-form-checkbox - > - <p> - {{ - __( - 'The latest artifacts created by jobs in the most recent successful pipeline will be stored.', - ) - }} - </p> + <gl-form-checkbox + v-model="keepLatestArtifact" + :disabled="projectSettingDisabled" + @change="updateSetting" + ><strong class="gl-mr-3">{{ $options.i18n.checkboxText }}</strong> + <gl-link :href="helpPagePath">{{ $options.i18n.helpLinkText }}</gl-link> + <template v-if="!$apollo.loading" #help>{{ helpText }}</template> + </gl-form-checkbox> </div> </template> diff --git a/app/graphql/types/ci/application_setting_type.rb b/app/graphql/types/ci/application_setting_type.rb new file mode 100644 index 00000000000..8616280057c --- /dev/null +++ b/app/graphql/types/ci/application_setting_type.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Types + module Ci + class ApplicationSettingType < BaseObject + graphql_name 'CiApplicationSettings' + + authorize :read_application_setting + + field :keep_latest_artifact, GraphQL::BOOLEAN_TYPE, null: true, + description: 'Whether to keep the latest jobs artifacts.' + end + end +end diff --git a/app/graphql/types/ci/ci_cd_setting_type.rb b/app/graphql/types/ci/ci_cd_setting_type.rb index e80771cdf9d..b34a91446a2 100644 --- a/app/graphql/types/ci/ci_cd_setting_type.rb +++ b/app/graphql/types/ci/ci_cd_setting_type.rb @@ -14,7 +14,8 @@ module Types description: 'Whether merge trains are enabled.', method: :merge_trains_enabled? field :keep_latest_artifact, GraphQL::BOOLEAN_TYPE, null: true, - description: 'Whether to keep the latest builds artifacts.' + description: 'Whether to keep the latest builds artifacts.', + method: :keep_latest_artifacts_available? field :project, Types::ProjectType, null: true, description: 'Project the CI/CD settings belong to.' end diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb index 3c6705add00..1d1ab4f2e17 100644 --- a/app/graphql/types/query_type.rb +++ b/app/graphql/types/query_type.rb @@ -87,6 +87,10 @@ module Types description: 'Get statistics on the instance.', resolver: Resolvers::Admin::Analytics::InstanceStatistics::MeasurementsResolver + field :ci_application_settings, Types::Ci::ApplicationSettingType, + null: true, + description: 'CI related settings that apply to the entire instance.' + field :runner_platforms, Types::Ci::RunnerPlatformType.connection_type, null: true, description: 'Supported runner platforms.', resolver: Resolvers::Ci::RunnerPlatformsResolver @@ -128,6 +132,14 @@ module Types def current_user context[:current_user] end + + def ci_application_settings + application_settings + end + + def application_settings + Gitlab::CurrentSettings.current_application_settings + end end end diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 6c830ef080e..185c86bd3ca 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -339,7 +339,8 @@ module ApplicationSettingsHelper :container_registry_delete_tags_service_timeout, :rate_limiting_response_text, :container_registry_expiration_policies_worker_capacity, - :container_registry_cleanup_tags_service_max_list_size + :container_registry_cleanup_tags_service_max_list_size, + :keep_latest_artifact ] end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 6d23bd661d2..027cc372ecb 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -525,6 +525,10 @@ class ApplicationSetting < ApplicationRecord current_without_cache end + def self.find_or_create_without_cache + current_without_cache || create_from_defaults + end + # Due to the frequency with which settings are accessed, it is # likely that during a backup restore a running GitLab process # will insert a new `application_settings` row before the diff --git a/app/models/project.rb b/app/models/project.rb index d2b996b6911..b8ca8a744c8 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -411,7 +411,7 @@ class Project < ApplicationRecord delegate :dashboard_timezone, to: :metrics_setting, allow_nil: true, prefix: true delegate :default_git_depth, :default_git_depth=, to: :ci_cd_settings, prefix: :ci delegate :forward_deployment_enabled, :forward_deployment_enabled=, :forward_deployment_enabled?, to: :ci_cd_settings, prefix: :ci - delegate :keep_latest_artifact, :keep_latest_artifact=, :keep_latest_artifact?, to: :ci_cd_settings, prefix: :ci + delegate :keep_latest_artifact, :keep_latest_artifact=, :keep_latest_artifact?, :keep_latest_artifacts_available?, to: :ci_cd_settings delegate :restrict_user_defined_variables, :restrict_user_defined_variables=, :restrict_user_defined_variables?, to: :ci_cd_settings delegate :actual_limits, :actual_plan_name, to: :namespace, allow_nil: true @@ -837,8 +837,12 @@ class Project < ApplicationRecord webide_pipelines.running_or_pending.for_user(user) end - def latest_pipeline_locked - ci_keep_latest_artifact? ? :artifacts_locked : :unlocked + def default_pipeline_lock + if keep_latest_artifacts_available? + return :artifacts_locked + end + + :unlocked end def autoclose_referenced_issues diff --git a/app/models/project_ci_cd_setting.rb b/app/models/project_ci_cd_setting.rb index e5fc481b035..31be0759cd0 100644 --- a/app/models/project_ci_cd_setting.rb +++ b/app/models/project_ci_cd_setting.rb @@ -21,6 +21,11 @@ class ProjectCiCdSetting < ApplicationRecord super && ::Feature.enabled?(:forward_deployment_enabled, project, default_enabled: true) end + def keep_latest_artifacts_available? + # The project level feature can only be enabled when the feature is enabled instance wide + Gitlab::CurrentSettings.current_application_settings.keep_latest_artifact? && keep_latest_artifact? + end + private def set_default_git_depth diff --git a/app/policies/application_setting_policy.rb b/app/policies/application_setting_policy.rb new file mode 100644 index 00000000000..114c71fd99d --- /dev/null +++ b/app/policies/application_setting_policy.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class ApplicationSettingPolicy < BasePolicy # rubocop:disable Gitlab/NamespacedClass + rule { admin }.enable :read_application_setting +end diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml index 331b028f176..f11770b397e 100644 --- a/app/views/admin/application_settings/_ci_cd.html.haml +++ b/app/views/admin/application_settings/_ci_cd.html.haml @@ -42,6 +42,14 @@ = html_escape(_("Set the default expiration time for each job's artifacts. 0 for unlimited. The default unit is in seconds, but you can define an alternative. For example: %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'default-artifacts-expiration') .form-group + .form-check + = f.check_box :keep_latest_artifact, class: 'form-check-input' + = f.label :keep_latest_artifact, class: 'form-check-label' do + %strong + = s_('AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines') + .form-text.text-muted + = s_('AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire.') + .form-group = f.label :archive_builds_in_human_readable, _('Archive jobs'), class: 'label-bold' = f.text_field :archive_builds_in_human_readable, class: 'form-control gl-form-input', placeholder: 'never' .form-text.text-muted @@ -51,8 +59,8 @@ = f.check_box :protected_ci_variables, class: 'form-check-input' = f.label :protected_ci_variables, class: 'form-check-label' do = s_('AdminSettings|Environment variables are protected by default') - .form-text.text-muted - = s_('AdminSettings|When creating a new environment variable it will be protected by default.') + .form-text.text-muted + = s_('AdminSettings|When creating a new environment variable it will be protected by default.') .form-group = f.label :ci_config_path, _('Default CI configuration path'), class: 'label-bold' = f.text_field :default_ci_config_path, class: 'form-control gl-form-input', placeholder: '.gitlab-ci.yml' diff --git a/app/views/ci/variables/_header.html.haml b/app/views/ci/variables/_header.html.haml index d882a96dd42..a1b7f6efe54 100644 --- a/app/views/ci/variables/_header.html.haml +++ b/app/views/ci/variables/_header.html.haml @@ -3,7 +3,7 @@ %h4 = _('Variables') -%button.btn.btn-default.js-settings-toggle{ type: 'button' } +%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p diff --git a/app/views/projects/_new_project_push_tip.html.haml b/app/views/projects/_new_project_push_tip.html.haml index e008130436c..a63b4bed9de 100644 --- a/app/views/projects/_new_project_push_tip.html.haml +++ b/app/views/projects/_new_project_push_tip.html.haml @@ -8,4 +8,4 @@ %span.input-group-append = clipboard_button(text: push_to_create_project_command, title: _("Copy command"), class: 'input-group-text', placement: "right") %p - = link_to("What does this command do?", help_page_path("gitlab-basics/create-project", anchor: "push-to-create-a-new-project"), target: "_blank") + = link_to("What does this command do?", help_page_path("user/project/working_with_projects", anchor: "push-to-create-a-new-project"), target: "_blank") diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 6af185696b0..45e7eae8c70 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -28,7 +28,7 @@ %p %strong= _("Tip:") = _("You can also create a project from the command line.") - %a.push-new-project-tip{ data: { title: _("Push to create a project") }, href: help_page_path('gitlab-basics/create-project', anchor: 'push-to-create-a-new-project'), target: "_blank", rel: "noopener noreferrer" } + %a.push-new-project-tip{ data: { title: _("Push to create a project") }, href: help_page_path('user/project/working_with_projects', anchor: 'push-to-create-a-new-project'), target: "_blank", rel: "noopener noreferrer" } = _("Show command") %template.push-new-project-tip-template= render partial: "new_project_push_tip" diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml index 2e4542a033e..5f79dd3d4bb 100644 --- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml +++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml @@ -54,4 +54,4 @@ = s_('CICD|Automatic deployment to staging, manual deployment to production') = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/customize.md', anchor: 'incremental-rollout-to-production'), target: '_blank' - = f.submit _('Save changes'), class: "btn btn-success gl-mt-5", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), class: "btn gl-button btn-success gl-mt-5", data: { qa_selector: 'save_changes_button' } diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml index baf80c0a103..ee49377595b 100644 --- a/app/views/projects/settings/ci_cd/show.html.haml +++ b/app/views/projects/settings/ci_cd/show.html.haml @@ -9,7 +9,7 @@ .settings-header %h4 = _("General pipelines") - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _("Customize your pipeline configuration and coverage report.") @@ -20,7 +20,7 @@ .settings-header %h4 = s_('CICD|Auto DevOps') - %button.btn.btn-default.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p - auto_devops_url = help_page_path('topics/autodevops/index') @@ -37,7 +37,7 @@ .settings-header %h4 = _("Runners") - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _("Runners are processes that pick up and execute CI/CD jobs for GitLab.") @@ -49,7 +49,7 @@ .settings-header %h4 = _("Artifacts") - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _("A job artifact is an archive of files and directories saved by a job when it finishes.") @@ -66,7 +66,7 @@ .settings-header %h4 = _("Pipeline triggers") - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _("Trigger a pipeline for a branch or tag by generating a trigger token and using it with an API call. The token impersonates a user's project access and permissions.") @@ -79,7 +79,7 @@ .settings-header %h4 = _("Clean up image tags") - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p = _("Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want.") @@ -94,7 +94,7 @@ .settings-header %h4 = _("Deploy freezes") - %button.btn.js-settings-toggle{ type: 'button' } + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p - freeze_period_docs = help_page_path('user/project/releases/index', anchor: 'prevent-unintentional-releases-by-setting-a-deploy-freeze') diff --git a/changelogs/unreleased/276583-make-keep-latest-artifact-an-instance-level-configuration.yml b/changelogs/unreleased/276583-make-keep-latest-artifact-an-instance-level-configuration.yml new file mode 100644 index 00000000000..548453c8a11 --- /dev/null +++ b/changelogs/unreleased/276583-make-keep-latest-artifact-an-instance-level-configuration.yml @@ -0,0 +1,5 @@ +--- +title: Add keep latest artifact option for instances +merge_request: 50889 +author: +type: added diff --git a/changelogs/unreleased/gl-button-ci-cd.yml b/changelogs/unreleased/gl-button-ci-cd.yml new file mode 100644 index 00000000000..90223c403da --- /dev/null +++ b/changelogs/unreleased/gl-button-ci-cd.yml @@ -0,0 +1,5 @@ +--- +title: Apply new GitLab UI for toggle buttons in CI/CD settings page +merge_request: 53556 +author: Yogi (@yo) +type: other diff --git a/db/migrate/20210106225424_add_keep_latest_artifacts_to_application_settings.rb b/db/migrate/20210106225424_add_keep_latest_artifacts_to_application_settings.rb new file mode 100644 index 00000000000..884159ddedb --- /dev/null +++ b/db/migrate/20210106225424_add_keep_latest_artifacts_to_application_settings.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddKeepLatestArtifactsToApplicationSettings < ActiveRecord::Migration[6.0] + DOWNTIME = false + + def change + # This is named keep_latest_artifact for consistency with the project level setting but + # turning it on keeps all (multiple) artifacts on the latest pipeline per ref + add_column :application_settings, :keep_latest_artifact, :boolean, default: true, null: false + end +end diff --git a/db/schema_migrations/20210106225424 b/db/schema_migrations/20210106225424 new file mode 100644 index 00000000000..84878ee30f4 --- /dev/null +++ b/db/schema_migrations/20210106225424 @@ -0,0 +1 @@ +a0561e52982756aded22563e833ab8005b4f45b84c81e872dd8c7188aeb84434
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 7400b023fd5..f0e04477052 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -9412,6 +9412,7 @@ CREATE TABLE application_settings ( enforce_ssh_key_expiration boolean DEFAULT false NOT NULL, git_two_factor_session_expiry integer DEFAULT 15 NOT NULL, asset_proxy_allowlist text, + keep_latest_artifact boolean DEFAULT true NOT NULL, CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)), CONSTRAINT app_settings_registry_exp_policies_worker_capacity_positive CHECK ((container_registry_expiration_policies_worker_capacity >= 0)), CONSTRAINT check_17d9558205 CHECK ((char_length((kroki_url)::text) <= 1024)), diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md index 6738b912dab..28283beb642 100644 --- a/doc/administration/gitaly/index.md +++ b/doc/administration/gitaly/index.md @@ -1161,7 +1161,7 @@ Confirm the following are all true: - When any user adds or modifies a file from the repository using the GitLab UI, it immediately fails with a red `401 Unauthorized` banner. -- Creating a new project and [initializing it with a README](../../gitlab-basics/create-project.md#blank-projects) +- 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 a Gitaly client and reproducing the error, you get `401` errors diff --git a/doc/administration/reference_architectures/troubleshooting.md b/doc/administration/reference_architectures/troubleshooting.md index 835231ac584..cab45a99ee4 100644 --- a/doc/administration/reference_architectures/troubleshooting.md +++ b/doc/administration/reference_architectures/troubleshooting.md @@ -298,7 +298,7 @@ Confirm the following are all true: - When any user adds or modifies a file from the repository using the GitLab UI, it immediately fails with a red `401 Unauthorized` banner. -- Creating a new project and [initializing it with a README](../../gitlab-basics/create-project.md#blank-projects) +- 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: diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 53e5925affa..f507d0fe0dd 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -1078,6 +1078,56 @@ 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!] +} + +""" +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 { @@ -2483,6 +2533,13 @@ type BurnupChartDailyTotals { scopeWeight: Int! } +type CiApplicationSettings { + """ + Whether to keep the latest jobs artifacts. + """ + keepLatestArtifact: Boolean +} + type CiBuildNeed { """ Name of the job we need to complete. @@ -18466,6 +18523,11 @@ type Project { 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 @@ -20844,6 +20906,11 @@ type PromoteToEpicPayload { 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( diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index ca1046e1b40..cbbfb3f3e8a 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -2679,6 +2679,141 @@ "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": "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", @@ -6548,6 +6683,33 @@ }, { "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": [ @@ -54453,6 +54615,20 @@ "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": [ @@ -60659,6 +60835,20 @@ "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": [ diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index e39bf8c1cf9..648f08ff8a1 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -180,6 +180,25 @@ Autogenerated return type of AlertTodoCreate. | `issue` | Issue | The issue created after mutation. | | `todo` | Todo | The to-do item after mutation. | +### 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. | + +### ApiFuzzingScanProfile + +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. | + ### AwardEmoji An emoji awarded by a user. @@ -388,6 +407,12 @@ Represents the total number of issues and their weights for a particular day. | `scopeCount` | Int! | Number of issues as of this day | | `scopeWeight` | Int! | Total weight of issues as of this day | +### CiApplicationSettings + +| Field | Type | Description | +| ----- | ---- | ----------- | +| `keepLatestArtifact` | Boolean | Whether to keep the latest jobs artifacts. | + ### CiBuildNeed | Field | Type | Description | @@ -2800,6 +2825,7 @@ Autogenerated return type of PipelineRetry. | `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. | @@ -4575,6 +4601,15 @@ Alert status values. | `RESOLVED` | Resolved status | | `TRIGGERED` | Triggered status | +### ApiFuzzingScanMode + +All possible ways to specify the API surface for an API fuzzing scan. + +| Value | Description | +| ----- | ----------- | +| `HAR` | The API surface is specified by a HAR file. | +| `OPENAPI` | The API surface is specified by a OPENAPI file. | + ### AvailabilityEnum User availability status. diff --git a/doc/api/projects.md b/doc/api/projects.md index c22b00ab8a2..321a95af8b5 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -1104,7 +1104,7 @@ POST /projects | `snippets_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. | | `snippets_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable snippets for this project. Use `snippets_access_level` instead. | | `tag_list` | array | **{dotted-circle}** No | The list of tags for a project; put array of tags, that should be finally assigned to a project. | -| `template_name` | string | **{dotted-circle}** No | When used without `use_custom_template`, name of a [built-in project template](../gitlab-basics/create-project.md#built-in-templates). When used with `use_custom_template`, name of a custom project template. | +| `template_name` | string | **{dotted-circle}** No | When used without `use_custom_template`, name of a [built-in project template](../user/project/working_with_projects.md#built-in-templates). When used with `use_custom_template`, name of a custom project template. | | `template_project_id` **(PREMIUM)** | integer | **{dotted-circle}** No | When used with `use_custom_template`, project ID of a custom project template. This is preferable to using `template_name` since `template_name` may be ambiguous. | | `use_custom_template` **(PREMIUM)** | boolean | **{dotted-circle}** No | Use either custom [instance](../user/admin_area/custom_project_templates.md) or [group](../user/group/custom_project_templates.md) (with `group_with_project_templates_id`) project template. | | `visibility` | string | **{dotted-circle}** No | See [project visibility level](#project-visibility-level). | @@ -1177,7 +1177,7 @@ POST /projects/user/:user_id | `snippets_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable snippets for this project. Use `snippets_access_level` instead. | | `suggestion_commit_message` | string | **{dotted-circle}** No | The commit message used to apply merge request suggestions. | | `tag_list` | array | **{dotted-circle}** No | The list of tags for a project; put array of tags, that should be finally assigned to a project. | -| `template_name` | string | **{dotted-circle}** No | When used without `use_custom_template`, name of a [built-in project template](../gitlab-basics/create-project.md#built-in-templates). When used with `use_custom_template`, name of a custom project template. | +| `template_name` | string | **{dotted-circle}** No | When used without `use_custom_template`, name of a [built-in project template](../user/project/working_with_projects.md#built-in-templates). When used with `use_custom_template`, name of a custom project template. | | `use_custom_template` **(PREMIUM)** | boolean | **{dotted-circle}** No | Use either custom [instance](../user/admin_area/custom_project_templates.md) or [group](../user/group/custom_project_templates.md) (with `group_with_project_templates_id`) project template. | | `user_id` | integer | **{check-circle}** Yes | The user ID of the project owner. | | `visibility` | string | **{dotted-circle}** No | See [project visibility level](#project-visibility-level). | diff --git a/doc/api/settings.md b/doc/api/settings.md index 05ea25a1955..42b09060ca7 100644 --- a/doc/api/settings.md +++ b/doc/api/settings.md @@ -85,7 +85,8 @@ Example response: "wiki_page_max_content_bytes": 52428800, "require_admin_approval_after_user_signup": false, "personal_access_token_prefix": "GL-", - "rate_limiting_response_text": null + "rate_limiting_response_text": null, + "keep_latest_artifact": true } ``` @@ -179,7 +180,8 @@ Example response: "wiki_page_max_content_bytes": 52428800, "require_admin_approval_after_user_signup": false, "personal_access_token_prefix": "GL-", - "rate_limiting_response_text": null + "rate_limiting_response_text": null, + "keep_latest_artifact": true } ``` 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 bef3b54bf4e..2a8b050b224 100644 --- a/doc/ci/ci_cd_for_external_repos/github_integration.md +++ b/doc/ci/ci_cd_for_external_repos/github_integration.md @@ -35,7 +35,7 @@ repositories: your project, update commit statuses, and create a web hook to notify GitLab of new commits. -1. In GitLab, go to the [new project page](../../gitlab-basics/create-project.md#create-a-project-in-gitlab), select the **CI/CD for external repository** tab, and then click +1. In GitLab, go to the [new project page](../../user/project/working_with_projects.md#create-a-project), select the **CI/CD for external repository** tab, and then click **GitHub**. 1. Paste the token into the **Personal access token** field and click **List diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md index 2ad12992aaf..3fbbb436c63 100644 --- a/doc/ci/cloud_deployment/index.md +++ b/doc/ci/cloud_deployment/index.md @@ -299,7 +299,7 @@ include: - template: Auto-DevOps.gitlab-ci.yml variables: - - AUTO_DEVOPS_PLATFORM_TARGET: EC2 + AUTO_DEVOPS_PLATFORM_TARGET: EC2 build_artifact: stage: build diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md index 58e12fdd733..b5792c2bbc4 100644 --- a/doc/ci/environments/index.md +++ b/doc/ci/environments/index.md @@ -57,7 +57,7 @@ Configuring environments involves: The rest of this section illustrates how to configure environments and deployments using an example scenario. It assumes you have already: -- Created a [project](../../gitlab-basics/create-project.md) in GitLab. +- Created a [project](../../user/project/working_with_projects.md#create-a-project) in GitLab. - Set up [a runner](../runners/README.md). In the scenario: 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 dbbc751acf9..855f3e599f1 100644 --- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md +++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md @@ -69,7 +69,7 @@ This test will be used later for continuously testing our app with GitLab CI/CD. ### Push to GitLab Since we have our app up and running locally, it's time to push the codebase to our remote repository. -Let's create [a new project](../../../gitlab-basics/create-project.md) in GitLab named `laravel-sample`. +Let's create [a new project](../../../user/project/working_with_projects.md#create-a-project) in GitLab named `laravel-sample`. After that, follow the command line instructions displayed on the project's homepage to initiate the repository on our machine and push the first commit. ```shell diff --git a/doc/ci/pipelines/job_artifacts.md b/doc/ci/pipelines/job_artifacts.md index 769f4ff9245..7daaa7821c7 100644 --- a/doc/ci/pipelines/job_artifacts.md +++ b/doc/ci/pipelines/job_artifacts.md @@ -484,6 +484,9 @@ a project, you can disable this behavior to save space: 1. Navigate to **Settings > CI/CD > Artifacts**. 1. Uncheck **Keep artifacts from most recent successful jobs**. +You can disable this behavior for all projects on a self-managed instance in the +[instance's CI/CD settings](../../user/admin_area/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines). **(CORE ONLY)** + 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/ci/yaml/README.md b/doc/ci/yaml/README.md index 7bd691aabba..06443d377b9 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -3331,7 +3331,9 @@ job: The latest artifacts for refs are locked against deletion, and kept regardless of the expiry time. [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/16267) GitLab 13.0 behind a disabled feature flag, and [made the default behavior](https://gitlab.com/gitlab-org/gitlab/-/issues/229936) -in GitLab 13.4. In [GitLab 13.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/241026), you can [disable this behavior in the CI/CD settings](../pipelines/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs). +in GitLab 13.4. + +In [GitLab 13.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/241026), you can [disable this behavior at the project level in the CI/CD settings](../pipelines/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs). In [GitLab 13.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/276583), you can [disable this behavior instance-wide](../../user/admin_area/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines). #### `artifacts:reports` diff --git a/doc/development/code_review.md b/doc/development/code_review.md index e1a758f481f..0090372bb9f 100644 --- a/doc/development/code_review.md +++ b/doc/development/code_review.md @@ -385,9 +385,12 @@ When ready to merge: - Consider using the [Squash and merge](../user/project/merge_requests/squash_and_merge.md#squash-and-merge) feature when the merge request has a lot of commits. - When merging code a maintainer should only use the squash feature if the - author has already set this option or if the merge request clearly contains a - messy commit history that is intended to be squashed. + When merging code, a maintainer should only use the squash feature if the + author has already set this option, or if the merge request clearly contains a + messy commit history, it will be more efficient to squash commits instead of + circling back with the author about that. Otherwise, if the MR only has a few commits, we'll + be respecting the author's setting by not squashing them. + - **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 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 diff --git a/doc/development/interacting_components.md b/doc/development/interacting_components.md index 50751dcc539..4c2d0580428 100644 --- a/doc/development/interacting_components.md +++ b/doc/development/interacting_components.md @@ -29,5 +29,5 @@ See also [File Storage in GitLab](file_storage.md). ### Forks GitLab supports a great amount of features for [merge requests](../user/project/merge_requests/index.md). One -of them is the ability to create merge requests from and to [forks](../gitlab-basics/fork-project.md), +of them is the ability to create merge requests from and to [forks](../user/project/working_with_projects.md#fork-a-project), which should also be highly considered and tested upon development phase. diff --git a/doc/development/usage_ping/metrics_dictionary.md b/doc/development/usage_ping/metrics_dictionary.md index 7c41c331e88..f4f1993664c 100644 --- a/doc/development/usage_ping/metrics_dictionary.md +++ b/doc/development/usage_ping/metrics_dictionary.md @@ -67,6 +67,8 @@ tier: ['free', 'starter', 'premium', 'ultimate', 'bronze', 'silver', 'gold'] The GitLab codebase provides a dedicated [generator](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb) to create new metric definitions. +For uniqueness, the generated file includes a timestamp prefix, in ISO 8601 format. + The generator takes the key path argument and 2 options and creates the metric YAML definition in corresponding location: - `--ee`, `--no-ee` Indicates if metric is for EE. diff --git a/doc/gitlab-basics/README.md b/doc/gitlab-basics/README.md index 0fb231be859..e0d0917db7c 100644 --- a/doc/gitlab-basics/README.md +++ b/doc/gitlab-basics/README.md @@ -22,12 +22,12 @@ This documentation is split into the following groups: 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](create-project.md), to start using GitLab. +- [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 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). -- [Fork a project](fork-project.md), to duplicate projects so they can be worked on in parallel. +- [Fork a project](../user/project/working_with_projects.md#fork-a-project), to duplicate projects so they can be worked on in parallel. - [Add a file](add-file.md), to add new files to a project's repository. - [Create an issue](../user/project/issues/managing_issues.md#create-a-new-issue), to start collaborating within a project. diff --git a/doc/gitlab-basics/create-project.md b/doc/gitlab-basics/create-project.md index c4fe522e6a2..18886120c63 100644 --- a/doc/gitlab-basics/create-project.md +++ b/doc/gitlab-basics/create-project.md @@ -1,175 +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: howto +redirect_to: '../user/project/working_with_projects.md' --- -# Create a project +This document was moved to [another location](../user/project/working_with_projects.md). -Most work in GitLab is done within a [Project](../user/project/index.md). Files and -code are saved in projects, and most features are used within the scope of projects. - -## Create a project in GitLab - -To create a project in GitLab: - -1. In your dashboard, click the green **New project** button or use the plus - icon in the navigation bar. This opens the **New project** page. -1. On the **New project** page, choose if you want to: - - Create a [blank project](#blank-projects). - - Create a project using one of the available [project templates](#project-templates). - - [Import a project](../user/project/import/index.md) from a different repository, - if enabled on your GitLab instance. Contact your GitLab administrator if this is unavailable. - - Run [CI/CD pipelines for external repositories](../ci/ci_cd_for_external_repos/index.md). **(PREMIUM)** - -NOTE: -For a list of words that can't be used as project names see -[Reserved project and group names](../user/reserved_names.md). - -### Blank projects - -To create a new blank project on the **New project** page: - -1. On the **Blank project** tab, provide the following information: - - The name of your project in the **Project name** field. You can't use - special characters, but you can use spaces, hyphens, underscores, or even - emoji. When adding the name, the **Project slug** auto populates. - The slug is what the GitLab instance uses as the URL path to the project. - If you want a different slug, input the project name first, - then change the slug after. - - The path to your project in the **Project slug** field. This is the URL - path for your project that the GitLab instance uses. If the - **Project name** is blank, it auto populates when you fill in - the **Project slug**. - - The **Project description (optional)** field enables you to enter a - description for your project's dashboard, which helps others - understand what your project is about. Though it's not required, it's a good - idea to fill this in. - - Changing the **Visibility Level** modifies the project's - [viewing and access rights](../public_access/public_access.md) for users. - - Selecting the **Initialize repository with a README** option creates a - README file so that the Git repository is initialized, has a default branch, and - can be cloned. -1. Click **Create project**. - -### Project templates - -Project templates can pre-populate a new project with the necessary files to get you -started quickly. - -There are two main types of project templates: - -- [Built-in templates](#built-in-templates), sourced from the following groups: - - [`project-templates`](https://gitlab.com/gitlab-org/project-templates) - - [`pages`](https://gitlab.com/pages) -- [Custom project templates](#custom-project-templates), for custom templates - configured by GitLab administrators and users. - -#### Built-in templates - -Built-in templates are project templates that are: - -- Developed and maintained in the [`project-templates`](https://gitlab.com/gitlab-org/project-templates) - and [`pages`](https://gitlab.com/pages) groups. -- Released with GitLab. - -To use a built-in template on the **New project** page: - -1. On the **Create from template** tab, select the **Built-in** tab. -1. From the list of available built-in templates, click the: - - **Preview** button to look at the template source itself. - - **Use template** button to start creating the project. -1. Finish creating the project by filling out the project's details. The process is - the same as creating a [blank project](#blank-projects). - -##### Enterprise templates **(ULTIMATE)** - -GitLab is developing Enterprise templates to help you streamline audit management with selected regulatory standards. These templates automatically import issues that correspond to each regulatory requirement. - -To create a new project with an Enterprise template, on the **New project** page: - -1. On the **Create from template** tab, select the **Built-in** tab. -1. From the list of available built-in Enterprise templates, click the: - - **Preview** button to look at the template source itself. - - **Use template** button to start creating the project. -1. Finish creating the project by filling out the project's details. The process is the same as creating a [blank project](#blank-projects). - -Available Enterprise templates include: - -- HIPAA Audit Protocol template ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13756) in GitLab 12.10) - -NOTE: -You can improve the existing built-in templates or contribute new ones in the -[`project-templates`](https://gitlab.com/gitlab-org/project-templates) and -[`pages`](https://gitlab.com/pages) groups by following [these steps](https://gitlab.com/gitlab-org/project-templates/contributing). - -#### Custom project templates **(PREMIUM)** - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.2. - -Creating new projects based on custom project templates is a convenient option for -quickly starting projects. - -Custom projects are available at the [instance-level](../user/admin_area/custom_project_templates.md) -from the **Instance** tab, or at the [group-level](../user/group/custom_project_templates.md) -from the **Group** tab, under the **Create from template** tab. - -To use a custom project template on the **New project** page: - -1. On the **Create from template** tab, select the **Instance** tab or the **Group** tab. -1. From the list of available custom templates, click the: - - **Preview** button to look at the template source itself. - - **Use template** button to start creating the project. -1. Finish creating the project by filling out the project's details. The process is - the same as creating a [blank project](#blank-projects). - -## Push to create a new project - -> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26388) in GitLab 10.5. - -When you create a new repository locally, instead of manually creating a new project in GitLab -and then [cloning the repository](start-using-git.md#clone-a-repository) -locally, you can directly push it to GitLab to create the new project, all without leaving -your terminal. If you have access rights to the associated namespace, GitLab -automatically creates a new project under that GitLab namespace with its visibility -set to Private by default (you can later change it in the [project's settings](../public_access/public_access.md#how-to-change-project-visibility)). - -This can be done by using either SSH or HTTPS: - -```shell -## Git push using SSH -git push --set-upstream git@gitlab.example.com:namespace/nonexistent-project.git master - -## Git push using HTTPS -git push --set-upstream https://gitlab.example.com/namespace/nonexistent-project.git master -``` - -You can pass the flag `--tags` to the `git push` command to export existing repository tags. - -Once the push finishes successfully, a remote message indicates -the command to set the remote and the URL to the new project: - -```plaintext -remote: -remote: The private project namespace/nonexistent-project was created. -remote: -remote: To configure the remote, run: -remote: git remote add origin https://gitlab.example.com/namespace/nonexistent-project.git -remote: -remote: To view the project, visit: -remote: https://gitlab.example.com/namespace/nonexistent-project -remote: -``` - -<!-- ## 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-05>. --> +<!-- 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/gitlab-basics/fork-project.md b/doc/gitlab-basics/fork-project.md index 2f8cde2e1b7..adb49c6970f 100644 --- a/doc/gitlab-basics/fork-project.md +++ b/doc/gitlab-basics/fork-project.md @@ -1,14 +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: howto +redirect_to: '../user/project/working_with_projects.md' --- -# How to fork a project +This document was moved to [another location](../user/project/working_with_projects.md). -A fork is a copy of an original repository that you put in another namespace -where you can experiment and apply changes that you can later decide whether or -not to share, without affecting the original project. - -It takes just a few steps to [fork a project in GitLab](../user/project/repository/forking_workflow.md#creating-a-fork). +<!-- This redirect file can be deleted after <2021-05-04>. --> +<!-- 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/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md index 778bbc63099..e88df5bb83f 100644 --- a/doc/gitlab-basics/start-using-git.md +++ b/doc/gitlab-basics/start-using-git.md @@ -278,7 +278,7 @@ identified by Git as the local content for that specific remote project. To add a remote repository to your local copy: -1. In GitLab, [create a new project](../gitlab-basics/create-project.md#push-to-create-a-new-project) to hold your files. +1. In GitLab, [create a new project](../user/project/working_with_projects.md#create-a-project) to hold your files. 1. Visit this project's homepage, scroll down to **Push an existing folder**, and copy the command that starts with `git remote add`. 1. On your computer, open the terminal in the directory you've initialized, paste the command you copied, and press <kbd>enter</kbd>: diff --git a/doc/intro/README.md b/doc/intro/README.md index 96d7806aa66..64453750504 100644 --- a/doc/intro/README.md +++ b/doc/intro/README.md @@ -11,7 +11,7 @@ comments: false Create projects and groups. -- [Create a new project](../gitlab-basics/create-project.md) +- [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) ## Prioritize diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md index 789f48bef4b..f2138637289 100644 --- a/doc/user/admin_area/settings/continuous_integration.md +++ b/doc/user/admin_area/settings/continuous_integration.md @@ -86,6 +86,25 @@ be updated for artifacts created before this setting was changed. The administrator may need to manually search for and expire previously-created artifacts, as described in the [troubleshooting documentation](../../../administration/troubleshooting/gitlab_rails_cheat_sheet.md#remove-artifacts-more-than-a-week-old). +## Keep the latest artifacts for all jobs in the latest successful pipelines **(CORE ONLY)** + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50889) in GitLab Core 13.9. + +When enabled (default), the artifacts for the most recent pipeline for a ref are +locked against deletion and kept regardless of the expiry time. + +When disabled, the latest artifacts for any **new** successful or fixed pipelines +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. + +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. + +NOTE: +All application settings have a [customizable cache expiry interval](../../../administration/application_settings_cache.md) which can delay the settings affect. + ## Shared runners pipeline minutes quota **(PREMIUM SELF)** > [Moved](https://about.gitlab.com/blog/2021/01/26/new-gitlab-product-subscription-model/) to GitLab Premium in 13.9. @@ -217,14 +236,13 @@ To set the maximum file size: 1. Enter the maximum file size, in bytes. 1. Click **Save size limits**. -<!-- ## Troubleshooting +## Troubleshooting + +### 413 Request Entity Too Large -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. +When build jobs fail with the following error, +increase the [maximum artifacts size](#maximum-artifacts-size). -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. --> +```plaintext +Uploading artifacts as "archive" to coordinator... too large archive <job-id> responseStatus=413 Request Entity Too Large status=413" at end of a build job on pipeline when trying to store artifacts to <object-storage>. +``` diff --git a/doc/user/group/index.md b/doc/user/group/index.md index 208c64d0406..0c03d9c4682 100644 --- a/doc/user/group/index.md +++ b/doc/user/group/index.md @@ -288,7 +288,7 @@ 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](../../gitlab-basics/create-project.md). +- Select a group, and then click **New project**. You can then continue [creating your project](../../user/project/working_with_projects.md#create-a-project). ![New project](img/create_new_project_from_group_v13_6.png) @@ -504,7 +504,7 @@ From GitLab 10.5, you can transfer groups in the following ways: When transferring groups, note: -- Changing a group's parent can have unintended side effects. See [Redirects when changing repository paths](../project/index.md#redirects-when-changing-repository-paths). +- 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. @@ -527,7 +527,7 @@ access further configurations for your group. #### Changing a group's path Changing a group's path (group URL) can have unintended side effects. Read -[how redirects will behave](../project/index.md#redirects-when-changing-repository-paths) +[how redirects will behave](../project/repository/index.md#redirects-when-changing-repository-paths) before proceeding. If you are vacating the path so it can be claimed by another group or user, diff --git a/doc/user/permissions.md b/doc/user/permissions.md index af8ae4e5a76..1109171f9e9 100644 --- a/doc/user/permissions.md +++ b/doc/user/permissions.md @@ -522,4 +522,4 @@ Read through the documentation on [LDAP users permissions](group/index.md#manage ## Project aliases Project aliases can only be read, created and deleted by a GitLab administrator. -Read through the documentation on [Project aliases](../user/project/index.md#project-aliases) to learn more. +Read through the documentation on [Project aliases](../user/project/import/index.md#project-aliases) to learn more. diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md index a96975fea92..52319b51073 100644 --- a/doc/user/profile/index.md +++ b/doc/user/profile/index.md @@ -92,7 +92,7 @@ If you don't know your current password, select the 'I forgot my password' link. 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/index.md#redirects-when-changing-repository-paths) +[how redirects behave](../project/repository/index.md#redirects-when-changing-repository-paths) before proceeding. To change your `username`: diff --git a/doc/user/project/clusters/serverless/aws.md b/doc/user/project/clusters/serverless/aws.md index 1da5a01f32c..192a7c7cd39 100644 --- a/doc/user/project/clusters/serverless/aws.md +++ b/doc/user/project/clusters/serverless/aws.md @@ -25,7 +25,7 @@ Additionally, in the [How To section](#how-to), you can read about different use - Working with secrets. - Setting up CORS. -Alternatively, you can quickly [create a new project with a template](../../../../gitlab-basics/create-project.md#project-templates). The [`Serverless Framework/JS` template](https://gitlab.com/gitlab-org/project-templates/serverless-framework/) already includes all parts described below. +Alternatively, you can quickly [create a new project with a template](../../working_with_projects.md#create-a-project). The [`Serverless Framework/JS` template](https://gitlab.com/gitlab-org/project-templates/serverless-framework/) already includes all parts described below. ### Example @@ -290,7 +290,7 @@ The example code is available: - As a [clonable repository](https://gitlab.com/gitlab-org/serverless/examples/serverless-framework-js). - In a version with [tests and secret variables](https://gitlab.com/gitlab-org/project-templates/serverless-framework/). -You can also use a [template](../../../../gitlab-basics/create-project.md#project-templates) +You can also use a [template](../../working_with_projects.md#project-templates) (based on the version with tests and secret variables) from within the GitLab UI (see the `Serverless Framework/JS` template). diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md index 754c3e31799..f6ed53763dd 100644 --- a/doc/user/project/import/index.md +++ b/doc/user/project/import/index.md @@ -74,3 +74,25 @@ In the event of merging two GitLab instances together (for example, both instanc refer to the instructions in [Migrating from self-managed GitLab to GitLab.com](#migrating-from-self-managed-gitlab-to-gitlabcom). Additionally, you can migrate users using the [Users API](../../../api/users.md) with an administrator user. + +## Project aliases **(PREMIUM SELF)** + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3264) in GitLab Premium 12.1. + +When migrating repositories to GitLab and they are being accessed by other systems, +it's very useful to be able to access them using the same name especially when +they are a lot. It reduces the risk of changing significant number of Git URLs in +a large number of systems. + +GitLab provides a functionality to help with this. In GitLab, repositories are +usually accessed with a namespace and project name. It is also possible to access +them via a project alias. This feature is only available on Git over SSH. + +A project alias can be only created via API and only by GitLab administrators. +Follow the [Project Aliases API documentation](../../../api/project_aliases.md) for +more details. + +After an alias has been created for a project (such as an alias `gitlab` for the +project `https://gitlab.com/gitlab-org/gitlab`), you can clone the repository +with the alias (e.g `git clone git@gitlab.com:gitlab.git` instead of +`git clone git@gitlab.com:gitlab-org/gitlab.git`). diff --git a/doc/user/project/index.md b/doc/user/project/index.md index 607049b512e..640d0ac1f69 100644 --- a/doc/user/project/index.md +++ b/doc/user/project/index.md @@ -17,8 +17,7 @@ the number of private projects you create. ## Project features -When you create a project in GitLab, you receive access to a large number of -[features](https://about.gitlab.com/features/): +Projects include the following [features](https://about.gitlab.com/features/): **Repositories:** @@ -115,63 +114,11 @@ When you create a project in GitLab, you receive access to a large number of - [Static Site Editor](static_site_editor/index.md): quickly edit content on static websites without prior knowledge of the codebase or Git commands. - [Code Intelligence](code_intelligence.md): code navigation features. -### Project integrations +## Project integrations [Integrate your project](integrations/index.md) with Jira, Mattermost, Kubernetes, Slack, and a lot more. -## New project - -Learn how to [create a new project](../../gitlab-basics/create-project.md) in GitLab. - -### Fork a project - -You can [fork a project](repository/forking_workflow.md) in order to: - -- Collaborate on code by forking a project and creating a merge request - from your fork to the upstream project -- Fork a sample project to work on the top of that - -### Star a project - -You can star a project to make it easier to find projects you frequently use. -The number of stars a project has can indicate its popularity. - -To star a project: - -1. Go to the home page of the project you want to star. -1. In the upper right corner of the page, click **Star**. - -To view your starred projects: - -1. Click **Projects** in the navigation bar. -1. Click **Starred Projects**. -1. GitLab displays information about your starred projects, including: - - - Project description, including name, description, and icon - - Number of times this project has been starred - - Number of times this project has been forked - - Number of open merge requests - - Number of open issues - -### Explore projects - -You can explore other popular projects available on GitLab. To explore projects: - -1. Click **Projects** in the navigation bar. -1. Click **Explore Projects**. - -GitLab displays a list of projects, sorted by last updated date. To view -projects with the most [stars](#star-a-project), click **Most stars**. To view -projects with the largest number of comments in the past month, click **Trending**. - -## Project settings - -Set the project's visibility level and the access levels to its various pages -and perform actions like archiving, renaming or transferring a project. - -Read through the documentation on [project settings](settings/index.md). - ## Import or export a project - [Import a project](import/index.md) from: @@ -182,18 +129,6 @@ Read through the documentation on [project settings](settings/index.md). - [Export a project from GitLab](settings/import_export.md#exporting-a-project-and-its-data) - [Importing and exporting projects between GitLab instances](settings/import_export.md) -## Delete a project - -To delete a project, first navigate to the home page for that project. - -1. Navigate to **Settings > General**. -1. Expand the **Advanced** section. -1. Scroll down to the **Delete project** section. -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). - ## CI/CD for external repositories **(PREMIUM)** Instead of importing a repository directly to GitLab, you can connect your repository @@ -201,45 +136,6 @@ as a CI/CD project. Read through the documentation on [CI/CD for external repositories](../../ci/ci_cd_for_external_repos/index.md). -## Project members - -Learn how to [add members to your projects](members/index.md). - -## Project activity - -To view the activity of a project, navigate to **Project overview > Activity**. -From there, you can click on the tabs to see **All** the activity, or see it -filtered by **Push events**, **Merge events**, **Issue events**, **Comments**, -**Team**, and **Wiki**. - -### Leave a project - -**Leave project** only displays on the project's dashboard -when a project is part of a group (under a -[group namespace](../group/index.md#namespaces)). -If you choose to leave a project you are no longer a project -member, and cannot contribute. - -## Project's landing page - -The project's landing page shows different information depending on -the project's visibility settings and user permissions. - -For public projects, and to members of internal and private projects -with [permissions to view the project's code](../permissions.md#project-members-permissions): - -- The content of a - [`README` or an index file](repository/#repository-readme-and-index-files) - is displayed (if any), followed by the list of directories in the - project's repository. -- If the project doesn't contain either of these files, the - visitor sees the list of files and directories of the repository. - -For users without permissions to view the project's code, GitLab displays: - -- The wiki homepage, if any. -- The list of issues in the project. - ## GitLab Workflow - VS Code extension To avoid switching from the GitLab UI and VS Code while working in GitLab repositories, you can integrate @@ -248,144 +144,6 @@ the [VS Code](https://code.visualstudio.com/) editor with GitLab through the To review or contribute to the extension's code, visit [its codebase in GitLab](https://gitlab.com/gitlab-org/gitlab-vscode-extension/). -## Redirects when changing repository paths - -When a repository path changes, it is essential to smoothly transition from the -old location to the new one. GitLab provides two kinds of redirects: the web UI -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): - -- Existing web URLs for the namespace and anything under it (such as projects) will - redirect to the new URLs. -- Starting with GitLab 10.3, existing Git remote URLs for projects under the - namespace redirect to the new remote URL. Every time you push/pull to a - repository that has changed its location, a warning message to update - your remote is displayed instead of rejecting your action. - This means that any automation scripts, or Git clients continue to - work after a rename, making any transition a lot smoother. -- The redirects are available as long as the original path is not claimed by - another group, user or project. - -## Use your project as a Go package - -Any project can be used as a Go package. GitLab responds correctly to `go get` -and `godoc.org` discovery requests, including the -[`go-import`](https://golang.org/cmd/go/#hdr-Remote_import_paths) and -[`go-source`](https://github.com/golang/gddo/wiki/Source-Code-Links) meta tags. - -Private projects, including projects in subgroups, can be used as a Go package, -but may require configuration to work correctly. GitLab responds correctly -to `go get` discovery requests for projects that *are not* in subgroups, -regardless of authentication or authorization. -[Authentication](#authenticate-go-requests) is required to use a private project -in a subgroup as a Go package. Otherwise, GitLab truncates the path for -private projects in subgroups to the first two segments, causing `go get` to -fail. - -GitLab implements its own Go proxy. This feature must be enabled by an -administrator and requires additional configuration. See [GitLab Go -Proxy](../packages/go_proxy/index.md). - -### Disable Go module features for private projects - -In Go 1.12 and later, Go queries module proxies and checksum databases in the -process of [fetching a -module](../../development/go_guide/dependencies.md#fetching). This can be -selectively disabled with `GOPRIVATE` (disable both), -[`GONOPROXY`](../../development/go_guide/dependencies.md#proxies) (disable proxy -queries), and [`GONOSUMDB`](../../development/go_guide/dependencies.md#fetching) -(disable checksum queries). - -`GOPRIVATE`, `GONOPROXY`, and `GONOSUMDB` are comma-separated lists of Go -modules and Go module prefixes. For example, -`GOPRIVATE=gitlab.example.com/my/private/project` disables queries for that -one project, but `GOPRIVATE=gitlab.example.com` disables queries for *all* -projects on GitLab.com. Go does not query module proxies if the module name or a -prefix of it appears in `GOPRIVATE` or `GONOPROXY`. Go does not query checksum -databases if the module name or a prefix of it appears in `GONOPRIVATE` or -`GONOSUMDB`. - -### 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 -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 -all HTTPS requests made directly by Go, but does not authenticate requests made -through Git. - -For example: - -```plaintext -machine gitlab.example.com -login <gitlab_user_name> -password <personal_access_token> -``` - -NOTE: -On Windows, Go reads `~/_netrc` instead of `~/.netrc`. - -### Authenticate Git fetches - -If a module cannot be fetched from a proxy, Go falls back to using Git (for -GitLab projects). Git uses `.netrc` to authenticate requests. You can also -configure Git to either: - -- Embed specific credentials in the request URL. -- Use SSH instead of HTTPS, as Go always uses HTTPS to fetch Git repositories. - -```shell -# Embed credentials in any request to GitLab.com: -git config --global url."https://${user}:${personal_access_token}@gitlab.example.com".insteadOf "https://gitlab.example.com" - -# Use SSH instead of HTTPS: -git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com" -``` - -## Access project page with project ID - -> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53671) in GitLab 11.8. - -To quickly access a project from the GitLab UI using the project ID, -visit the `/projects/:id` URL in your browser or other tool accessing the project. - -## Project aliases **(PREMIUM SELF)** - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3264) in GitLab Premium 12.1. - -When migrating repositories to GitLab and they are being accessed by other systems, -it's very useful to be able to access them using the same name especially when -they are a lot. It reduces the risk of changing significant number of Git URLs in -a large number of systems. - -GitLab provides a functionality to help with this. In GitLab, repositories are -usually accessed with a namespace and project name. It is also possible to access -them via a project alias. This feature is only available on Git over SSH. - -A project alias can be only created via API and only by GitLab administrators. -Follow the [Project Aliases API documentation](../../api/project_aliases.md) for -more details. - -After an alias has been created for a project (such as an alias `gitlab` for the -project `https://gitlab.com/gitlab-org/gitlab`), you can clone the repository -with the alias (e.g `git clone git@gitlab.com:gitlab.git` instead of -`git clone git@gitlab.com:gitlab-org/gitlab.git`). - -## Project activity analytics overview **(ULTIMATE SELF)** - -> [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). - -Project details include the following analytics: - -- Deployment Frequency - -For more information, see [Project Analytics API](../../api/project_analytics.md). - ## Project APIs There are numerous [APIs](../../api/README.md) to use with your projects: @@ -407,3 +165,13 @@ There are numerous [APIs](../../api/README.md) to use with your projects: - [Variables](../../api/project_level_variables.md) - [Aliases](../../api/project_aliases.md) - [Analytics](../../api/project_analytics.md) + +## Project activity analytics overview **(ULTIMATE SELF)** + +> [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). + +Project details include the following analytics: + +- Deployment Frequency + +For more information, see [Project Analytics API](../../api/project_analytics.md). diff --git a/doc/user/project/issues/design_management.md b/doc/user/project/issues/design_management.md index 8dc5c3396ae..b6dff0842d8 100644 --- a/doc/user/project/issues/design_management.md +++ b/doc/user/project/issues/design_management.md @@ -259,4 +259,4 @@ This will be rendered as: User activity events on designs (creation, deletion, and updates) are tracked by GitLab and displayed on the [user profile](../../profile/index.md#user-profile), [group](../../group/index.md#view-group-activity), -and [project](../index.md#project-activity) activity pages. +and [project](../working_with_projects.md#project-activity) activity pages. diff --git a/doc/user/project/pages/getting_started/pages_forked_sample_project.md b/doc/user/project/pages/getting_started/pages_forked_sample_project.md index 60f8533afc8..d9ec2aae2b7 100644 --- a/doc/user/project/pages/getting_started/pages_forked_sample_project.md +++ b/doc/user/project/pages/getting_started/pages_forked_sample_project.md @@ -18,7 +18,7 @@ configured to generate a Pages site. To fork a sample project and create a Pages website: 1. View the sample projects by navigating to the [GitLab Pages examples](https://gitlab.com/pages) group. -1. Click the name of the project you want to [fork](../../../../gitlab-basics/fork-project.md). +1. Click the name of the project you want to [fork](../../../../user/project/working_with_projects.md#fork-a-project). 1. In the top right, click the **Fork** button, and then choose a namespace to fork to. 1. Go to your project's **CI/CD > Pipelines** and click **Run pipeline**. GitLab CI/CD builds and deploys your site. diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md index 42fa5895a60..c0b3ee24fa9 100644 --- a/doc/user/project/repository/index.md +++ b/doc/user/project/repository/index.md @@ -14,7 +14,7 @@ A repository is part of a [project](../index.md), which has a lot of other featu ## Create a repository To create a new repository, all you need to do is -[create a new project](../../../gitlab-basics/create-project.md) or +[create a new project](../../../user/project/working_with_projects.md#create-a-project) or [fork an existing project](forking_workflow.md). Once you create a new project, you can add new files via UI @@ -270,6 +270,28 @@ By clicking the download icon, a dropdown will open with links to download the f - **Artifacts:** allows users to download the artifacts of the latest CI build. +## Redirects when changing repository paths + +When a repository path changes, it is essential to smoothly transition from the +old location to the new one. GitLab provides two kinds of redirects: the web UI +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): + +- Existing web URLs for the namespace and anything under it (such as projects) will + redirect to the new URLs. +- Starting with GitLab 10.3, existing Git remote URLs for projects under the + namespace redirect to the new remote URL. Every time you push/pull to a + repository that has changed its location, a warning message to update + your remote is displayed instead of rejecting your action. + This means that any automation scripts, or Git clients continue to + work after a rename, making any transition a lot smoother. +- The redirects are available as long as the original path is not claimed by + another group, user or project. + <!-- ## Troubleshooting Include any troubleshooting steps that you can foresee. If you know beforehand what issues diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md index aa41f1c0233..fb492575c14 100644 --- a/doc/user/project/settings/index.md +++ b/doc/user/project/settings/index.md @@ -79,7 +79,7 @@ Use the switches to enable or disable the following features: | **Issues** | ✓ | Activates the GitLab issues tracker | | **Repository** | ✓ | Enables [repository](../repository/) functionality | | **Merge Requests** | ✓ | Enables [merge request](../merge_requests/) functionality; also see [Merge request settings](#merge-request-settings) | -| **Forks** | ✓ | Enables [forking](../index.md#fork-a-project) functionality | +| **Forks** | ✓ | Enables [forking](../working_with_projects.md#fork-a-project) functionality | | **Pipelines** | ✓ | Enables [CI/CD](../../../ci/README.md) functionality | | **Container Registry** | | Activates a [registry](../../packages/container_registry/) for your Docker images | | **Git Large File Storage** | | Enables the use of [large files](../../../topics/git/lfs/index.md#git-large-file-storage-lfs) | @@ -221,7 +221,7 @@ To rename a repository: 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 -[redirects when renaming repositories](../index.md#redirects-when-changing-repository-paths). +[redirects when renaming repositories](../repository/index.md#redirects-when-changing-repository-paths). #### Transferring an existing project into another namespace @@ -245,7 +245,7 @@ To transfer a project: Once done, you will be taken to the new project's namespace. At this point, read what happens with the -[redirects from the old project to the new one](../index.md#redirects-when-changing-repository-paths). +[redirects from the old project to the new one](../repository/index.md#redirects-when-changing-repository-paths). NOTE: GitLab administrators can use the administration interface to move any project to any diff --git a/doc/user/project/static_site_editor/index.md b/doc/user/project/static_site_editor/index.md index e4916d524e6..002eb398406 100644 --- a/doc/user/project/static_site_editor/index.md +++ b/doc/user/project/static_site_editor/index.md @@ -72,7 +72,7 @@ First, set up the project. Once done, you can use the Static Site Editor to 1. To get started, create a new project from the [Static Site Editor - Middleman](https://gitlab.com/gitlab-org/project-templates/static-site-editor-middleman) template. You can either [fork it](../repository/forking_workflow.md#creating-a-fork) - or [create a new project from a template](../../../gitlab-basics/create-project.md#built-in-templates). + or [create a new project from a template](../working_with_projects.md#built-in-templates). 1. Edit the [`data/config.yml`](#static-site-generator-configuration) configuration file to replace `<username>` and `<project-name>` with the proper values for your project's path. diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md index 087a9069c7c..187fcb5b3f9 100644 --- a/doc/user/project/wiki/index.md +++ b/doc/user/project/wiki/index.md @@ -184,7 +184,7 @@ Similar to versioned diff file views, you can see the changes made in a given Wi Wiki events (creation, deletion, and updates) are tracked by GitLab and displayed on the [user profile](../../profile/index.md#user-profile), [group](../../group/index.md#view-group-activity), -and [project](../index.md#project-activity) activity pages. +and [project](../working_with_projects.md#project-activity) activity pages. ## Adding and editing wiki pages locally diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md new file mode 100644 index 00000000000..39a6d70fb9e --- /dev/null +++ b/doc/user/project/working_with_projects.md @@ -0,0 +1,341 @@ +--- +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" +--- + +# Working with projects + +Most work in GitLab is done in a [project](../../user/project/index.md). Files and +code are saved in projects, and most features are in the scope of projects. + +## Explore projects + +You can explore other popular projects available on GitLab. To explore projects: + +1. Click **Projects** in the navigation bar. +1. Click **Explore Projects**. + +GitLab displays a list of projects, sorted by last updated date. To view +projects with the most [stars](#star-a-project), click **Most stars**. To view +projects with the largest number of comments in the past month, click **Trending**. + +## Create a project + +To create a project in GitLab: + +1. In your dashboard, click the green **New project** button or use the plus + icon in the navigation bar. This opens the **New project** page. +1. On the **New project** page, choose if you want to: + - Create a [blank project](#blank-projects). + - Create a project using one of the available [project templates](#project-templates). + - [Import a project](../../user/project/import/index.md) from a different repository, + if enabled on your GitLab instance. Contact your GitLab administrator if this is unavailable. + - Run [CI/CD pipelines for external repositories](../../ci/ci_cd_for_external_repos/index.md). **(PREMIUM)** + +NOTE: +For a list of words that can't be used as project names see +[Reserved project and group names](../../user/reserved_names.md). + +### Blank projects + +To create a new blank project on the **New project** page: + +1. On the **Blank project** tab, provide the following information: + - The name of your project in the **Project name** field. You can't use + special characters, but you can use spaces, hyphens, underscores, or even + emoji. When adding the name, the **Project slug** auto populates. + The slug is what the GitLab instance uses as the URL path to the project. + If you want a different slug, input the project name first, + then change the slug after. + - The path to your project in the **Project slug** field. This is the URL + path for your project that the GitLab instance uses. If the + **Project name** is blank, it auto populates when you fill in + the **Project slug**. + - The **Project description (optional)** field enables you to enter a + description for your project's dashboard, which helps others + understand what your project is about. Though it's not required, it's a good + idea to fill this in. + - Changing the **Visibility Level** modifies the project's + [viewing and access rights](../../public_access/public_access.md) for users. + - Selecting the **Initialize repository with a README** option creates a + README file so that the Git repository is initialized, has a default branch, and + can be cloned. +1. Click **Create project**. + +### Project templates + +Project templates can pre-populate a new project with the necessary files to get you +started quickly. + +There are two main types of project templates: + +- [Built-in templates](#built-in-templates), sourced from the following groups: + - [`project-templates`](https://gitlab.com/gitlab-org/project-templates) + - [`pages`](https://gitlab.com/pages) +- [Custom project templates](#custom-project-templates), for custom templates + configured by GitLab administrators and users. + +#### Built-in templates + +Built-in templates are project templates that are: + +- Developed and maintained in the [`project-templates`](https://gitlab.com/gitlab-org/project-templates) + and [`pages`](https://gitlab.com/pages) groups. +- Released with GitLab. + +To use a built-in template on the **New project** page: + +1. On the **Create from template** tab, select the **Built-in** tab. +1. From the list of available built-in templates, click the: + - **Preview** button to look at the template source itself. + - **Use template** button to start creating the project. +1. Finish creating the project by filling out the project's details. The process is + the same as creating a [blank project](#blank-projects). + +##### Enterprise templates **(ULTIMATE)** + +GitLab is developing Enterprise templates to help you streamline audit management with selected regulatory standards. These templates automatically import issues that correspond to each regulatory requirement. + +To create a new project with an Enterprise template, on the **New project** page: + +1. On the **Create from template** tab, select the **Built-in** tab. +1. From the list of available built-in Enterprise templates, click the: + - **Preview** button to look at the template source itself. + - **Use template** button to start creating the project. +1. Finish creating the project by filling out the project's details. The process is the same as creating a [blank project](#blank-projects). + +Available Enterprise templates include: + +- HIPAA Audit Protocol template ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13756) in GitLab 12.10) + +NOTE: +You can improve the existing built-in templates or contribute new ones in the +[`project-templates`](https://gitlab.com/gitlab-org/project-templates) and +[`pages`](https://gitlab.com/pages) groups by following [these steps](https://gitlab.com/gitlab-org/project-templates/contributing). + +##### Custom project templates **(PREMIUM)** + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.2. + +Creating new projects based on custom project templates is a convenient option for +quickly starting projects. + +Custom projects are available at the [instance-level](../../user/admin_area/custom_project_templates.md) +from the **Instance** tab, or at the [group-level](../../user/group/custom_project_templates.md) +from the **Group** tab, under the **Create from template** tab. + +To use a custom project template on the **New project** page: + +1. On the **Create from template** tab, select the **Instance** tab or the **Group** tab. +1. From the list of available custom templates, click the: + - **Preview** button to look at the template source itself. + - **Use template** button to start creating the project. +1. Finish creating the project by filling out the project's details. The process is + the same as creating a [blank project](#blank-projects). + +## Push to create a new project + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26388) in GitLab 10.5. + +When you create a new repository locally, instead of manually creating a new project in GitLab +and then [cloning the repository](../../gitlab-basics/start-using-git.md#clone-a-repository) +locally, you can directly push it to GitLab to create the new project, all without leaving +your terminal. If you have access rights to the associated namespace, GitLab +automatically creates a new project under that GitLab namespace with its visibility +set to Private by default (you can later change it in the [project's settings](../../public_access/public_access.md#how-to-change-project-visibility)). + +This can be done by using either SSH or HTTPS: + +```shell +## Git push using SSH +git push --set-upstream git@gitlab.example.com:namespace/nonexistent-project.git master + +## Git push using HTTPS +git push --set-upstream https://gitlab.example.com/namespace/nonexistent-project.git master +``` + +You can pass the flag `--tags` to the `git push` command to export existing repository tags. + +Once the push finishes successfully, a remote message indicates +the command to set the remote and the URL to the new project: + +```plaintext +remote: +remote: The private project namespace/nonexistent-project was created. +remote: +remote: To configure the remote, run: +remote: git remote add origin https://gitlab.example.com/namespace/nonexistent-project.git +remote: +remote: To view the project, visit: +remote: https://gitlab.example.com/namespace/nonexistent-project +remote: +``` + +## Fork a project + +A fork is a copy of an original repository that you put in another namespace +where you can experiment and apply changes that you can later decide whether or +not to share, without affecting the original project. + +It takes just a few steps to [fork a project in GitLab](repository/forking_workflow.md#creating-a-fork). + +## Star a project + +You can star a project to make it easier to find projects you frequently use. +The number of stars a project has can indicate its popularity. + +To star a project: + +1. Go to the home page of the project you want to star. +1. In the upper right corner of the page, click **Star**. + +To view your starred projects: + +1. Click **Projects** in the navigation bar. +1. Click **Starred Projects**. +1. GitLab displays information about your starred projects, including: + + - Project description, including name, description, and icon + - Number of times this project has been starred + - Number of times this project has been forked + - Number of open merge requests + - Number of open issues + +## Delete a project + +To delete a project, first navigate to the home page for that project. + +1. Navigate to **Settings > General**. +1. Expand the **Advanced** section. +1. Scroll down to the **Delete project** section. +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). + +## Project settings + +Set the project's visibility level and the access levels to its various pages +and perform actions like archiving, renaming or transferring a project. + +Read through the documentation on [project settings](settings/index.md). + +## Project activity + +To view the activity of a project, navigate to **Project overview > Activity**. +From there, you can click on the tabs to see **All** the activity, or see it +filtered by **Push events**, **Merge events**, **Issue events**, **Comments**, +**Team**, and **Wiki**. + +### Leave a project + +**Leave project** only displays on the project's dashboard +when a project is part of a group (under a +[group namespace](../group/index.md#namespaces)). +If you choose to leave a project you are no longer a project +member, and cannot contribute. + +## Use your project as a Go package + +Any project can be used as a Go package. GitLab responds correctly to `go get` +and `godoc.org` discovery requests, including the +[`go-import`](https://golang.org/cmd/go/#hdr-Remote_import_paths) and +[`go-source`](https://github.com/golang/gddo/wiki/Source-Code-Links) meta tags. + +Private projects, including projects in subgroups, can be used as a Go package, +but may require configuration to work correctly. GitLab responds correctly +to `go get` discovery requests for projects that *are not* in subgroups, +regardless of authentication or authorization. +[Authentication](#authenticate-go-requests) is required to use a private project +in a subgroup as a Go package. Otherwise, GitLab truncates the path for +private projects in subgroups to the first two segments, causing `go get` to +fail. + +GitLab implements its own Go proxy. This feature must be enabled by an +administrator and requires additional configuration. See [GitLab Go +Proxy](../packages/go_proxy/index.md). + +### Disable Go module features for private projects + +In Go 1.12 and later, Go queries module proxies and checksum databases in the +process of [fetching a +module](../../development/go_guide/dependencies.md#fetching). This can be +selectively disabled with `GOPRIVATE` (disable both), +[`GONOPROXY`](../../development/go_guide/dependencies.md#proxies) (disable proxy +queries), and [`GONOSUMDB`](../../development/go_guide/dependencies.md#fetching) +(disable checksum queries). + +`GOPRIVATE`, `GONOPROXY`, and `GONOSUMDB` are comma-separated lists of Go +modules and Go module prefixes. For example, +`GOPRIVATE=gitlab.example.com/my/private/project` disables queries for that +one project, but `GOPRIVATE=gitlab.example.com` disables queries for *all* +projects on GitLab.com. Go does not query module proxies if the module name or a +prefix of it appears in `GOPRIVATE` or `GONOPROXY`. Go does not query checksum +databases if the module name or a prefix of it appears in `GONOPRIVATE` or +`GONOSUMDB`. + +### 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 +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 +all HTTPS requests made directly by Go, but does not authenticate requests made +through Git. + +For example: + +```plaintext +machine gitlab.example.com +login <gitlab_user_name> +password <personal_access_token> +``` + +NOTE: +On Windows, Go reads `~/_netrc` instead of `~/.netrc`. + +### Authenticate Git fetches + +If a module cannot be fetched from a proxy, Go falls back to using Git (for +GitLab projects). Git uses `.netrc` to authenticate requests. You can also +configure Git to either: + +- Embed specific credentials in the request URL. +- Use SSH instead of HTTPS, as Go always uses HTTPS to fetch Git repositories. + +```shell +# Embed credentials in any request to GitLab.com: +git config --global url."https://${user}:${personal_access_token}@gitlab.example.com".insteadOf "https://gitlab.example.com" + +# Use SSH instead of HTTPS: +git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com" +``` + +## Access project page with project ID + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53671) in GitLab 11.8. + +To quickly access a project from the GitLab UI using the project ID, +visit the `/projects/:id` URL in your browser or other tool accessing the project. + +## Project's landing page + +The project's landing page shows different information depending on +the project's visibility settings and user permissions. + +For public projects, and to members of internal and private projects +with [permissions to view the project's code](../permissions.md#project-members-permissions): + +- The content of a + [`README` or an index file](repository/#repository-readme-and-index-files) + is displayed (if any), followed by the list of directories in the + project's repository. +- If the project doesn't contain either of these files, the + visitor sees the list of files and directories of the repository. + +For users without permissions to view the project's code, GitLab displays: + +- The wiki homepage, if any. +- The list of issues in the project. diff --git a/doc/user/search/index.md b/doc/user/search/index.md index 7ea1c4cb307..ffd331248be 100644 --- a/doc/user/search/index.md +++ b/doc/user/search/index.md @@ -193,7 +193,7 @@ You can search through your projects from the left menu, by clicking the menu ba On the field **Filter by name**, type the project or group name you want to find, and GitLab filters them for you as you type. -You can also look for the projects you [starred](../project/index.md#star-a-project) (**Starred projects**). +You can also look for the projects you [starred](../project/working_with_projects.md#star-a-project) (**Starred projects**). You can **Explore** all public and internal projects available in GitLab.com, from which you can filter by visibility, through **Trending**, best rated with **Most stars**, or **All** of them. diff --git a/lib/api/settings.rb b/lib/api/settings.rb index 6b1ad33d84b..e7ee8b08d87 100644 --- a/lib/api/settings.rb +++ b/lib/api/settings.rb @@ -10,8 +10,7 @@ module API helpers do def current_settings - @current_setting ||= - (ApplicationSetting.current_without_cache || ApplicationSetting.create_from_defaults) + @current_setting ||= ApplicationSetting.find_or_create_without_cache end def filter_attributes_using_license(attrs) diff --git a/lib/generators/gitlab/usage_metric_definition_generator.rb b/lib/generators/gitlab/usage_metric_definition_generator.rb index 20e0cb333dc..7cf9dbe146f 100644 --- a/lib/generators/gitlab/usage_metric_definition_generator.rb +++ b/lib/generators/gitlab/usage_metric_definition_generator.rb @@ -67,8 +67,11 @@ module Gitlab options[:dir] end + # Example of file name + # + # 20210201124931_g_project_management_issue_title_changed_weekly.yml def file_name - key_path.split('.').last + "#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_#{key_path.split('.').last}" end def directory diff --git a/lib/gitlab/ci/pipeline/chain/build.rb b/lib/gitlab/ci/pipeline/chain/build.rb index f0548284001..d3bc3a38f1f 100644 --- a/lib/gitlab/ci/pipeline/chain/build.rb +++ b/lib/gitlab/ci/pipeline/chain/build.rb @@ -23,7 +23,7 @@ module Gitlab pipeline_schedule: @command.schedule, merge_request: @command.merge_request, external_pull_request: @command.external_pull_request, - locked: @command.project.latest_pipeline_locked, + locked: @command.project.default_pipeline_lock, variables_attributes: variables_attributes ) end diff --git a/lib/gitlab/import_export/decompressed_archive_size_validator.rb b/lib/gitlab/import_export/decompressed_archive_size_validator.rb index 219821a7150..37f1bdc3009 100644 --- a/lib/gitlab/import_export/decompressed_archive_size_validator.rb +++ b/lib/gitlab/import_export/decompressed_archive_size_validator.rb @@ -1,24 +1,16 @@ # frozen_string_literal: true -require 'zlib' - module Gitlab module ImportExport class DecompressedArchiveSizeValidator include Gitlab::Utils::StrongMemoize DEFAULT_MAX_BYTES = 10.gigabytes.freeze - CHUNK_SIZE = 4096.freeze - - attr_reader :error + TIMEOUT_LIMIT = 60.seconds def initialize(archive_path:, max_bytes: self.class.max_bytes) @archive_path = archive_path @max_bytes = max_bytes - @bytes_read = 0 - @total_reads = 0 - @denominator = 5 - @error = nil end def valid? @@ -31,59 +23,62 @@ module Gitlab DEFAULT_MAX_BYTES end - def archive_file - @archive_file ||= File.open(@archive_path) - end - private def validate - until archive_file.eof? - compressed_chunk = archive_file.read(CHUNK_SIZE) + pgrp = nil + valid_archive = true - inflate_stream.inflate(compressed_chunk) do |chunk| - @bytes_read += chunk.size - @total_reads += 1 - end + Timeout.timeout(TIMEOUT_LIMIT) do + stdin, stdout, stderr, wait_thr = Open3.popen3(command, pgroup: true) + stdin.close + pgrp = Process.getpgid(wait_thr[:pid]) + status = wait_thr.value - # Start garbage collection every 5 reads in order - # to prevent memory bloat during archive decompression - GC.start if gc_start? + if status.success? + result = stdout.readline - if @bytes_read > @max_bytes - @error = error_message + if result.to_i > @max_bytes + valid_archive = false - return false + log_error('Decompressed archive size limit reached') + end + else + valid_archive = false + + log_error(stderr.readline) end + + ensure + stdout.close + stderr.close end - true - rescue => e - @error = error_message + valid_archive + rescue Timeout::Error + log_error('Timeout reached during archive decompression') - Gitlab::ErrorTracking.track_exception(e) - - Gitlab::Import::Logger.info( - message: @error, - error: e.message - ) + Process.kill(-1, pgrp) if pgrp false - ensure - inflate_stream.close - archive_file.close - end + rescue => e + log_error(e.message) - def inflate_stream - @inflate_stream ||= Zlib::Inflate.new(Zlib::MAX_WBITS + 32) + Process.kill(-1, pgrp) if pgrp + + false end - def gc_start? - @total_reads % @denominator == 0 + def command + "gzip -dc #{@archive_path} | wc -c" end - def error_message - _('Decompressed archive size validation failed.') + def log_error(error) + Gitlab::Import::Logger.info( + message: error, + import_upload_archive_path: @archive_path, + import_upload_archive_size: File.size(@archive_path) + ) end end end diff --git a/lib/gitlab/import_export/file_importer.rb b/lib/gitlab/import_export/file_importer.rb index 5a6f6e017d2..51d58aae54f 100644 --- a/lib/gitlab/import_export/file_importer.rb +++ b/lib/gitlab/import_export/file_importer.rb @@ -87,7 +87,7 @@ module Gitlab end def validate_decompressed_archive_size - raise ImporterError.new(size_validator.error) unless size_validator.valid? + raise ImporterError.new(_('Decompressed archive size validation failed.')) unless size_validator.valid? end def size_validator diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 5cbdd05f14c..2a6c5490466 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -2070,6 +2070,9 @@ msgstr "" msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance." msgstr "" +msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines" +msgstr "" + msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled." msgstr "" @@ -2109,6 +2112,9 @@ msgstr "" msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." msgstr "" +msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire." +msgstr "" + msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations." msgstr "" @@ -29320,7 +29326,7 @@ msgstr "" msgid "There was a problem fetching project users." msgstr "" -msgid "There was a problem fetching the keep latest artifact setting." +msgid "There was a problem fetching the keep latest artifacts setting." msgstr "" msgid "There was a problem fetching users." @@ -29335,7 +29341,7 @@ msgstr "" msgid "There was a problem sending the confirmation email" msgstr "" -msgid "There was a problem updating the keep latest artifact setting." +msgid "There was a problem updating the keep latest artifacts setting." msgstr "" msgid "There was an error %{message} todo." @@ -29689,6 +29695,9 @@ msgstr "" msgid "This epic does not exist or you don't have sufficient permission." msgstr "" +msgid "This feature is disabled at the instance level." +msgstr "" + msgid "This feature requires local storage to be enabled" msgstr "" diff --git a/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb new file mode 100644 index 00000000000..b7f71ad5bcd --- /dev/null +++ b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Manage' do + describe 'User', :requires_admin do + before(:all) do + admin_api_client = Runtime::API::Client.as_admin + + @user = Resource::User.fabricate_via_api! do |user| + user.api_client = admin_api_client + end + + @user_api_client = Runtime::API::Client.new(:gitlab, user: @user) + + @group = Resource::Group.fabricate_via_api! + + @group.sandbox.add_member(@user) + + @project = Resource::Project.fabricate_via_api! do |project| + project.group = @group + project.name = "project-for-user-group-access-termination" + project.initialize_with_readme = true + end + end + + context 'after parent group membership termination' do + before do + @group.sandbox.remove_member(@user) + end + + it 'is not allowed to push code via the CLI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1660' do + expect do + Resource::Repository::Push.fabricate! do |push| + push.repository_http_uri = @project.repository_http_location.uri + push.file_name = 'test.txt' + push.file_content = "# This is a test project named #{@project.name}" + push.commit_message = 'Add test.txt' + push.branch_name = 'new_branch' + push.user = @user + end + end.to raise_error(QA::Support::Run::CommandError, /You are not allowed to push code to this project/) + end + + it 'is not allowed to create a file via the API', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1661' do + expect do + Resource::File.fabricate_via_api! do |file| + file.api_client = @user_api_client + file.project = @project + file.branch = 'new_branch' + file.commit_message = 'Add new file' + file.name = 'test.txt' + file.content = "New file" + end + end.to raise_error(Resource::ApiFabricator::ResourceFabricationFailedError, /403 Forbidden/) + end + + it 'is not allowed to commit via the API', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1662' do + expect do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.api_client = @user_api_client + commit.project = @project + commit.branch = 'new_branch' + commit.start_branch = @project.default_branch + commit.commit_message = 'Add new file' + commit.add_files([ + { file_path: 'test.txt', content: 'new file' } + ]) + end + end.to raise_error(Resource::ApiFabricator::ResourceFabricationFailedError, /403 Forbidden - You are not allowed to push into this branch/) + end + end + + after(:all) do + @user.remove_via_api! + @project.remove_via_api! + begin + @group.remove_via_api! + rescue Resource::ApiFabricator::ResourceNotDeletedError + # It is ok if the group is already marked for deletion by another test + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb new file mode 100644 index 00000000000..7ec217cb47d --- /dev/null +++ b/qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Manage' do + describe 'User', :requires_admin do + let(:admin_api_client) { Runtime::API::Client.as_admin } + + let!(:user) do + Resource::User.fabricate_via_api! do |user| + user.api_client = admin_api_client + end + end + + let!(:group) do + group = Resource::Group.fabricate_via_api! + group.sandbox.add_member(user) + group + end + + let!(:project) do + Resource::Project.fabricate_via_api! do |project| + project.group = group + project.name = "project-for-user-access-termination" + project.initialize_with_readme = true + end + end + + context 'after parent group membership termination' do + before do + Flow::Login.while_signed_in_as_admin do + group.sandbox.visit! + + Page::Group::Menu.perform(&:click_group_members_item) + Page::Group::Members.perform do |members_page| + members_page.remove_member(user.username) + end + end + end + + it 'is not allowed to edit the project files', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1663' do + Flow::Login.sign_in(as: user) + project.visit! + + Page::Project::Show.perform do |project| + project.click_file('README.md') + end + + Page::File::Show.perform(&:click_edit) + + expect(page).to have_text("You're not allowed to edit files in this project directly.") + end + + after do + user.remove_via_api! + project.remove_via_api! + begin + group.remove_via_api! + rescue Resource::ApiFabricator::ResourceNotDeletedError + # It is ok if the group is already marked for deletion by another test + end + end + end + end + end +end diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index f5e496080c4..83a866b0e62 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -39,7 +39,7 @@ FactoryBot.define do group_runners_enabled { nil } merge_pipelines_enabled { nil } merge_trains_enabled { nil } - ci_keep_latest_artifact { nil } + keep_latest_artifact { nil } import_status { nil } import_jid { nil } import_correlation_id { nil } @@ -84,7 +84,7 @@ FactoryBot.define do project.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil? project.merge_pipelines_enabled = evaluator.merge_pipelines_enabled unless evaluator.merge_pipelines_enabled.nil? project.merge_trains_enabled = evaluator.merge_trains_enabled unless evaluator.merge_trains_enabled.nil? - project.ci_keep_latest_artifact = evaluator.ci_keep_latest_artifact unless evaluator.ci_keep_latest_artifact.nil? + project.keep_latest_artifact = evaluator.keep_latest_artifact unless evaluator.keep_latest_artifact.nil? project.restrict_user_defined_variables = evaluator.restrict_user_defined_variables unless evaluator.restrict_user_defined_variables.nil? if evaluator.import_status diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb index 78e8ce91c10..52f39f65bd0 100644 --- a/spec/features/admin/admin_settings_spec.rb +++ b/spec/features/admin/admin_settings_spec.rb @@ -306,11 +306,13 @@ RSpec.describe 'Admin updates settings' do page.within('.as-ci-cd') do check 'Default to Auto DevOps pipeline for all projects' fill_in 'application_setting_auto_devops_domain', with: 'domain.com' + uncheck 'Keep the latest artifacts for all jobs in the latest successful pipelines' click_button 'Save changes' end expect(current_settings.auto_devops_enabled?).to be true expect(current_settings.auto_devops_domain).to eq('domain.com') + expect(current_settings.keep_latest_artifact).to be false expect(page).to have_content "Application settings saved successfully" end diff --git a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap index 9d05e6d99f6..bfe7e40fb32 100644 --- a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap +++ b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap @@ -1,29 +1,64 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Keep latest artifact checkbox sets correct setting value in checkbox with query result 1`] = ` +exports[`Keep latest artifact checkbox when application keep latest artifact setting is disabled checkbox is disabled when application setting is disabled 1`] = ` <div> <!----> - <gl-form-checkbox-stub + <b-form-checkbox-stub checked="true" + class="gl-form-checkbox" + disabled="true" + plain="true" + value="true" > - <b + <strong class="gl-mr-3" > Keep artifacts from most recent successful jobs - </b> + </strong> <gl-link-stub href="/help/ci/pipelines/job_artifacts" > More information </gl-link-stub> - </gl-form-checkbox-stub> + + <p + class="help-text" + > + This feature is disabled at the instance level. + </p> + </b-form-checkbox-stub> +</div> +`; + +exports[`Keep latest artifact checkbox when application keep latest artifact setting is enabled sets correct setting value in checkbox with query result 1`] = ` +<div> + <!----> - <p> - - The latest artifacts created by jobs in the most recent successful pipeline will be stored. - - </p> + <b-form-checkbox-stub + checked="true" + class="gl-form-checkbox" + plain="true" + value="true" + > + <strong + class="gl-mr-3" + > + Keep artifacts from most recent successful jobs + </strong> + + <gl-link-stub + href="/help/ci/pipelines/job_artifacts" + > + More information + </gl-link-stub> + + <p + class="help-text" + > + The latest artifacts created by jobs in the most recent successful pipeline will be stored. + </p> + </b-form-checkbox-stub> </div> `; diff --git a/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js b/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js index d7f07526b58..888d14163c5 100644 --- a/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js +++ b/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js @@ -4,12 +4,13 @@ import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import KeepLatestArtifactCheckbox from '~/artifacts_settings/keep_latest_artifact_checkbox.vue'; import GetKeepLatestArtifactProjectSetting from '~/artifacts_settings/graphql/queries/get_keep_latest_artifact_project_setting.query.graphql'; +import GetKeepLatestArtifactApplicationSetting from '~/artifacts_settings/graphql/queries/get_keep_latest_artifact_application_setting.query.graphql'; import UpdateKeepLatestArtifactProjectSetting from '~/artifacts_settings/graphql/mutations/update_keep_latest_artifact_project_setting.mutation.graphql'; const localVue = createLocalVue(); localVue.use(VueApollo); -const keepLatestArtifactMock = { +const keepLatestArtifactProjectMock = { data: { project: { ciCdSettings: { keepLatestArtifact: true }, @@ -17,6 +18,14 @@ const keepLatestArtifactMock = { }, }; +const keepLatestArtifactApplicationMock = { + data: { + ciApplicationSettings: { + keepLatestArtifact: true, + }, + }, +}; + const keepLatestArtifactMockResponse = { data: { ciCdSettingsUpdate: { errors: [], __typename: 'CiCdSettingsUpdatePayload' } }, }; @@ -34,7 +43,12 @@ describe('Keep latest artifact checkbox', () => { const createComponent = (handlers) => { requestHandlers = { - keepLatestArtifactQueryHandler: jest.fn().mockResolvedValue(keepLatestArtifactMock), + keepLatestArtifactProjectQueryHandler: jest + .fn() + .mockResolvedValue(keepLatestArtifactProjectMock), + keepLatestArtifactApplicationQueryHandler: jest + .fn() + .mockResolvedValue(keepLatestArtifactApplicationMock), keepLatestArtifactMutationHandler: jest .fn() .mockResolvedValue(keepLatestArtifactMockResponse), @@ -42,7 +56,11 @@ describe('Keep latest artifact checkbox', () => { }; apolloProvider = createMockApollo([ - [GetKeepLatestArtifactProjectSetting, requestHandlers.keepLatestArtifactQueryHandler], + [GetKeepLatestArtifactProjectSetting, requestHandlers.keepLatestArtifactProjectQueryHandler], + [ + GetKeepLatestArtifactApplicationSetting, + requestHandlers.keepLatestArtifactApplicationQueryHandler, + ], [UpdateKeepLatestArtifactProjectSetting, requestHandlers.keepLatestArtifactMutationHandler], ]); @@ -51,38 +69,74 @@ describe('Keep latest artifact checkbox', () => { fullPath, helpPagePath, }, + stubs: { + GlFormCheckbox, + }, localVue, apolloProvider, }); }; - beforeEach(() => { - createComponent(); - }); - afterEach(() => { wrapper.destroy(); wrapper = null; apolloProvider = null; }); - it('displays the checkbox and the help link', () => { - expect(findCheckbox().exists()).toBe(true); - expect(findHelpLink().exists()).toBe(true); - }); + describe('default', () => { + beforeEach(() => { + createComponent(); + }); - it('sets correct setting value in checkbox with query result', async () => { - await wrapper.vm.$nextTick(); + it('displays the checkbox and the help link', () => { + expect(findCheckbox().exists()).toBe(true); + expect(findHelpLink().exists()).toBe(true); + }); + + it('calls mutation on artifact setting change with correct payload', () => { + findCheckbox().vm.$emit('change', false); - expect(wrapper.element).toMatchSnapshot(); + expect(requestHandlers.keepLatestArtifactMutationHandler).toHaveBeenCalledWith({ + fullPath, + keepLatestArtifact: false, + }); + }); }); - it('calls mutation on artifact setting change with correct payload', () => { - findCheckbox().vm.$emit('change', false); + describe('when application keep latest artifact setting is enabled', () => { + beforeEach(() => { + createComponent(); + }); + + it('sets correct setting value in checkbox with query result', async () => { + await wrapper.vm.$nextTick(); + + expect(wrapper.element).toMatchSnapshot(); + }); + + it('checkbox is enabled when application setting is enabled', async () => { + await wrapper.vm.$nextTick(); + + expect(findCheckbox().attributes('disabled')).toBeUndefined(); + }); + }); - expect(requestHandlers.keepLatestArtifactMutationHandler).toHaveBeenCalledWith({ - fullPath, - keepLatestArtifact: false, + describe('when application keep latest artifact setting is disabled', () => { + it('checkbox is disabled when application setting is disabled', async () => { + createComponent({ + keepLatestArtifactApplicationQueryHandler: jest.fn().mockResolvedValue({ + data: { + ciApplicationSettings: { + keepLatestArtifact: false, + }, + }, + }), + }); + + await wrapper.vm.$nextTick(); + + expect(wrapper.element).toMatchSnapshot(); + expect(findCheckbox().attributes('disabled')).toBe('true'); }); }); }); diff --git a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb index 20406acb658..53dea1d0d19 100644 --- a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb @@ -235,7 +235,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Build do with_them do before do - project.update!(ci_keep_latest_artifact: keep_latest_artifact) + project.update!(keep_latest_artifact: keep_latest_artifact) end it 'builds a pipeline with appropriate locked value' do diff --git a/spec/lib/gitlab/import_export/decompressed_archive_size_validator_spec.rb b/spec/lib/gitlab/import_export/decompressed_archive_size_validator_spec.rb index efb271086a0..96c467e78d6 100644 --- a/spec/lib/gitlab/import_export/decompressed_archive_size_validator_spec.rb +++ b/spec/lib/gitlab/import_export/decompressed_archive_size_validator_spec.rb @@ -27,25 +27,55 @@ RSpec.describe Gitlab::ImportExport::DecompressedArchiveSizeValidator do end context 'when file exceeds allowed decompressed size' do - it 'returns false' do + it 'logs error message returns false' do + expect(Gitlab::Import::Logger) + .to receive(:info) + .with( + import_upload_archive_path: filepath, + import_upload_archive_size: File.size(filepath), + message: 'Decompressed archive size limit reached' + ) expect(subject.valid?).to eq(false) end end - context 'when something goes wrong during decompression' do - before do - allow(subject.archive_file).to receive(:eof?).and_raise(StandardError) + context 'when exception occurs during decompression' do + shared_examples 'logs raised exception and terminates validator process group' do + let(:std) { double(:std, close: nil, value: nil) } + let(:wait_thr) { double } + + before do + allow(Process).to receive(:getpgid).and_return(2) + allow(Open3).to receive(:popen3).and_return([std, std, std, wait_thr]) + allow(wait_thr).to receive(:[]).with(:pid).and_return(1) + allow(wait_thr).to receive(:value).and_raise(exception) + end + + it 'logs raised exception and terminates validator process group' do + expect(Gitlab::Import::Logger) + .to receive(:info) + .with( + import_upload_archive_path: filepath, + import_upload_archive_size: File.size(filepath), + message: error_message + ) + expect(Process).to receive(:kill).with(-1, 2) + expect(subject.valid?).to eq(false) + end end - it 'logs and tracks raised exception' do - expect(Gitlab::ErrorTracking).to receive(:track_exception).with(instance_of(StandardError)) - expect(Gitlab::Import::Logger).to receive(:info).with(hash_including(message: 'Decompressed archive size validation failed.')) + context 'when timeout occurs' do + let(:error_message) { 'Timeout reached during archive decompression' } + let(:exception) { Timeout::Error } - subject.valid? + include_examples 'logs raised exception and terminates validator process group' end - it 'returns false' do - expect(subject.valid?).to eq(false) + context 'when exception occurs' do + let(:error_message) { 'Error!' } + let(:exception) { StandardError.new(error_message) } + + include_examples 'logs raised exception and terminates validator process group' end end end diff --git a/spec/models/project_ci_cd_setting_spec.rb b/spec/models/project_ci_cd_setting_spec.rb index 698465e854a..406485d8cc8 100644 --- a/spec/models/project_ci_cd_setting_spec.rb +++ b/spec/models/project_ci_cd_setting_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe ProjectCiCdSetting do + using RSpec::Parameterized::TableSyntax + describe 'validations' do it 'validates default_git_depth is between 0 and 1000 or nil' do expect(subject).to validate_numericality_of(:default_git_depth) @@ -36,4 +38,39 @@ RSpec.describe ProjectCiCdSetting do expect(project.reload.ci_cd_settings.default_git_depth).to eq(0) end end + + describe '#keep_latest_artifacts_available?' do + let(:attrs) { { keep_latest_artifact: project_enabled } } + let(:project_settings) { described_class.new(attrs) } + + subject { project_settings.keep_latest_artifacts_available? } + + context 'without application setting record' do + where(:project_enabled, :result_keep_latest_artifact) do + false | false + true | true + end + + with_them do + it { expect(subject).to eq(result_keep_latest_artifact) } + end + end + + context 'with application setting record' do + where(:instance_enabled, :project_enabled, :result_keep_latest_artifact) do + false | false | false + false | true | false + true | false | false + true | true | true + end + + before do + Gitlab::CurrentSettings.current_application_settings.update!(keep_latest_artifact: instance_enabled) + end + + with_them do + it { expect(subject).to eq(result_keep_latest_artifact) } + end + end + end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 5bcdb346646..fd7975bf65d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -559,6 +559,25 @@ RSpec.describe Project, factory_default: :keep do end end + describe '#default_pipeline_lock' do + let(:project) { build_stubbed(:project) } + + subject { project.default_pipeline_lock } + + where(:keep_latest_artifact_enabled, :result_pipeline_locked) do + false | :unlocked + true | :artifacts_locked + end + + before do + allow(project).to receive(:keep_latest_artifacts_available?).and_return(keep_latest_artifact_enabled) + end + + with_them do + it { expect(subject).to eq(result_pipeline_locked) } + end + end + describe '#autoclose_referenced_issues' do context 'when DB entry is nil' do let(:project) { build(:project, autoclose_referenced_issues: nil) } diff --git a/spec/requests/api/graphql/ci/application_setting_spec.rb b/spec/requests/api/graphql/ci/application_setting_spec.rb new file mode 100644 index 00000000000..156ee550f16 --- /dev/null +++ b/spec/requests/api/graphql/ci/application_setting_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'getting Application Settings' do + include GraphqlHelpers + + let(:fields) do + <<~QUERY + #{all_graphql_fields_for('CiApplicationSettings', max_depth: 1)} + QUERY + end + + let(:query) do + graphql_query_for( + 'ciApplicationSettings', + fields + ) + end + + let(:settings_data) { graphql_data['ciApplicationSettings'] } + + context 'without admin permissions' do + let(:user) { create(:user) } + + before do + post_graphql(query, current_user: user) + end + + it_behaves_like 'a working graphql query' + + specify { expect(settings_data).to be nil } + end + + context 'with admin permissions' do + let(:user) { create(:user, :admin) } + + before do + post_graphql(query, current_user: user) + end + + it_behaves_like 'a working graphql query' + + it 'fetches the settings data' do + # assert against hash to ensure no additional fields are exposed + expect(settings_data).to match({ 'keepLatestArtifact' => Gitlab::CurrentSettings.current_application_settings.keep_latest_artifact }) + end + end +end diff --git a/spec/requests/api/graphql/ci/ci_cd_setting_spec.rb b/spec/requests/api/graphql/ci/ci_cd_setting_spec.rb index db8a412e45c..99647d0fa3a 100644 --- a/spec/requests/api/graphql/ci/ci_cd_setting_spec.rb +++ b/spec/requests/api/graphql/ci/ci_cd_setting_spec.rb @@ -46,7 +46,7 @@ RSpec.describe 'Getting Ci Cd Setting' do it 'fetches the settings data' do expect(settings_data['mergePipelinesEnabled']).to eql project.ci_cd_settings.merge_pipelines_enabled? expect(settings_data['mergeTrainsEnabled']).to eql project.ci_cd_settings.merge_trains_enabled? - expect(settings_data['keepLatestArtifact']).to eql project.ci_keep_latest_artifact? + expect(settings_data['keepLatestArtifact']).to eql project.keep_latest_artifacts_available? end end end diff --git a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb b/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb index 283badeaf33..0dcae28ac5d 100644 --- a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb +++ b/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe 'CiCdSettingsUpdate' do include GraphqlHelpers - let_it_be(:project) { create(:project, ci_keep_latest_artifact: true) } + let_it_be(:project) { create(:project, keep_latest_artifact: true) } let(:variables) { { full_path: project.full_path, keep_latest_artifact: false } } let(:mutation) { graphql_mutation(:ci_cd_settings_update, variables) } @@ -42,7 +42,7 @@ RSpec.describe 'CiCdSettingsUpdate' do project.reload expect(response).to have_gitlab_http_status(:success) - expect(project.ci_keep_latest_artifact).to eq(false) + expect(project.keep_latest_artifact).to eq(false) end context 'when bad arguments are provided' do diff --git a/spec/requests/api/graphql/packages/package_spec.rb b/spec/requests/api/graphql/packages/package_spec.rb index 3def9b7d19d..bb3ceb81f16 100644 --- a/spec/requests/api/graphql/packages/package_spec.rb +++ b/spec/requests/api/graphql/packages/package_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'package details' do end let(:depth) { 3 } - let(:excluded) { ['metadata'] } + let(:excluded) { %w[metadata apiFuzzingCiConfiguration] } let(:query) do graphql_query_for(:package, { id: package_global_id }, <<~FIELDS) |