From 9f9d994f13388fb3ce117ed01c2cd0c05c98d055 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 8 Nov 2022 21:10:57 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .gitlab/CODEOWNERS | 2 +- .../ci/package-and-test/main.gitlab-ci.yml | 10 +- .gitlab/ci/qa.gitlab-ci.yml | 4 +- .gitlab/ci/review-apps/main.gitlab-ci.yml | 4 +- .gitlab/ci/review-apps/qa.gitlab-ci.yml | 4 +- .gitlab/ci/review-apps/rules.gitlab-ci.yml | 6 +- .gitlab/ci/review.gitlab-ci.yml | 6 +- app/helpers/search_helper.rb | 2 +- app/views/devise/sessions/new.html.haml | 2 +- app/workers/all_queues.yml | 9 + .../merge_requests/delete_branch_worker.rb | 32 ++++ .../delete_source_branch_worker.rb | 18 +- .../development/add_delete_branch_worker.yml | 8 + config/sidekiq_queues.yml | 2 + .../deprecations/15-2-job_age-deprecation.yml | 2 +- data/deprecations/15-3-deprecate-redis-5.yml | 2 +- ...-deprecation-draft-quick-action-toggle.yml | 6 +- data/deprecations/templates/example.yml | 6 +- data/whats_new/202206220001_15_1.yml | 4 +- data/whats_new/202207220001_15_2.yml | 26 +-- data/whats_new/202209220001_15_04.yml | 126 ++++++------- doc/administration/gitaly/index.md | 2 + .../documentation/styleguide/word_list.md | 6 +- doc/user/clusters/agent/index.md | 2 + .../Jobs/SAST-IaC.latest.gitlab-ci.yml | 2 +- .../templates/Jobs/SAST.latest.gitlab-ci.yml | 14 +- .../Secret-Detection.latest.gitlab-ci.yml | 2 +- scripts/rspec_helpers.sh | 2 +- spec/helpers/search_helper_spec.rb | 4 +- .../delete_branch_worker_spec.rb | 95 ++++++++++ .../delete_source_branch_worker_spec.rb | 176 +++++++++++------- 31 files changed, 395 insertions(+), 191 deletions(-) create mode 100644 app/workers/merge_requests/delete_branch_worker.rb create mode 100644 config/feature_flags/development/add_delete_branch_worker.yml create mode 100644 spec/workers/merge_requests/delete_branch_worker_spec.rb diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index 188428ec1c7..a67374a2bb6 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -156,7 +156,7 @@ Dangerfile @gl-quality/eng-prod /app/assets/javascripts/ci/pipeline_schedules/ @gitlab-org/ci-cd/verify/frontend /app/assets/javascripts/pipeline_editor/ @gitlab-org/ci-cd/verify/frontend /ee/app/assets/javascripts/ci/ci_minutes_usage/ @gitlab-org/ci-cd/verify/frontend -/ee/app/assets/javascripts/usage_quotas/ci_minutes_usage/ @gitlab-org/ci-cd/verify/frontend +/ee/app/assets/javascripts/ci/usage_quotas/ci_minutes_usage/ @gitlab-org/ci-cd/verify/frontend /ee/app/assets/javascripts/usage_quotas/pipelines/ @gitlab-org/ci-cd/verify/frontend /ee/app/assets/javascripts/reports/ @gitlab-org/ci-cd/verify/frontend diff --git a/.gitlab/ci/package-and-test/main.gitlab-ci.yml b/.gitlab/ci/package-and-test/main.gitlab-ci.yml index 1cb12363168..83049e6fbc2 100644 --- a/.gitlab/ci/package-and-test/main.gitlab-ci.yml +++ b/.gitlab/ci/package-and-test/main.gitlab-ci.yml @@ -208,7 +208,7 @@ ee:instance-parallel-ff-inverse: QA_KNAPSACK_REPORT_NAME: ee-instance-parallel GITLAB_QA_OPTS: --set-feature-flags $QA_FEATURE_FLAGS rules: - - !reference [.rules:test:feature-flags-deleted, rules] # skip job when only change is ff deletion + - !reference [.rules:test:feature-flags-deleted, rules] # skip job when only change is ff deletion - !reference [.rules:test:feature-flags-set, rules] # ------------------------------------------ @@ -226,7 +226,7 @@ ee:instance-parallel: - .parallel - ee:instance rules: - - !reference [.rules:test:feature-flags-set, rules] # always run instance-parallel to validate ff change + - !reference [.rules:test:feature-flags-set, rules] # always run instance-parallel to validate ff change - !reference [.rules:test:qa-parallel, rules] - if: $QA_SUITES =~ /Test::Instance::All/ @@ -559,7 +559,7 @@ ee:elasticsearch: variables: QA_SCENARIO: "Test::Integration::Elasticsearch" before_script: - - unset ELASTIC_URL # unset url which is globally defined in .gitlab-ci.yml + - unset ELASTIC_URL # unset url which is globally defined in .gitlab-ci.yml - !reference [.qa, before_script] rules: - !reference [.rules:test:qa, rules] @@ -588,7 +588,7 @@ e2e-test-report: ALLURE_MERGE_REQUEST_IID: $CI_MERGE_REQUEST_IID ALLURE_JOB_NAME: e2e-package-and-test GIT_STRATEGY: none - artifacts: # save rspec results for displaying in parent pipeline + artifacts: # save rspec results for displaying in parent pipeline expire_in: 1 day when: always paths: @@ -658,5 +658,5 @@ notify-slack: TYPE: "(package-and-test) " when: on_failure script: - - bundle exec gitlab-qa-report --prepare-stage-reports "$CI_PROJECT_DIR/gitlab-qa-run-*/**/rspec-*.xml" # generate summary + - bundle exec gitlab-qa-report --prepare-stage-reports "$CI_PROJECT_DIR/gitlab-qa-run-*/**/rspec-*.xml" # generate summary - !reference [.notify-slack-qa, script] diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml index bd587cb4418..11331967e95 100644 --- a/.gitlab/ci/qa.gitlab-ci.yml +++ b/.gitlab/ci/qa.gitlab-ci.yml @@ -78,8 +78,8 @@ e2e:package-and-test: SKIP_MESSAGE: Skipping package-and-test due to mr containing only quarantine changes! RELEASE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/build/omnibus-gitlab-mirror/gitlab-ee:${CI_COMMIT_SHA}" GITLAB_QA_IMAGE: "${CI_REGISTRY_IMAGE}/gitlab-ee-qa:${CI_COMMIT_SHA}" - RUN_WITH_BUNDLE: "true" # instructs pipeline to install and run gitlab-qa gem via bundler - QA_PATH: qa # sets the optional path for bundler to run from + RUN_WITH_BUNDLE: "true" # instructs pipeline to install and run gitlab-qa gem via bundler + QA_PATH: qa # sets the optional path for bundler to run from trigger: strategy: depend forward: diff --git a/.gitlab/ci/review-apps/main.gitlab-ci.yml b/.gitlab/ci/review-apps/main.gitlab-ci.yml index 1f801e0d803..3fab25f7236 100644 --- a/.gitlab/ci/review-apps/main.gitlab-ci.yml +++ b/.gitlab/ci/review-apps/main.gitlab-ci.yml @@ -91,7 +91,7 @@ review-build-cng: DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}" GITLAB_HELM_CHART_REF: "138c146a5ba787942f66d4c7d795d224d6ba206a" environment: - name: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # No separator for SCHEDULE_TYPE so it's compatible as before and looks nice without it + name: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # No separator for SCHEDULE_TYPE so it's compatible as before and looks nice without it url: https://gitlab-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN} on_stop: review-stop auto_stop_in: 48 hours @@ -172,7 +172,7 @@ review-stop: extends: - .review-stop-base - .review:rules:review-stop - resource_group: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # CI_ENVIRONMENT_SLUG is not available here and we want this to be the same as the environment + resource_group: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # CI_ENVIRONMENT_SLUG is not available here and we want this to be the same as the environment stage: deploy needs: [] script: diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml index 0745efff5b2..4ffc30296bb 100644 --- a/.gitlab/ci/review-apps/qa.gitlab-ci.yml +++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml @@ -146,7 +146,7 @@ e2e-test-report: GIT_STRATEGY: none allow_failure: true when: always - artifacts: # re-save rspec results for displaying in parent pipeline + artifacts: # re-save rspec results for displaying in parent pipeline expire_in: 1 day when: always paths: @@ -189,5 +189,5 @@ notify-slack: STATUS: failed TYPE: "(review-app) " script: - - bundle exec gitlab-qa-report --prepare-stage-reports "$CI_PROJECT_DIR/qa/tmp/rspec-*.xml" # generate summary + - bundle exec gitlab-qa-report --prepare-stage-reports "$CI_PROJECT_DIR/qa/tmp/rspec-*.xml" # generate summary - !reference [.notify-slack-qa, script] diff --git a/.gitlab/ci/review-apps/rules.gitlab-ci.yml b/.gitlab/ci/review-apps/rules.gitlab-ci.yml index a29b48cda59..ba646c53870 100644 --- a/.gitlab/ci/review-apps/rules.gitlab-ci.yml +++ b/.gitlab/ci/review-apps/rules.gitlab-ci.yml @@ -61,7 +61,7 @@ # always trigger smoke suite if review pipeline got triggered by specific changes in application code - <<: *app-changes variables: - QA_TESTS: "" # unset QA_TESTS even if specific tests were inferred from stage label + QA_TESTS: "" # unset QA_TESTS even if specific tests were inferred from stage label - *qa-run-all-tests - if: $QA_SUITES =~ /Test::Instance::Smoke/ - *qa-manual @@ -77,7 +77,7 @@ # always trigger blocking suite if review pipeline got triggered by specific changes in application code - <<: *app-changes variables: - QA_TESTS: "" # unset QA_TESTS even if specific tests were inferred from stage label + QA_TESTS: "" # unset QA_TESTS even if specific tests were inferred from stage label - !reference [.never-when-specific-specs-always-when-qa-run-all-tests] - if: $QA_SUITES =~ /Test::Instance::ReviewBlocking/ @@ -88,7 +88,7 @@ .rules:qa-non-blocking-parallel: rules: - !reference [.never-when-specific-specs-always-when-qa-run-all-tests] - - *all-specs-mr # set full suite to manual when no specific specs passed in mr + - *all-specs-mr # set full suite to manual when no specific specs passed in mr - if: $QA_SUITES =~ /Test::Instance::ReviewNonBlocking/ # ------------------------------------------ diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml index aefa96da159..4cd468c8a8d 100644 --- a/.gitlab/ci/review.gitlab-ci.yml +++ b/.gitlab/ci/review.gitlab-ci.yml @@ -3,10 +3,10 @@ review-cleanup: - .default-retry - .review:rules:review-cleanup image: ${REVIEW_APPS_IMAGE} - resource_group: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # CI_ENVIRONMENT_SLUG is not available here and we want this to be the same as the environment + resource_group: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # CI_ENVIRONMENT_SLUG is not available here and we want this to be the same as the environment stage: prepare environment: - name: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # No separator for SCHEDULE_TYPE so it's compatible as before and looks nice without it + name: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # No separator for SCHEDULE_TYPE so it's compatible as before and looks nice without it action: stop before_script: - source scripts/utils.sh @@ -23,7 +23,7 @@ review-cleanup: start-review-app-pipeline: extends: - .review:rules:start-review-app-pipeline - resource_group: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # CI_ENVIRONMENT_SLUG is not available here and we want this to be the same as the environment + resource_group: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # CI_ENVIRONMENT_SLUG is not available here and we want this to be the same as the environment stage: review needs: - job: e2e-test-pipeline-generate diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 2f3aba8d09d..f244a6bc17f 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -431,7 +431,7 @@ module SearchHelper def search_navigation { projects: { sort: 1, label: _("Projects"), data: { qa_selector: 'projects_tab' }, condition: @project.nil? }, - blobs: { sort: 2, label: _("Code"), data: { qa_selector: 'code_tab' }, condition: project_search_tabs?(:blobs) || search_service.show_elasticsearch_tabs? || feature_flag_tab_enabled?(:global_search_code_tab) }, + blobs: { sort: 2, label: _("Code"), data: { qa_selector: 'code_tab' }, condition: project_search_tabs?(:blobs) || (search_service.show_elasticsearch_tabs? && feature_flag_tab_enabled?(:global_search_code_tab)) }, # sort: 3 is reserved for EE items issues: { sort: 4, label: _("Issues"), condition: project_search_tabs?(:issues) || feature_flag_tab_enabled?(:global_search_issues_tab) }, merge_requests: { sort: 5, label: _("Merge requests"), condition: project_search_tabs?(:merge_requests) || feature_flag_tab_enabled?(:global_search_merge_requests_tab) }, diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index e823b153b23..a4edf165a89 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -16,7 +16,7 @@ %div = _('No authentication methods configured.') - - if Feature.enabled?(:restyle_login_page, @project) + - if Feature.enabled?(:restyle_login_page, @project) && Gitlab::CurrentSettings.current_application_settings.terms %p.gl-px-5 = html_escape(s_("SignUp|By signing in you accept the %{link_start}Terms of Use and acknowledge the Privacy Policy and Cookie Policy%{link_end}.")) % { link_start: "".html_safe, link_end: ''.html_safe } diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index 4ff496e5305..e03fbf6b44e 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -2703,6 +2703,15 @@ :weight: 1 :idempotent: true :tags: [] +- :name: merge_requests_delete_branch + :worker_name: MergeRequests::DeleteBranchWorker + :feature_category: :source_code_management + :has_external_dependencies: false + :urgency: :high + :resource_boundary: :unknown + :weight: 1 + :idempotent: true + :tags: [] - :name: merge_requests_delete_source_branch :worker_name: MergeRequests::DeleteSourceBranchWorker :feature_category: :source_code_management diff --git a/app/workers/merge_requests/delete_branch_worker.rb b/app/workers/merge_requests/delete_branch_worker.rb new file mode 100644 index 00000000000..8cb58a401a1 --- /dev/null +++ b/app/workers/merge_requests/delete_branch_worker.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module MergeRequests + class DeleteBranchWorker + include ApplicationWorker + + data_consistency :always + + feature_category :source_code_management + urgency :high + idempotent! + + def perform(merge_request_id, user_id, branch_name, retarget_branch) + merge_request = MergeRequest.find_by_id(merge_request_id) + user = User.find_by_id(user_id) + + return unless merge_request.present? && user.present? + + delete_service_result = ::Branches::DeleteService.new(merge_request.source_project, user) + .execute(branch_name) + + if Feature.enabled?(:track_delete_source_errors, merge_request.source_project) && delete_service_result&.error? + delete_service_result.track_exception + end + + return unless retarget_branch + + ::MergeRequests::RetargetChainService.new(project: merge_request.source_project, current_user: user) + .execute(merge_request) + end + end +end diff --git a/app/workers/merge_requests/delete_source_branch_worker.rb b/app/workers/merge_requests/delete_source_branch_worker.rb index 66392c670b5..ce24e35131c 100644 --- a/app/workers/merge_requests/delete_source_branch_worker.rb +++ b/app/workers/merge_requests/delete_source_branch_worker.rb @@ -18,15 +18,19 @@ class MergeRequests::DeleteSourceBranchWorker # Source branch changed while it's being removed return if merge_request.source_branch_sha != source_branch_sha - delete_service_result = ::Branches::DeleteService.new(merge_request.source_project, user) - .execute(merge_request.source_branch) + if Feature.enabled?(:add_delete_branch_worker, merge_request.source_project) + ::MergeRequests::DeleteBranchWorker.perform_async(merge_request_id, user_id, merge_request.source_branch, true) + else + delete_service_result = ::Branches::DeleteService.new(merge_request.source_project, user) + .execute(merge_request.source_branch) - if Feature.enabled?(:track_delete_source_errors, merge_request.source_project) - delete_service_result.track_exception if delete_service_result&.error? + if Feature.enabled?(:track_delete_source_errors, merge_request.source_project) + delete_service_result.track_exception if delete_service_result&.error? + end + + ::MergeRequests::RetargetChainService.new(project: merge_request.source_project, current_user: user) + .execute(merge_request) end - - ::MergeRequests::RetargetChainService.new(project: merge_request.source_project, current_user: user) - .execute(merge_request) rescue ActiveRecord::RecordNotFound end end diff --git a/config/feature_flags/development/add_delete_branch_worker.yml b/config/feature_flags/development/add_delete_branch_worker.yml new file mode 100644 index 00000000000..b0470a7f901 --- /dev/null +++ b/config/feature_flags/development/add_delete_branch_worker.yml @@ -0,0 +1,8 @@ +--- +name: add_delete_branch_worker +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/102208 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/381640 +milestone: '15.6' +type: development +group: group::code review +default_enabled: false diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml index d6a9983a816..a403c0992fc 100644 --- a/config/sidekiq_queues.yml +++ b/config/sidekiq_queues.yml @@ -299,6 +299,8 @@ - 1 - - merge_requests_create_approval_note - 1 +- - merge_requests_delete_branch + - 1 - - merge_requests_delete_source_branch - 1 - - merge_requests_execute_approval_hooks diff --git a/data/deprecations/15-2-job_age-deprecation.yml b/data/deprecations/15-2-job_age-deprecation.yml index 889c8651bbe..b395c97447c 100644 --- a/data/deprecations/15-2-job_age-deprecation.yml +++ b/data/deprecations/15-2-job_age-deprecation.yml @@ -24,7 +24,7 @@ removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. breaking_change: true # (required) If this deprecation is a breaking change, set this value to true reporter: jheimbuck_gl # (required) GitLab username of the person reporting the deprecation - stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth + stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334253 # (required) Link to the deprecation issue in GitLab body: | # (required) Do not modify this line, instead modify the lines below. The `job_age` parameter, returned from the `POST /jobs/request` API endpoint used in communication with GitLab Runner, was never used by any GitLab or Runner feature. This parameter will be removed in GitLab 16.0. diff --git a/data/deprecations/15-3-deprecate-redis-5.yml b/data/deprecations/15-3-deprecate-redis-5.yml index f0e350cc62b..d61b1a1c475 100644 --- a/data/deprecations/15-3-deprecate-redis-5.yml +++ b/data/deprecations/15-3-deprecate-redis-5.yml @@ -2,7 +2,7 @@ announcement_milestone: "15.3" # (required) The milestone when this feature was first announced as deprecated. announcement_date: "2022-08-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed - removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. + removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. breaking_change: true # (required) If this deprecation is a breaking change, set this value to true reporter: tnir stage: Enablement diff --git a/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml b/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml index 2265354c4c7..5d4fb1b5b66 100644 --- a/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml +++ b/data/deprecations/15-4-create-deprecation-draft-quick-action-toggle.yml @@ -2,11 +2,11 @@ announcement_milestone: "15.4" # (required) The milestone when this feature was first announced as deprecated. announcement_date: "2022-09-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed - removal_date: "2022-05-22"# (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. + removal_date: "2022-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. breaking_change: true # (required) If this deprecation is a breaking change, set this value to true reporter: phikai # (required) GitLab username of the person reporting the deprecation stage: create # (required) String value of the stage that the feature was created in. e.g., Growth - issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365365 # (required) Link to the deprecation issue in GitLab + issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365365 # (required) Link to the deprecation issue in GitLab body: | # (required) Do not modify this line, instead modify the lines below. In order to make the behavior of toggling the draft status of a merge request more clear via a quick action, we're deprecating and removing the toggle behavior of the `/draft` quick action. Beginning with the 16.0 release of GitLab, `/draft` will only set a merge request to Draft and a new `/ready` quick action will be used to remove the draft status. - documentation_url: # (optional) This is a link to the current documentation page + documentation_url: # (optional) This is a link to the current documentation page diff --git a/data/deprecations/templates/example.yml b/data/deprecations/templates/example.yml index e5e04e5d216..cc512f70b3e 100644 --- a/data/deprecations/templates/example.yml +++ b/data/deprecations/templates/example.yml @@ -41,9 +41,9 @@ # end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end. end_of_support_date: # (optional) The date of the milestone release when support for this feature will end. -# -# OTHER OPTIONAL FIELDS -# + # + # OTHER OPTIONAL FIELDS + # tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate] documentation_url: # (optional) This is a link to the current documentation page image_url: # (optional) This is a link to a thumbnail image depicting the feature diff --git a/data/whats_new/202206220001_15_1.yml b/data/whats_new/202206220001_15_1.yml index ab91ffeecb6..4a57db233b9 100644 --- a/data/whats_new/202206220001_15_1.yml +++ b/data/whats_new/202206220001_15_1.yml @@ -17,7 +17,7 @@ gitlab-com: true available_in: [Premium, Ultimate] documentation_link: https://docs.gitlab.com/ee/user/group/saml_sso/group_sync.html - image_url: https://about.gitlab.com/images/15_1/SAML_Group_Sync.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + image_url: https://about.gitlab.com/images/15_1/SAML_Group_Sync.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg published_at: 2022-06-22 release: 15.1 - name: Enhancing visibility into Value Stream with DORA metrics @@ -28,7 +28,7 @@ gitlab-com: true available_in: [Free, Premium, Ultimate] documentation_link: https://docs.gitlab.com/ee/user/analytics/ci_cd_analytics.html - image_url: https://about.gitlab.com/images/15_1/vsa_dora_n_ttrs.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + image_url: https://about.gitlab.com/images/15_1/vsa_dora_n_ttrs.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg published_at: 2022-06-22 release: 15.1 - name: "SLSA-2 attestation included for build artifacts" diff --git a/data/whats_new/202207220001_15_2.yml b/data/whats_new/202207220001_15_2.yml index 4f6f65c9f18..7563a9ffbe9 100644 --- a/data/whats_new/202207220001_15_2.yml +++ b/data/whats_new/202207220001_15_2.yml @@ -1,4 +1,4 @@ -- name: "Live preview diagrams in the wiki WYSIWYG editor" # Match the release post entry +- name: "Live preview diagrams in the wiki WYSIWYG editor" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. GitLab Flavored Markdown includes extensions to support [Mermaid, PlantUML, and Kroki diagrams](https://docs.gitlab.com/ee/user/markdown.html#diagrams-and-flowcharts) but writing anything other than the most basic diagrams can be cumbersome without a live preview. You can toggle between the raw source and static preview and there are external tools you can use to write these diagrams, but the shift away from your content can be distracting. @@ -11,8 +11,8 @@ image_url: https://about.gitlab.com/images/15_2/create-preview-diagrams-in-wysiwyg.png published_at: 2022-07-22 release: 15.2 -- name: Incident timeline # Match the release post entry - description: | # Do not modify this line, instead modify the lines below. +- name: Incident timeline # Match the release post entry + description: | # Do not modify this line, instead modify the lines below. Capturing what happened during an incident is an important practice that facilitates learning and the opportunity for improvement. Yet, asking incident responders to take on additional administrative tasks when they're busy fire-fighting, or trying to reconstruct the timeline of events post incident lead to incomplete or less than accurate information. GitLab incident timeline is designed to make information capture during an incident, or post incident, easy and efficient. In the Incident timeline MVC, we make it possible to add new timeline events manually, delete a timeline event, and view the incident timeline in a dedicated tab within an incident issue. @@ -24,8 +24,8 @@ image_url: https://img.youtube.com/vi/a0brUwOajvQ/hqdefault.jpg published_at: 2022-07-22 release: 15.2 -- name: "Merge request reports redesign" # Match the release post entry - description: | # Do not modify this line, instead modify the lines below. +- name: "Merge request reports redesign" # Match the release post entry + description: | # Do not modify this line, instead modify the lines below. Merge request reports are an important part of code review, providing insights into the impact of changes and improvements to meet project standards. Report widgets now all follow design guidelines for layout, hierarchy, and content sections, making them consistent, scannable, and utilitarian. These improvements make it easier for you to find actionable information in each report. @@ -37,8 +37,8 @@ image_url: https://about.gitlab.com/images/15_2/create-merge-request-widget-redesign.png published_at: 2022-07-22 release: 15.2 -- name: "Change failure rate chart for visualizing software stability" # Match the release post entry - description: | # Do not modify this line, instead modify the lines below. +- name: "Change failure rate chart for visualizing software stability" # Match the release post entry + description: | # Do not modify this line, instead modify the lines below. In this release, we added a new trend chart for the DORA [Change failure rate](https://docs.gitlab.com/ee/user/analytics/ci_cd_analytics.html) metric. This chart shows the percentage of deployments that cause an incident in a production environment. GitLab measures the change failure rate as the number of [incidents](https://docs.gitlab.com/ee/operations/incident_management/incidents.html) divided by the number of deployments to a production environment during a given time period. This is the fourth DORA chart available in GitLab that provides insights into [value stream velocity and reliability trends](https://about.gitlab.com/blog/2022/06/20/gitlab-value-stream-management-and-dora/). @@ -50,8 +50,8 @@ image_url: https://about.gitlab.com/images/15_2/dora4_chart_cfr.png published_at: 2022-07-22 release: 15.2 -- name: "Enforce IP address restrictions for Git over SSH" # Match the release post entry - description: | # Do not modify this line, instead modify the lines below. +- name: "Enforce IP address restrictions for Git over SSH" # Match the release post entry + description: | # Do not modify this line, instead modify the lines below. Limiting access to requests from a trusted set of IP addresses may improve security. Until now, only the API and UI supported such access restrictions; SSH access was blocked entirely. SSH now also adheres to this restriction, and grants access only to requests coming from IP addresses in your list. stage: create self-managed: false @@ -61,8 +61,8 @@ image_url: https://img.youtube.com/vi/f60EgVK3mWc/hqdefault.jpg published_at: 2022-07-22 release: 15.2 -- name: "Group and subgroup scan execution policies" # Match the release post entry - description: | # Do not modify this line, instead modify the lines below. +- name: "Group and subgroup scan execution policies" # Match the release post entry + description: | # Do not modify this line, instead modify the lines below. Your security and compliance teams can now apply policies uniformly to all projects by scanning execution policies at the group and subgroup levels. This functionality is especially helpful for large organizations who have a large number of projects. Policies defined for the group or subgroup will flow down and apply to all child projects. To get started, ask your group owner to link a security policy project to your group on the **Security & Compliance > Policies** page. Currently scan execution policies are the only policy type that is supported at the group and subgroup levels. You can track the efforts to add group and subgroup level support for scan result policies in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/7622). @@ -74,8 +74,8 @@ image_url: https://about.gitlab.com/images/15_2/protect_group_policies.png published_at: 2022-07-22 release: 15.2 -- name: "Set the image pull policy in pipeline configuration" # Match the release post entry - description: | # Do not modify this line, instead modify the lines below. +- name: "Set the image pull policy in pipeline configuration" # Match the release post entry + description: | # Do not modify this line, instead modify the lines below. You can select different [pull policies](https://docs.gitlab.com/runner/executors/docker.html#how-pull-policies-work) for how a GitLab Runner downloads Docker images in CI/CD jobs. `always` (the default behavior) ensures the image is always downloaded, `if-not-present` downloads an image only when a local version does not exist, and `never` only uses the local version (never download an image). Previously, you could define the pull policy only at the runner level. In this release we've added the ability to define the pull policy at the pipeline level. Use `pull_policy` in your `.gitlab-ci.yml` to define different pull policies at the job or pipeline level. This feature is not supported by shared runners. diff --git a/data/whats_new/202209220001_15_04.yml b/data/whats_new/202209220001_15_04.yml index 056826c6457..3ee7c65ce23 100644 --- a/data/whats_new/202209220001_15_04.yml +++ b/data/whats_new/202209220001_15_04.yml @@ -1,19 +1,19 @@ -- name: "Suggested Reviewers open beta" # Match the release post entry +- name: "Suggested Reviewers open beta" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. Deciding the right person to [review your merge request](https://docs.gitlab.com/ee/user/project/merge_requests/reviews/) isn't always straightforward or obvious. Choosing the wrong reviewer can cause delays, low quality reviews, back and forth reassigning reviewers, or even no review at all. Now, GitLab can recommend a reviewer with [Suggested Reviewers](https://docs.gitlab.com/ee/user/project/merge_requests/reviews/#suggested-reviewers). Using the changes in a merge request and a project's contribution graph, machine learning powered suggestions appear in the [reviewer dropdown](https://docs.gitlab.com/ee/user/project/merge_requests/getting_started.html#reviewer) in the merge request sidebar. This feature is currently in [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#open-beta) behind a [feature flag](https://gitlab.com/gitlab-org/gitlab/-/issues/368356). It will be rolling out to all Ultimate GitLab.com customers over the next week. - stage: create # String value of the stage that the feature was created in. e.g., Growth - self-managed: false # Boolean value (true or false) - gitlab-com: true # Boolean value (true or false) - available_in: [Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] - documentation_link: 'https://docs.gitlab.com/ee/user/project/merge_requests/reviews/#suggested-reviewers' # This is the documentation URL, but can be a URL to a video if there is one - image_url: https://about.gitlab.com/images/15_4/create-code-review-suggested-reviewers.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: 2022-09-22 # YYYY-MM-DD - release: 15.4 # XX.Y -- name: "Improved CI/CD integration in VS Code" # Match the release post entry + stage: create # String value of the stage that the feature was created in. e.g., Growth + self-managed: false # Boolean value (true or false) + gitlab-com: true # Boolean value (true or false) + available_in: [Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] + documentation_link: 'https://docs.gitlab.com/ee/user/project/merge_requests/reviews/#suggested-reviewers' # This is the documentation URL, but can be a URL to a video if there is one + image_url: https://about.gitlab.com/images/15_4/create-code-review-suggested-reviewers.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: 2022-09-22 # YYYY-MM-DD + release: 15.4 # XX.Y +- name: "Improved CI/CD integration in VS Code" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. When you're constructing complicated GitLab CI configurations that may contain `include:` or `extends:` keywords, it's challenging to ensure the configuration is valid and the resulting file has your expected configuration. Use [GitLab Workflow](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow) for Visual Studio Code to preview your merged GitLab CI/CD configuration file directly in VS Code. You can view your changes locally, and ensure your configuration is as you expect, before you commit and push. @@ -21,28 +21,28 @@ * Download artifacts: [commit `f4d027c`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/commit/f4d027c616c884bef9fc42e5f20dfac43b811134), [merge request `!635`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/merge_requests/635) * Retry or cancel an existing pipeline: [commit `c2caee4`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/commit/c2caee40cfcbfb5d13cc790f9a2d1cfcf6c6a7ab), [merge request `!637`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/merge_requests/637) - stage: create # String value of the stage that the feature was created in. e.g., Growth - self-managed: true # Boolean value (true or false) - gitlab-com: false # Boolean value (true or false) - available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] - documentation_link: 'https://gitlab.com/gitlab-org/gitlab-vscode-extension#show-merged-gitlab-cicd-configuration' # This is the documentation URL, but can be a URL to a video if there is one - image_url: https://about.gitlab.com/images/15_4/create-vs-code-cicd-improvements.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: 2022-09-22 # YYYY-MM-DD - release: 15.4 # XX.Y -- name: "Users on verified domains can bypass email validation" # Match the release post entry + stage: create # String value of the stage that the feature was created in. e.g., Growth + self-managed: true # Boolean value (true or false) + gitlab-com: false # Boolean value (true or false) + available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] + documentation_link: 'https://gitlab.com/gitlab-org/gitlab-vscode-extension#show-merged-gitlab-cicd-configuration' # This is the documentation URL, but can be a URL to a video if there is one + image_url: https://about.gitlab.com/images/15_4/create-vs-code-cicd-improvements.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: 2022-09-22 # YYYY-MM-DD + release: 15.4 # XX.Y +- name: "Users on verified domains can bypass email validation" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. New GitLab users created using SAML or SCIM that belong to a [verified domain](https://docs.gitlab.com/ee/user/project/pages/custom_domains_ssl_tls_certification/#1-add-a-custom-domain) no longer receive the GitLab account verification e-mail. This reduces account activation friction. Accounts generated through a provisioning process are already verified, so users should not have to individually verify them manually. - stage: manage # String value of the stage that the feature was created in. e.g., Growth - self-managed: false # Boolean value (true or false) - gitlab-com: true # Boolean value (true or false) - available_in: [Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] - documentation_link: 'https://docs.gitlab.com/ee/user/group/saml_sso/index.html#bypass-user-verification-with-verified-domains' # This is the documentation URL, but can be a URL to a video if there is one - image_url: https://about.gitlab.com/images/15_4/domain-verification.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: 2022-09-22 # YYYY-MM-DD - release: 15.4 # XX.Y -- name: "Sortable, filterable data-driven tables in Markdown" # Match the release post entry + stage: manage # String value of the stage that the feature was created in. e.g., Growth + self-managed: false # Boolean value (true or false) + gitlab-com: true # Boolean value (true or false) + available_in: [Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] + documentation_link: 'https://docs.gitlab.com/ee/user/group/saml_sso/index.html#bypass-user-verification-with-verified-domains' # This is the documentation URL, but can be a URL to a video if there is one + image_url: https://about.gitlab.com/images/15_4/domain-verification.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: 2022-09-22 # YYYY-MM-DD + release: 15.4 # XX.Y +- name: "Sortable, filterable data-driven tables in Markdown" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. Working with tables in Markdown can be a bit cumbersome. Not only is it difficult to figure out the correct number of pipes and empty cells, but the table output is static when you save your document. If you have to sort the table by the third column in an ascending order, you end up rewriting the whole thing. @@ -58,46 +58,46 @@ - Dynamic filtering of data using `"filter" : true` Now it's as simple as a click when you have to re-sort that 100-row table and as easy as a web search when you have to find that one issue reference lost in a sea of nearly identical URLs. - stage: create # String value of the stage that the feature was created in. e.g., Growth - self-managed: true # Boolean value (true or false) - gitlab-com: true # Boolean value (true or false) - available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] - documentation_link: 'https://docs.gitlab.com/ee/user/markdown.html#json' # This is the documentation URL, but can be a URL to a video if there is one - image_url: https://img.youtube.com/vi/12yWKw1AdKY/hqdefault.jpg # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: 2022-09-22 # YYYY-MM-DD - release: 15.4 # XX.Y -- name: "Getting started with GitLab Pages just got easier" # Match the release post entry + stage: create # String value of the stage that the feature was created in. e.g., Growth + self-managed: true # Boolean value (true or false) + gitlab-com: true # Boolean value (true or false) + available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] + documentation_link: 'https://docs.gitlab.com/ee/user/markdown.html#json' # This is the documentation URL, but can be a URL to a video if there is one + image_url: https://img.youtube.com/vi/12yWKw1AdKY/hqdefault.jpg # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: 2022-09-22 # YYYY-MM-DD + release: 15.4 # XX.Y +- name: "Getting started with GitLab Pages just got easier" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. We've made it much easier to get started with GitLab Pages. Instead of creating configuration files by hand, build them interactively using the GitLab UI. Just answer a few basic questions on how your app is built, and we'll build the `.gitlab-ci.yml` file to get you started. This is the first time we're using our new [Pipeline Wizard](https://docs.gitlab.com/ee/development/cicd/pipeline_wizard.html), a tool that makes it easy to create `.gitlab-ci.yml` files by building them in the GitLab UI. You can look forward to more simplified onboarding helpers like this one. - stage: create # String value of the stage that the feature was created in. e.g., Growth - self-managed: true # Boolean value (true or false) - gitlab-com: true # Boolean value (true or false) - available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] - documentation_link: 'https://docs.gitlab.com/ee/user/project/pages/getting_started/pages_ui.html' # This is the documentation URL, but can be a URL to a video if there is one - image_url: https://about.gitlab.com/images/15_4/create-pages-onboarding.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: 2022-09-22 # YYYY-MM-DD - release: 15.4 # XX.Y -- name: "More powerful Linux machine types for GitLab SaaS runners" # Match the release post entry + stage: create # String value of the stage that the feature was created in. e.g., Growth + self-managed: true # Boolean value (true or false) + gitlab-com: true # Boolean value (true or false) + available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] + documentation_link: 'https://docs.gitlab.com/ee/user/project/pages/getting_started/pages_ui.html' # This is the documentation URL, but can be a URL to a video if there is one + image_url: https://about.gitlab.com/images/15_4/create-pages-onboarding.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: 2022-09-22 # YYYY-MM-DD + release: 15.4 # XX.Y +- name: "More powerful Linux machine types for GitLab SaaS runners" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. When you run jobs on GitLab SaaS Linux runners, you now have access to more powerful machine types: medium and large. With these two machine types, you have more choices for your GitLab SaaS CI/CD jobs. And with 100% job isolation on an ephemeral virtual machine, and security and autoscaling fully managed by GitLab, you can confidently run your critical CI/CD jobs on GitLab SaaS. - stage: create # String value of the stage that the feature was created in. e.g., Growth - self-managed: false # Boolean value (true or false) - gitlab-com: true # Boolean value (true or false) - available_in: [Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] - documentation_link: 'https://docs.gitlab.com/ee/ci/runners/saas/linux_saas_runner.html' # This is the documentation URL, but can be a URL to a video if there is one - image_url: https://about.gitlab.com/images/15_4/select-multiple-gitlab-saas-linux-runners.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: 2022-09-22 # YYYY-MM-DD - release: 15.4 # XX.Y -- name: "Limit the maximum number of custom domains per project" # Match the release post entry + stage: create # String value of the stage that the feature was created in. e.g., Growth + self-managed: false # Boolean value (true or false) + gitlab-com: true # Boolean value (true or false) + available_in: [Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] + documentation_link: 'https://docs.gitlab.com/ee/ci/runners/saas/linux_saas_runner.html' # This is the documentation URL, but can be a URL to a video if there is one + image_url: https://about.gitlab.com/images/15_4/select-multiple-gitlab-saas-linux-runners.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: 2022-09-22 # YYYY-MM-DD + release: 15.4 # XX.Y +- name: "Limit the maximum number of custom domains per project" # Match the release post entry description: | # Do not modify this line, instead modify the lines below. You can use GitLab Pages to define custom domains for your website. Too many custom domains, however, can result in slow response times from the Pages API and impact the overall reliability of the service. Now you can limit the maximum number of custom domains per project at the instance level and strike the right balance for your needs. The default value is `0` (unlimited). - stage: create # String value of the stage that the feature was created in. e.g., Growth - self-managed: true # Boolean value (true or false) - gitlab-com: false # Boolean value (true or false) - available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] - documentation_link: 'https://docs.gitlab.com/ee/administration/pages/#set-maximum-number-of-gitlab-pages-custom-domains-for-a-project' # This is the documentation URL, but can be a URL to a video if there is one - image_url: https://about.gitlab.com/images/15_4/create-pages-domain-limits.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg - published_at: 2022-09-22 # YYYY-MM-DD - release: 15.4 # XX.Y + stage: create # String value of the stage that the feature was created in. e.g., Growth + self-managed: true # Boolean value (true or false) + gitlab-com: false # Boolean value (true or false) + available_in: [Free, Premium, Ultimate] # Array of strings. The Array brackets are required here. e.g., [Free, Premium, Ultimate] + documentation_link: 'https://docs.gitlab.com/ee/administration/pages/#set-maximum-number-of-gitlab-pages-custom-domains-for-a-project' # This is the documentation URL, but can be a URL to a video if there is one + image_url: https://about.gitlab.com/images/15_4/create-pages-domain-limits.png # This should be a full URL, generally taken from the release post content. If a video, use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + published_at: 2022-09-22 # YYYY-MM-DD + release: 15.4 # XX.Y diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md index d79cfa297fe..8b03312f03f 100644 --- a/doc/administration/gitaly/index.md +++ b/doc/administration/gitaly/index.md @@ -219,6 +219,8 @@ The availability objectives for Gitaly clusters assuming a single node failure a second. Failover requires ten consecutive failed health checks on each Praefect node. +Improvements to RPO and RTO are proposed in epic [8903](https://gitlab.com/groups/gitlab-org/-/epics/8903). + WARNING: If complete cluster failure occurs, disaster recovery plans should be executed. These can affect the RPO and RTO discussed above. diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md index 669ba701b5b..d28972a644b 100644 --- a/doc/development/documentation/styleguide/word_list.md +++ b/doc/development/documentation/styleguide/word_list.md @@ -1028,7 +1028,11 @@ Use **setup** as a noun, and **set up** as a verb. For example: ## sign in -Use **sign in** instead of **sign on** or **log on** or **log in**. If the user interface has different words, use those. +Use **sign in** or **sign in to**. + +Do not use **sign on** or **sign into**, or **log on**, **log in**, or **log into**. + +If the user interface has different words, use those. You can use **single sign-on**. diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md index 8f85006b847..8f4855a7f93 100644 --- a/doc/user/clusters/agent/index.md +++ b/doc/user/clusters/agent/index.md @@ -76,6 +76,8 @@ Kubernetes version to a supported version at any time: GitLab aims to support a new minor Kubernetes version three months after its initial release. GitLab supports at least three production-ready Kubernetes minor versions at any given time. +When installing the agent, use a Helm version compatible with your Kubernetes version. Other versions of Helm might not work. For a list of compatible versions, see the [Helm version support policy](https://helm.sh/docs/topics/version_skew/). + Support for deprecated APIs can be removed from the GitLab codebase when we drop support for the Kubernetes version that only supports the deprecated API. Some GitLab features might work on versions not listed here. [This epic](https://gitlab.com/groups/gitlab-org/-/epics/4827) tracks support for Kubernetes versions. diff --git a/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml index 0513aae00a8..77048037915 100644 --- a/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml @@ -38,7 +38,7 @@ kics-iac-sast: when: never - if: $SAST_EXCLUDED_ANALYZERS =~ /kics/ when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline. when: never - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead. diff --git a/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml index c0ca821ebff..4600468ef30 100644 --- a/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml @@ -200,7 +200,7 @@ nodejs-scan-sast: when: never - if: $SAST_EXCLUDED_ANALYZERS =~ /nodejs-scan/ when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. exists: - '**/package.json' - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline. @@ -221,7 +221,7 @@ phpcs-security-audit-sast: when: never - if: $SAST_EXCLUDED_ANALYZERS =~ /phpcs-security-audit/ when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. exists: - '**/*.php' - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline. @@ -242,7 +242,7 @@ pmd-apex-sast: when: never - if: $SAST_EXCLUDED_ANALYZERS =~ /pmd-apex/ when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. exists: - '**/*.cls' - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline. @@ -263,7 +263,7 @@ security-code-scan-sast: when: never - if: $SAST_EXCLUDED_ANALYZERS =~ /security-code-scan/ when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. exists: - '**/*.csproj' - '**/*.vbproj' @@ -287,7 +287,7 @@ semgrep-sast: when: never - if: $SAST_EXCLUDED_ANALYZERS =~ /semgrep/ when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. exists: - '**/*.py' - '**/*.js' @@ -326,7 +326,7 @@ sobelow-sast: when: never - if: $SAST_EXCLUDED_ANALYZERS =~ /sobelow/ when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. exists: - 'mix.exs' - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline. @@ -351,7 +351,7 @@ spotbugs-sast: when: never - if: $SAST_DISABLED when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. exists: - '**/*.groovy' - '**/*.scala' diff --git a/lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml index e6eba6f6406..6603ee4268e 100644 --- a/lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml @@ -29,7 +29,7 @@ secret_detection: rules: - if: $SECRET_DETECTION_DISABLED when: never - - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. + - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Add the job to merge request pipelines if there's an open merge request. - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline. when: never - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead. diff --git a/scripts/rspec_helpers.sh b/scripts/rspec_helpers.sh index 20faa9acaa9..6033cc50e57 100644 --- a/scripts/rspec_helpers.sh +++ b/scripts/rspec_helpers.sh @@ -60,7 +60,7 @@ function update_tests_metadata() { scripts/flaky_examples/prune-old-flaky-examples "${FLAKY_RSPEC_SUITE_REPORT_PATH}" if [[ "$CI_PIPELINE_SOURCE" == "schedule" ]]; then - scripts/insert-rspec-profiling-data + PGSSLMODE=$RSPEC_PROFILING_PGSSLMODE PGSSLROOTCERT=$RSPEC_PROFILING_PGSSLROOTCERT PGSSLCERT=$RSPEC_PROFILING_PGSSLCERT PGSSLKEY=$RSPEC_PROFILING_PGSSLKEY scripts/insert-rspec-profiling-data else echo "Not inserting profiling data as the pipeline is not a scheduled one." fi diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb index a844d65157d..924262db5be 100644 --- a/spec/helpers/search_helper_spec.rb +++ b/spec/helpers/search_helper_spec.rb @@ -861,8 +861,8 @@ RSpec.describe SearchHelper do where(:feature_flag_tab_enabled, :show_elasticsearch_tabs, :project_search_tabs, :condition) do false | false | false | false true | true | true | true - true | false | false | true - false | true | false | true + true | false | false | false + false | true | false | false false | false | true | true true | false | true | true end diff --git a/spec/workers/merge_requests/delete_branch_worker_spec.rb b/spec/workers/merge_requests/delete_branch_worker_spec.rb new file mode 100644 index 00000000000..f97e7d3b0bf --- /dev/null +++ b/spec/workers/merge_requests/delete_branch_worker_spec.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe MergeRequests::DeleteBranchWorker do + let_it_be(:merge_request) { create(:merge_request) } + let_it_be(:user) { create(:user) } + + let(:branch) { merge_request.source_branch } + let(:sha) { merge_request.source_branch_sha } + let(:retarget_branch) { true } + let(:worker) { described_class.new } + + describe '#perform' do + context 'with a non-existing merge request' do + it 'does nothing' do + expect(::Branches::DeleteService).not_to receive(:new) + worker.perform(non_existing_record_id, user.id, branch, retarget_branch) + end + end + + context 'with a non-existing user' do + it 'does nothing' do + expect(::Branches::DeleteService).not_to receive(:new) + + worker.perform(merge_request.id, non_existing_record_id, branch, retarget_branch) + end + end + + context 'with existing user and merge request' do + it 'calls service to delete source branch' do + expect_next_instance_of(::Branches::DeleteService) do |instance| + expect(instance).to receive(:execute).with(branch) + end + + worker.perform(merge_request.id, user.id, branch, retarget_branch) + end + + context 'when retarget branch param is true' do + it 'calls the retarget chain service' do + expect_next_instance_of(::MergeRequests::RetargetChainService) do |instance| + expect(instance).to receive(:execute).with(merge_request) + end + + worker.perform(merge_request.id, user.id, branch, retarget_branch) + end + end + + context 'when retarget branch param is false' do + let(:retarget_branch) { false } + + it 'does not call the retarget chain service' do + expect(::MergeRequests::RetargetChainService).not_to receive(:new) + + worker.perform(merge_request.id, user.id, branch, retarget_branch) + end + end + + context 'when delete service returns an error' do + let(:service_result) { ServiceResponse.error(message: 'placeholder') } + + it 'tracks the exception' do + expect_next_instance_of(::Branches::DeleteService) do |instance| + expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) + end + + expect(service_result).to receive(:track_exception).and_call_original + + worker.perform(merge_request.id, user.id, branch, retarget_branch) + end + + context 'when track_delete_source_errors is disabled' do + before do + stub_feature_flags(track_delete_source_errors: false) + end + + it 'does not track the exception' do + expect_next_instance_of(::Branches::DeleteService) do |instance| + expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) + end + + expect(service_result).not_to receive(:track_exception) + + worker.perform(merge_request.id, user.id, branch, retarget_branch) + end + end + end + end + + it_behaves_like 'an idempotent worker' do + let(:merge_request) { create(:merge_request) } + let(:job_args) { [merge_request.id, sha, user.id, true] } + end + end +end diff --git a/spec/workers/merge_requests/delete_source_branch_worker_spec.rb b/spec/workers/merge_requests/delete_source_branch_worker_spec.rb index fe677103fd0..8dd302d81cf 100644 --- a/spec/workers/merge_requests/delete_source_branch_worker_spec.rb +++ b/spec/workers/merge_requests/delete_source_branch_worker_spec.rb @@ -10,96 +10,142 @@ RSpec.describe MergeRequests::DeleteSourceBranchWorker do let(:worker) { described_class.new } describe '#perform' do - context 'with a non-existing merge request' do - it 'does nothing' do - expect(::Branches::DeleteService).not_to receive(:new) - expect(::MergeRequests::RetargetChainService).not_to receive(:new) - - worker.perform(non_existing_record_id, sha, user.id) - end - end - - context 'with a non-existing user' do - it 'does nothing' do - expect(::Branches::DeleteService).not_to receive(:new) - expect(::MergeRequests::RetargetChainService).not_to receive(:new) - - worker.perform(merge_request.id, sha, non_existing_record_id) - end - end - - context 'with existing user and merge request' do - it 'calls service to delete source branch' do - expect_next_instance_of(::Branches::DeleteService) do |instance| - expect(instance).to receive(:execute).with(merge_request.source_branch) - end - - worker.perform(merge_request.id, sha, user.id) - end - - it 'calls service to try retarget merge requests' do - expect_next_instance_of(::MergeRequests::RetargetChainService) do |instance| - expect(instance).to receive(:execute).with(merge_request) - end - - worker.perform(merge_request.id, sha, user.id) - end - - context 'source branch sha does not match' do + context 'when the add_delete_branch_worker feature flag is enabled' do + context 'with a non-existing merge request' do it 'does nothing' do - expect(::Branches::DeleteService).not_to receive(:new) - expect(::MergeRequests::RetargetChainService).not_to receive(:new) + expect(::MergeRequests::DeleteBranchWorker).not_to receive(:perform_async) - worker.perform(merge_request.id, 'new-source-branch-sha', user.id) + worker.perform(non_existing_record_id, sha, user.id) end end - context 'when delete service returns an error' do - let(:service_result) { ServiceResponse.error(message: 'placeholder') } + context 'with a non-existing user' do + it 'does nothing' do + expect(::MergeRequests::DeleteBranchWorker).not_to receive(:perform_async) - it 'tracks the exception' do - expect_next_instance_of(::Branches::DeleteService) do |instance| - expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) - end + worker.perform(merge_request.id, sha, non_existing_record_id) + end + end - expect(service_result).to receive(:track_exception).and_call_original + context 'with existing user and merge request' do + it 'creates a new delete branch worker async' do + expect(::MergeRequests::DeleteBranchWorker).to receive(:perform_async).with(merge_request.id, user.id, + merge_request.source_branch, true) worker.perform(merge_request.id, sha, user.id) end - context 'when track_delete_source_errors is disabled' do - before do - stub_feature_flags(track_delete_source_errors: false) - end + context 'source branch sha does not match' do + it 'does nothing' do + expect(::MergeRequests::DeleteBranchWorker).not_to receive(:perform_async) - it 'does not track the exception' do - expect_next_instance_of(::Branches::DeleteService) do |instance| - expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) - end - - expect(service_result).not_to receive(:track_exception) - - worker.perform(merge_request.id, sha, user.id) + worker.perform(merge_request.id, 'new-source-branch-sha', user.id) end end + end - it 'still retargets the merge request' do + it_behaves_like 'an idempotent worker' do + let(:merge_request) { create(:merge_request) } + let(:job_args) { [merge_request.id, sha, user.id] } + end + end + + context 'when the add_delete_branch_worker feature flag is disabled' do + before do + stub_feature_flags(add_delete_branch_worker: false) + end + + context 'with a non-existing merge request' do + it 'does nothing' do + expect(::Branches::DeleteService).not_to receive(:new) + expect(::MergeRequests::RetargetChainService).not_to receive(:new) + + worker.perform(non_existing_record_id, sha, user.id) + end + end + + context 'with a non-existing user' do + it 'does nothing' do + expect(::Branches::DeleteService).not_to receive(:new) + expect(::MergeRequests::RetargetChainService).not_to receive(:new) + + worker.perform(merge_request.id, sha, non_existing_record_id) + end + end + + context 'with existing user and merge request' do + it 'calls service to delete source branch' do expect_next_instance_of(::Branches::DeleteService) do |instance| - expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) + expect(instance).to receive(:execute).with(merge_request.source_branch) end + worker.perform(merge_request.id, sha, user.id) + end + + it 'calls service to try retarget merge requests' do expect_next_instance_of(::MergeRequests::RetargetChainService) do |instance| expect(instance).to receive(:execute).with(merge_request) end worker.perform(merge_request.id, sha, user.id) end - end - end - it_behaves_like 'an idempotent worker' do - let(:merge_request) { create(:merge_request) } - let(:job_args) { [merge_request.id, sha, user.id] } + context 'source branch sha does not match' do + it 'does nothing' do + expect(::Branches::DeleteService).not_to receive(:new) + expect(::MergeRequests::RetargetChainService).not_to receive(:new) + + worker.perform(merge_request.id, 'new-source-branch-sha', user.id) + end + end + + context 'when delete service returns an error' do + let(:service_result) { ServiceResponse.error(message: 'placeholder') } + + it 'tracks the exception' do + expect_next_instance_of(::Branches::DeleteService) do |instance| + expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) + end + + expect(service_result).to receive(:track_exception).and_call_original + + worker.perform(merge_request.id, sha, user.id) + end + + context 'when track_delete_source_errors is disabled' do + before do + stub_feature_flags(track_delete_source_errors: false) + end + + it 'does not track the exception' do + expect_next_instance_of(::Branches::DeleteService) do |instance| + expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) + end + + expect(service_result).not_to receive(:track_exception) + + worker.perform(merge_request.id, sha, user.id) + end + end + + it 'still retargets the merge request' do + expect_next_instance_of(::Branches::DeleteService) do |instance| + expect(instance).to receive(:execute).with(merge_request.source_branch).and_return(service_result) + end + + expect_next_instance_of(::MergeRequests::RetargetChainService) do |instance| + expect(instance).to receive(:execute).with(merge_request) + end + + worker.perform(merge_request.id, sha, user.id) + end + end + end + + it_behaves_like 'an idempotent worker' do + let(:merge_request) { create(:merge_request) } + let(:job_args) { [merge_request.id, sha, user.id] } + end end end end