diff options
79 files changed, 590 insertions, 256 deletions
diff --git a/.gitlab/ci/cache-repo.gitlab-ci.yml b/.gitlab/ci/cache-repo.gitlab-ci.yml index 18e1ca1644d..324c8615083 100644 --- a/.gitlab/ci/cache-repo.gitlab-ci.yml +++ b/.gitlab/ci/cache-repo.gitlab-ci.yml @@ -29,6 +29,7 @@ cache-repo: - '[ -z "$CI_REPO_CACHE_CREDENTIALS" ] || gcloud auth activate-service-account --key-file=$CI_REPO_CACHE_CREDENTIALS' script: # Enable shallow repo caching only if the $ENABLE_SHALLOW_REPO_CACHING variable exists + # The `git repack` call works around a Git bug with shallow clones: https://gitlab.com/gitlab-org/git/-/issues/86 - if [ -n "$ENABLE_SHALLOW_REPO_CACHING" ]; then cd .. && rm -rf $CI_PROJECT_NAME; today=$(date +%Y-%m-%d); @@ -38,6 +39,7 @@ cache-repo: echo "Cloning $CI_REPOSITORY_URL into $CI_PROJECT_NAME with commits from $one_year_ago."; time git clone --progress --no-checkout --shallow-since=$one_year_ago $CI_REPOSITORY_URL $CI_PROJECT_NAME; cd $CI_PROJECT_NAME; + time git repack -d; echo "Archiving $CI_PROJECT_NAME into /tmp/$SHALLOW_CLONE_TAR_FILENAME."; time tar cf /tmp/$SHALLOW_CLONE_TAR_FILENAME .; echo "GZipping /tmp/$SHALLOW_CLONE_TAR_FILENAME."; diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 81e42e07b08..538237b3638 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -771df64aaf511cc3c64d7b55aee2d961941bfdab +4139a25fddd1f6b99cc80aa89bd0ebc6594f5f4a @@ -122,7 +122,7 @@ gem 'fog-local', '~> 0.6' gem 'fog-openstack', '~> 1.0' gem 'fog-rackspace', '~> 0.1.1' gem 'fog-aliyun', '~> 0.3' -gem 'gitlab-fog-azure-rm', '~> 1.0', require: false +gem 'gitlab-fog-azure-rm', '~> 1.0.1', require: false # for Google storage gem 'google-api-client', '~> 0.33' diff --git a/Gemfile.lock b/Gemfile.lock index 333c2a0fef5..1b3da5628b0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -428,7 +428,7 @@ GEM gitlab-experiment (0.4.12) activesupport (>= 3.0) scientist (~> 1.5, >= 1.5.0) - gitlab-fog-azure-rm (1.0.0) + gitlab-fog-azure-rm (1.0.1) azure-storage-blob (~> 2.0) azure-storage-common (~> 2.0) fog-core (= 2.1.0) @@ -737,7 +737,7 @@ GEM mustermann (>= 1.0.0) nap (1.1.0) nenv (0.3.0) - net-http-persistent (4.0.0) + net-http-persistent (4.0.1) connection_pool (~> 2.2) net-ldap (0.16.3) net-ntp (2.1.3) @@ -1372,7 +1372,7 @@ DEPENDENCIES github-markup (~> 1.7.0) gitlab-chronic (~> 0.10.5) gitlab-experiment (~> 0.4.12) - gitlab-fog-azure-rm (~> 1.0) + gitlab-fog-azure-rm (~> 1.0.1) gitlab-labkit (= 0.14.0) gitlab-license (~> 1.3) gitlab-mail_room (~> 0.0.8) diff --git a/app/assets/javascripts/admin/dev_ops_report/devops_adoption.js b/app/assets/javascripts/admin/dev_ops_report/devops_adoption.js deleted file mode 100644 index ae73033079d..00000000000 --- a/app/assets/javascripts/admin/dev_ops_report/devops_adoption.js +++ /dev/null @@ -1,2 +0,0 @@ -// EE-specific feature. Find the implementation in the `ee/`-folder -export default () => {}; diff --git a/app/assets/javascripts/admin/dev_ops_report/components/usage_ping_disabled.vue b/app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue index c0ad814172d..c0ad814172d 100644 --- a/app/assets/javascripts/admin/dev_ops_report/components/usage_ping_disabled.vue +++ b/app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue diff --git a/app/assets/javascripts/admin/dev_ops_report/devops_score_empty_state.js b/app/assets/javascripts/analytics/devops_report/devops_score_empty_state.js index 0cb8d9be0e4..0cb8d9be0e4 100644 --- a/app/assets/javascripts/admin/dev_ops_report/devops_score_empty_state.js +++ b/app/assets/javascripts/analytics/devops_report/devops_score_empty_state.js diff --git a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue b/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue index 104d6672015..ecb39f214ec 100644 --- a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue +++ b/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue @@ -20,7 +20,7 @@ export default { }, data() { return { - searchTerm: this.value || '', + searchTerm: '', }; }, computed: { @@ -38,11 +38,6 @@ export default { ); }, }, - watch: { - value(newVal) { - this.searchTerm = newVal; - }, - }, methods: { selectEnvironment(selected) { this.$emit('selectEnvironment', selected); @@ -55,11 +50,14 @@ export default { isSelected(env) { return this.value === env; }, + clearSearch() { + this.searchTerm = ''; + }, }, }; </script> <template> - <gl-dropdown :text="value"> + <gl-dropdown :text="value" @show="clearSearch"> <gl-search-box-by-type v-model.trim="searchTerm" data-testid="ci-environment-search" /> <gl-dropdown-item v-for="environment in filteredResults" diff --git a/app/assets/javascripts/pages/admin/dev_ops_report/index.js b/app/assets/javascripts/pages/admin/dev_ops_report/index.js index 220fc049562..cf06ee2c22a 100644 --- a/app/assets/javascripts/pages/admin/dev_ops_report/index.js +++ b/app/assets/javascripts/pages/admin/dev_ops_report/index.js @@ -1,5 +1,3 @@ -import initDevopAdoption from 'ee_else_ce/admin/dev_ops_report/devops_adoption'; -import initDevOpsScoreEmptyState from '~/admin/dev_ops_report/devops_score_empty_state'; +import initDevOpsScoreEmptyState from '~/analytics/devops_report/devops_score_empty_state'; initDevOpsScoreEmptyState(); -initDevopAdoption(); diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb index d021ae5ce9e..449286915f2 100644 --- a/app/graphql/types/merge_request_type.rb +++ b/app/graphql/types/merge_request_type.rb @@ -54,7 +54,7 @@ module Types field :target_branch, GraphQL::STRING_TYPE, null: false, description: 'Target branch of the merge request.' field :work_in_progress, GraphQL::BOOLEAN_TYPE, method: :work_in_progress?, null: false, - description: 'Indicates if the merge request is a work in progress (WIP).' + description: 'Indicates if the merge request is a draft.' field :merge_when_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true, description: 'Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).' field :diff_head_sha, GraphQL::STRING_TYPE, null: true, diff --git a/app/models/project_services/unify_circuit_service.rb b/app/models/project_services/unify_circuit_service.rb index 1e12179e62a..1a0eebe7d64 100644 --- a/app/models/project_services/unify_circuit_service.rb +++ b/app/models/project_services/unify_circuit_service.rb @@ -47,7 +47,7 @@ class UnifyCircuitService < ChatNotificationService def notify(message, opts) response = Gitlab::HTTP.post(webhook, body: { subject: message.project_name, - text: message.pretext, + text: message.summary, markdown: true }.to_json) diff --git a/app/models/project_services/webex_teams_service.rb b/app/models/project_services/webex_teams_service.rb index 1d791b19486..4e8281f4e81 100644 --- a/app/models/project_services/webex_teams_service.rb +++ b/app/models/project_services/webex_teams_service.rb @@ -46,7 +46,7 @@ class WebexTeamsService < ChatNotificationService def notify(message, opts) header = { 'Content-Type' => 'application/json' } - response = Gitlab::HTTP.post(webhook, headers: header, body: { markdown: message.pretext }.to_json) + response = Gitlab::HTTP.post(webhook, headers: header, body: { markdown: message.summary }.to_json) response if response.success? end diff --git a/app/models/snippet.rb b/app/models/snippet.rb index b68e166af48..8edf31bd661 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -45,7 +45,7 @@ class Snippet < ApplicationRecord has_many :notes, as: :noteable, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :user_mentions, class_name: "SnippetUserMention", dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent has_one :snippet_repository, inverse_of: :snippet - has_many :repository_storage_moves, class_name: 'SnippetRepositoryStorageMove', inverse_of: :container + has_many :repository_storage_moves, class_name: 'Snippets::RepositoryStorageMove', inverse_of: :container # We need to add the `dependent` in order to call the after_destroy callback has_one :statistics, class_name: 'SnippetStatistics', dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent diff --git a/app/models/snippet_repository_storage_move.rb b/app/models/snippet_repository_storage_move.rb index bb157c08995..8234905a7e1 100644 --- a/app/models/snippet_repository_storage_move.rb +++ b/app/models/snippet_repository_storage_move.rb @@ -1,28 +1,13 @@ # frozen_string_literal: true -# SnippetRepositoryStorageMove are details of repository storage moves for a -# snippet. For example, moving a snippet to another gitaly node to help -# balance storage capacity. -class SnippetRepositoryStorageMove < ApplicationRecord - extend ::Gitlab::Utils::Override - include RepositoryStorageMovable - - belongs_to :container, class_name: 'Snippet', inverse_of: :repository_storage_moves, foreign_key: :snippet_id - alias_attribute :snippet, :container - - override :schedule_repository_storage_update_worker - def schedule_repository_storage_update_worker - SnippetUpdateRepositoryStorageWorker.perform_async( - snippet_id, - destination_storage_name, - id - ) - end - - private - - override :error_key - def error_key - :snippet - end +# This is a compatibility class to avoid calling a non-existent +# class from sidekiq during deployment. +# +# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853. +# we cannot remove this class entirely because there can be jobs +# referencing it. +# +# We can get rid of this class in 14.0 +# https://gitlab.com/gitlab-org/gitlab/-/issues/322393 +class SnippetRepositoryStorageMove < Snippets::RepositoryStorageMove end diff --git a/app/models/snippets/repository_storage_move.rb b/app/models/snippets/repository_storage_move.rb new file mode 100644 index 00000000000..3d6e1b0ccea --- /dev/null +++ b/app/models/snippets/repository_storage_move.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +# Snippets::RepositoryStorageMove are details of repository storage moves for a +# snippet. For example, moving a snippet to another gitaly node to help +# balance storage capacity. +module Snippets + class RepositoryStorageMove < ApplicationRecord + extend ::Gitlab::Utils::Override + include RepositoryStorageMovable + + self.table_name = 'snippet_repository_storage_moves' + + belongs_to :container, class_name: 'Snippet', inverse_of: :repository_storage_moves, foreign_key: :snippet_id + alias_attribute :snippet, :container + + override :schedule_repository_storage_update_worker + def schedule_repository_storage_update_worker + Snippets::UpdateRepositoryStorageWorker.perform_async( + snippet_id, + destination_storage_name, + id + ) + end + + private + + override :error_key + def error_key + :snippet + end + end +end diff --git a/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb b/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb index f7bdd0a99a5..09eac8e6cda 100644 --- a/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb +++ b/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb @@ -25,7 +25,7 @@ module Snippets override :schedule_bulk_worker_klass def self.schedule_bulk_worker_klass - ::SnippetScheduleBulkRepositoryShardMovesWorker + ::Snippets::ScheduleBulkRepositoryShardMovesWorker end end end diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index 70f884ed7ee..3b455b972f9 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -2204,6 +2204,22 @@ :weight: 1 :idempotent: true :tags: [] +- :name: snippets_schedule_bulk_repository_shard_moves + :feature_category: :gitaly + :has_external_dependencies: + :urgency: :throttled + :resource_boundary: :unknown + :weight: 1 + :idempotent: true + :tags: [] +- :name: snippets_update_repository_storage + :feature_category: :gitaly + :has_external_dependencies: + :urgency: :throttled + :resource_boundary: :unknown + :weight: 1 + :idempotent: true + :tags: [] - :name: system_hook_push :feature_category: :source_code_management :has_external_dependencies: diff --git a/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb b/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb index 47f24ad3500..94a6b22538b 100644 --- a/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb +++ b/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb @@ -1,13 +1,16 @@ # frozen_string_literal: true -class SnippetScheduleBulkRepositoryShardMovesWorker - include ApplicationWorker - +# This is a compatibility class to avoid calling a non-existent +# class from sidekiq during deployment. +# +# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853. +# we cannot remove this class entirely because there can be jobs +# referencing it. +# +# We can get rid of this class in 14.0 +# https://gitlab.com/gitlab-org/gitlab/-/issues/322393 +class SnippetScheduleBulkRepositoryShardMovesWorker < Snippets::ScheduleBulkRepositoryShardMovesWorker idempotent! feature_category :gitaly urgency :throttled - - def perform(source_storage_name, destination_storage_name = nil) - Snippets::ScheduleBulkRepositoryShardMovesService.new.execute(source_storage_name, destination_storage_name) - end end diff --git a/app/workers/snippet_update_repository_storage_worker.rb b/app/workers/snippet_update_repository_storage_worker.rb index a28a02a0298..befae6db4f4 100644 --- a/app/workers/snippet_update_repository_storage_worker.rb +++ b/app/workers/snippet_update_repository_storage_worker.rb @@ -1,23 +1,15 @@ # frozen_string_literal: true -class SnippetUpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker - extend ::Gitlab::Utils::Override - include UpdateRepositoryStorageWorker - - private - - override :find_repository_storage_move - def find_repository_storage_move(repository_storage_move_id) - SnippetRepositoryStorageMove.find(repository_storage_move_id) - end - - override :find_container - def find_container(container_id) - Snippet.find(container_id) - end - - override :update_repository_storage - def update_repository_storage(repository_storage_move) - ::Snippets::UpdateRepositoryStorageService.new(repository_storage_move).execute - end +# This is a compatibility class to avoid calling a non-existent +# class from sidekiq during deployment. +# +# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853. +# we cannot remove this class entirely because there can be jobs +# referencing it. +# +# We can get rid of this class in 14.0 +# https://gitlab.com/gitlab-org/gitlab/-/issues/322393 +class SnippetUpdateRepositoryStorageWorker < Snippets::UpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker + idempotent! + urgency :throttled end diff --git a/app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb b/app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb new file mode 100644 index 00000000000..ec3d9dbdf97 --- /dev/null +++ b/app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Snippets + class ScheduleBulkRepositoryShardMovesWorker + include ApplicationWorker + + idempotent! + feature_category :gitaly + urgency :throttled + + def perform(source_storage_name, destination_storage_name = nil) + Snippets::ScheduleBulkRepositoryShardMovesService.new.execute(source_storage_name, destination_storage_name) + end + end +end diff --git a/app/workers/snippets/update_repository_storage_worker.rb b/app/workers/snippets/update_repository_storage_worker.rb new file mode 100644 index 00000000000..83b655e9986 --- /dev/null +++ b/app/workers/snippets/update_repository_storage_worker.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Snippets + class UpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker + extend ::Gitlab::Utils::Override + include ::UpdateRepositoryStorageWorker + + private + + override :find_repository_storage_move + def find_repository_storage_move(repository_storage_move_id) + Snippets::RepositoryStorageMove.find(repository_storage_move_id) + end + + override :find_container + def find_container(container_id) + Snippet.find(container_id) + end + + override :update_repository_storage + def update_repository_storage(repository_storage_move) + ::Snippets::UpdateRepositoryStorageService.new(repository_storage_move).execute + end + end +end diff --git a/changelogs/unreleased/255913-webex-teams-pipeline-notifications.yml b/changelogs/unreleased/255913-webex-teams-pipeline-notifications.yml new file mode 100644 index 00000000000..90468f7448b --- /dev/null +++ b/changelogs/unreleased/255913-webex-teams-pipeline-notifications.yml @@ -0,0 +1,5 @@ +--- +title: Fix pipeline notifications for Webex Teams / Unify Circuit integrations +merge_request: 54852 +author: +type: fixed diff --git a/changelogs/unreleased/fix-iteration-migr.yml b/changelogs/unreleased/fix-iteration-migr.yml new file mode 100644 index 00000000000..0f74cb695a0 --- /dev/null +++ b/changelogs/unreleased/fix-iteration-migr.yml @@ -0,0 +1,5 @@ +--- +title: Fix setting default cadences migration +merge_request: 54598 +author: +type: other diff --git a/changelogs/unreleased/preload-environments-for-ci-cd-variables.yml b/changelogs/unreleased/preload-environments-for-ci-cd-variables.yml new file mode 100644 index 00000000000..1c0b4938420 --- /dev/null +++ b/changelogs/unreleased/preload-environments-for-ci-cd-variables.yml @@ -0,0 +1,5 @@ +--- +title: Clear Environment Search in CI/CD Variables +merge_request: 54626 +author: +type: changed diff --git a/changelogs/unreleased/sh-azure-blob-utf8-fix.yml b/changelogs/unreleased/sh-azure-blob-utf8-fix.yml new file mode 100644 index 00000000000..6bcee9d4aa2 --- /dev/null +++ b/changelogs/unreleased/sh-azure-blob-utf8-fix.yml @@ -0,0 +1,5 @@ +--- +title: Fix UTF-8 characters not working with Azure Blob storage +merge_request: 54875 +author: +type: fixed diff --git a/config/feature_flags/development/ci_rules_variables.yml b/config/feature_flags/development/ci_rules_variables.yml deleted file mode 100644 index 8ea2e21af14..00000000000 --- a/config/feature_flags/development/ci_rules_variables.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: ci_rules_variables -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48752 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/289803 -milestone: '13.7' -type: development -group: group::pipeline authoring -default_enabled: true diff --git a/config/feature_flags/development/security_on_demand_scans_site_validation.yml b/config/feature_flags/development/security_on_demand_scans_site_validation.yml deleted file mode 100644 index bfe02a0bad7..00000000000 --- a/config/feature_flags/development/security_on_demand_scans_site_validation.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: security_on_demand_scans_site_validation -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40685 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/241815 -milestone: '13.4' -type: development -group: group::dynamic analysis -default_enabled: true diff --git a/config/routes.rb b/config/routes.rb index 90a26c0a20f..d9cf2e9ebdd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -50,6 +50,7 @@ Rails.application.routes.draw do resource :welcome, only: [:show, :update], controller: 'welcome' do Gitlab.ee do get :trial_getting_started, on: :collection + get :trial_onboarding_board, on: :collection end end diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml index e74f27a9012..76eabcaac84 100644 --- a/config/sidekiq_queues.yml +++ b/config/sidekiq_queues.yml @@ -346,6 +346,10 @@ - 1 - - snippet_update_repository_storage - 1 +- - snippets_schedule_bulk_repository_shard_moves + - 1 +- - snippets_update_repository_storage + - 1 - - status_page_publish - 1 - - sync_seat_link_request diff --git a/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb b/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb index 2de47915a2f..32645430e19 100644 --- a/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb +++ b/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb @@ -17,11 +17,7 @@ class ScheduleSetDefaultIterationCadences < ActiveRecord::Migration[6.0] disable_ddl_transaction! def up - Iteration.select(:group_id).distinct.each_batch(of: BATCH_SIZE, column: :group_id) do |batch, index| - group_ids = batch.pluck(:group_id) - - migrate_in(index * DELAY_INTERVAL, MIGRATION_CLASS, group_ids) - end + # Do nothing, rescheduling migration: 20210219102900_reschedule_set_default_iteration_cadences.rb end def down diff --git a/db/post_migrate/20210219102900_reschedule_set_default_iteration_cadences.rb b/db/post_migrate/20210219102900_reschedule_set_default_iteration_cadences.rb new file mode 100644 index 00000000000..6c7b46737aa --- /dev/null +++ b/db/post_migrate/20210219102900_reschedule_set_default_iteration_cadences.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class RescheduleSetDefaultIterationCadences < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + BATCH_SIZE = 1_000 + DELAY_INTERVAL = 2.minutes.to_i + MIGRATION_CLASS = 'SetDefaultIterationCadences' + + class Iteration < ActiveRecord::Base # rubocop:disable Style/Documentation + include EachBatch + + self.table_name = 'sprints' + end + + disable_ddl_transaction! + + def up + Iteration.select(:group_id).distinct.each_batch(of: BATCH_SIZE, column: :group_id) do |batch, index| + group_ids = batch.pluck(:group_id) + + migrate_in(index * DELAY_INTERVAL, MIGRATION_CLASS, group_ids) + end + end + + def down + # Not needed + end +end diff --git a/db/schema_migrations/20210219102900 b/db/schema_migrations/20210219102900 new file mode 100644 index 00000000000..b0a730c4361 --- /dev/null +++ b/db/schema_migrations/20210219102900 @@ -0,0 +1 @@ +42e06332b279aaac7044243df0a8bd5525025db7d8c22bc474c0874e85f525f5
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index fe14f23af3a..0ce27a5ca70 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -9398,8 +9398,8 @@ CREATE TABLE application_settings ( keep_latest_artifact boolean DEFAULT true NOT NULL, notes_create_limit integer DEFAULT 300 NOT NULL, notes_create_limit_allowlist text[] DEFAULT '{}'::text[] NOT NULL, - in_product_marketing_emails_enabled boolean DEFAULT true NOT NULL, kroki_formats jsonb DEFAULT '{}'::jsonb NOT NULL, + in_product_marketing_emails_enabled 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/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 385a2ea0e29..a13f6d19b97 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -2675,7 +2675,7 @@ Autogenerated return type of MarkAsSpamSnippet. | `userNotesCount` | Int | User notes count of the merge request. | | `userPermissions` | MergeRequestPermissions! | Permissions for the current user on the resource | | `webUrl` | String | Web URL of the merge request. | -| `workInProgress` | Boolean! | Indicates if the merge request is a work in progress (WIP). | +| `workInProgress` | Boolean! | Indicates if the merge request is a draft. | ### MergeRequestCreatePayload @@ -3227,7 +3227,7 @@ Represents vulnerability finding of a security report on the pipeline. | `dastScannerProfiles` | DastScannerProfileConnection | The DAST scanner profiles associated with the project. | | `dastSiteProfile` | DastSiteProfile | DAST Site Profile associated with the project. | | `dastSiteProfiles` | DastSiteProfileConnection | DAST Site Profiles associated with the project. | -| `dastSiteValidations` | DastSiteValidationConnection | DAST Site Validations associated with the project. Always returns no nodes if `security_on_demand_scans_site_validation` is disabled. | +| `dastSiteValidations` | DastSiteValidationConnection | DAST Site Validations associated with the project. | | `description` | String | Short description of the project. | | `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` | | `environment` | Environment | A single environment of the project. | diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md index 7fec630b3eb..b3647131ec8 100644 --- a/doc/api/merge_requests.md +++ b/doc/api/merge_requests.md @@ -101,7 +101,7 @@ Parameters: | `target_branch` | string | no | Return merge requests with the given target branch. | | `search` | string | no | Search merge requests against their `title` and `description`. | | `in` | string | no | Modify the scope of the `search` attribute. `title`, `description`, or a string joining them with comma. Default is `title,description`. | -| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* WIP merge requests, `no` to return *non* WIP merge requests. | +| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* draft merge requests, `no` to return *non-draft* merge requests. | | `not` | Hash | no | Return merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. | | `environment` | string | no | Returns merge requests deployed to the given environment. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) | | `deployed_before` | datetime | no | Return merge requests deployed before the given date/time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) | @@ -287,7 +287,7 @@ Parameters: | `source_branch` | string | no | Return merge requests with the given source branch. | | `target_branch` | string | no | Return merge requests with the given target branch. | | `search` | string | no | Search merge requests against their `title` and `description`. | -| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* WIP merge requests, `no` to return *non* WIP merge requests. | +| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* draft merge requests, `no` to return *non-draft* merge requests. | | `not` | Hash | no | Return merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. | ```json diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index 4f4d86d256c..16a27d165e5 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -1436,14 +1436,7 @@ In this example, if the first rule matches, then the job has `when: manual` and #### `rules:variables` > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/209864) in GitLab 13.7. -> - It was [deployed behind a feature flag](../../user/feature_flags.md), disabled by default. -> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) on GitLab 13.8. -> - It's enabled on GitLab.com. -> - It's recommended for production use. -> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-rulesvariables). **(FREE SELF)** - -WARNING: -This feature might not be available to you. Check the **version history** note above for details. +> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) in GitLab 13.10. You can use [`variables`](#variables) in `rules:` to define variables for specific conditions. @@ -1465,25 +1458,6 @@ job: - echo "Run another script if $IS_A_FEATURE exists" ``` -##### Enable or disable rules:variables **(FREE SELF)** - -rules:variables is under development but ready for production use. -It is deployed behind a feature flag that is **enabled by default**. -[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) -can opt to disable it. - -To enable it: - -```ruby -Feature.enable(:ci_rules_variables) -``` - -To disable it: - -```ruby -Feature.disable(:ci_rules_variables) -``` - #### Complex rule clauses To conjoin `if`, `changes`, and `exists` clauses with an `AND`, use them in the diff --git a/doc/development/contributing/style_guides.md b/doc/development/contributing/style_guides.md index c2ef6c4e200..aad24663118 100644 --- a/doc/development/contributing/style_guides.md +++ b/doc/development/contributing/style_guides.md @@ -146,7 +146,7 @@ One way to generate the initial list is to run the `todo` auto generation, with `exclude limit` set to a high number. ```shell -bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit=10000 +bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit=100000 ``` You can then move the list from the freshly generated `.rubocop_todo.yml` for the Cop being actively diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md index 13bb39a4a6c..98b386497df 100644 --- a/doc/development/rake_tasks.md +++ b/doc/development/rake_tasks.md @@ -340,3 +340,7 @@ bundle exec rake gitlab:graphql:schema:dump ``` This uses GraphQL Ruby's built-in Rake tasks to generate files in both [IDL](https://www.prisma.io/blog/graphql-sdl-schema-definition-language-6755bcb9ce51) and JSON formats. + +### Update documentation and schema definitions + +The following command combines the intent of [Update GraphQL documentation and schema definitions](#update-graphql-documentation-and-schema-definitions) and [Update machine-readable schema files](#update-machine-readable-schema-files): diff --git a/lib/api/entities/snippets/repository_storage_move.rb b/lib/api/entities/snippets/repository_storage_move.rb new file mode 100644 index 00000000000..4e14d1dfba2 --- /dev/null +++ b/lib/api/entities/snippets/repository_storage_move.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module API + module Entities + module Snippets + class RepositoryStorageMove < BasicRepositoryStorageMove + expose :snippet, using: Entities::BasicSnippet + end + end + end +end diff --git a/lib/api/snippet_repository_storage_moves.rb b/lib/api/snippet_repository_storage_moves.rb index 84dbc03ba33..e3034191641 100644 --- a/lib/api/snippet_repository_storage_moves.rb +++ b/lib/api/snippet_repository_storage_moves.rb @@ -11,28 +11,28 @@ module API resource :snippet_repository_storage_moves do desc 'Get a list of all snippet repository storage moves' do detail 'This feature was introduced in GitLab 13.8.' - success Entities::SnippetRepositoryStorageMove + success Entities::Snippets::RepositoryStorageMove end params do use :pagination end get do - storage_moves = SnippetRepositoryStorageMove.order_created_at_desc + storage_moves = ::Snippets::RepositoryStorageMove.order_created_at_desc - present paginate(storage_moves), with: Entities::SnippetRepositoryStorageMove, current_user: current_user + present paginate(storage_moves), with: Entities::Snippets::RepositoryStorageMove, current_user: current_user end desc 'Get a snippet repository storage move' do detail 'This feature was introduced in GitLab 13.8.' - success Entities::SnippetRepositoryStorageMove + success Entities::Snippets::RepositoryStorageMove end params do requires :repository_storage_move_id, type: Integer, desc: 'The ID of a snippet repository storage move' end get ':repository_storage_move_id' do - storage_move = SnippetRepositoryStorageMove.find(params[:repository_storage_move_id]) + storage_move = ::Snippets::RepositoryStorageMove.find(params[:repository_storage_move_id]) - present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user + present storage_move, with: Entities::Snippets::RepositoryStorageMove, current_user: current_user end desc 'Schedule bulk snippet repository storage moves' do @@ -68,7 +68,7 @@ module API desc 'Get a list of all snippets repository storage moves' do detail 'This feature was introduced in GitLab 13.8.' - success Entities::SnippetRepositoryStorageMove + success Entities::Snippets::RepositoryStorageMove end params do use :pagination @@ -76,12 +76,12 @@ module API get ':id/repository_storage_moves' do storage_moves = user_snippet.repository_storage_moves.order_created_at_desc - present paginate(storage_moves), with: Entities::SnippetRepositoryStorageMove, current_user: current_user + present paginate(storage_moves), with: Entities::Snippets::RepositoryStorageMove, current_user: current_user end desc 'Get a snippet repository storage move' do detail 'This feature was introduced in GitLab 13.8.' - success Entities::SnippetRepositoryStorageMove + success Entities::Snippets::RepositoryStorageMove end params do requires :repository_storage_move_id, type: Integer, desc: 'The ID of a snippet repository storage move' @@ -89,12 +89,12 @@ module API get ':id/repository_storage_moves/:repository_storage_move_id' do storage_move = user_snippet.repository_storage_moves.find(params[:repository_storage_move_id]) - present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user + present storage_move, with: Entities::Snippets::RepositoryStorageMove, current_user: current_user end desc 'Schedule a snippet repository storage move' do detail 'This feature was introduced in GitLab 13.8.' - success Entities::SnippetRepositoryStorageMove + success Entities::Snippets::RepositoryStorageMove end params do optional :destination_storage_name, type: String, desc: 'The destination storage shard' @@ -105,7 +105,7 @@ module API ) if storage_move.schedule - present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user + present storage_move, with: Entities::Snippets::RepositoryStorageMove, current_user: current_user else render_validation_error!(storage_move) end diff --git a/lib/banzai/filter/sanitization_filter.rb b/lib/banzai/filter/sanitization_filter.rb index f6314040f28..366e57c6b32 100644 --- a/lib/banzai/filter/sanitization_filter.rb +++ b/lib/banzai/filter/sanitization_filter.rb @@ -12,8 +12,8 @@ module Banzai def customize_allowlist(allowlist) # Allow table alignment; we allow specific text-align values in a # transformer below - allowlist[:attributes]['th'] = %w(style) - allowlist[:attributes]['td'] = %w(style) + allowlist[:attributes]['th'] = %w[style] + allowlist[:attributes]['td'] = %w[style] allowlist[:css] = { properties: ['text-align'] } # Allow the 'data-sourcepos' from CommonMark on all elements @@ -25,7 +25,7 @@ module Banzai # Allow `id` in a and li elements for footnotes # and remove any `id` properties not matching for footnotes allowlist[:attributes]['a'].push('id') - allowlist[:attributes]['li'] = %w(id) + allowlist[:attributes]['li'] = %w[id] allowlist[:transformers].push(self.class.remove_non_footnote_ids) allowlist diff --git a/lib/gitlab/background_migration/set_default_iteration_cadences.rb b/lib/gitlab/background_migration/set_default_iteration_cadences.rb index 530608144aa..42f9d33ab71 100644 --- a/lib/gitlab/background_migration/set_default_iteration_cadences.rb +++ b/lib/gitlab/background_migration/set_default_iteration_cadences.rb @@ -16,6 +16,8 @@ module Gitlab class Group < ApplicationRecord self.table_name = 'namespaces' + + self.inheritance_column = :_type_disabled end def perform(*group_ids) @@ -27,6 +29,7 @@ module Gitlab def create_iterations_cadences(group_ids) groups_with_cadence = IterationCadence.select(:group_id) + new_cadences = Group.where(id: group_ids).where.not(id: groups_with_cadence).map do |group| last_iteration = Iteration.where(group_id: group.id).order(:start_date)&.last @@ -44,7 +47,7 @@ module Gitlab ) end - IterationCadence.bulk_insert!(new_cadences.compact) + IterationCadence.bulk_insert!(new_cadences.compact, skip_duplicates: true) end def assign_iterations_cadences(group_ids) diff --git a/lib/gitlab/ci/features.rb b/lib/gitlab/ci/features.rb index d1a366125ef..ee495226b86 100644 --- a/lib/gitlab/ci/features.rb +++ b/lib/gitlab/ci/features.rb @@ -59,10 +59,6 @@ module Gitlab ::Feature.enabled?(:ci_pipeline_editor_page, project, default_enabled: :yaml) end - def self.rules_variables_enabled?(project) - ::Feature.enabled?(:ci_rules_variables, project, default_enabled: true) - end - def self.validate_build_dependencies?(project) ::Feature.enabled?(:ci_validate_build_dependencies, project, default_enabled: :yaml) && ::Feature.disabled?(:ci_validate_build_dependencies_override, project) diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb index 3770bb4b328..c089eed2ea2 100644 --- a/lib/gitlab/ci/pipeline/seed/build.rb +++ b/lib/gitlab/ci/pipeline/seed/build.rb @@ -169,15 +169,11 @@ module Gitlab strong_memoize(:rules_attributes) do next {} unless @using_rules - if ::Gitlab::Ci::Features.rules_variables_enabled?(@pipeline.project) - rules_variables_result = ::Gitlab::Ci::Variables::Helpers.merge_variables( - @seed_attributes[:yaml_variables], rules_result.variables - ) + rules_variables_result = ::Gitlab::Ci::Variables::Helpers.merge_variables( + @seed_attributes[:yaml_variables], rules_result.variables + ) - rules_result.build_attributes.merge(yaml_variables: rules_variables_result) - else - rules_result.build_attributes - end + rules_result.build_attributes.merge(yaml_variables: rules_variables_result) end end diff --git a/lib/tasks/gitlab/graphql.rake b/lib/tasks/gitlab/graphql.rake index caf5879a154..77377a7e0fd 100644 --- a/lib/tasks/gitlab/graphql.rake +++ b/lib/tasks/gitlab/graphql.rake @@ -130,6 +130,9 @@ namespace :gitlab do abort end end + + desc 'GitLab | GraphQL | Update GraphQL docs and schema' + task update_all: [:compile_docs, 'schema:dump'] end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index dc03e3b54fe..f0090b824cf 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -4227,12 +4227,6 @@ msgstr[1] "" msgid "Attaching the file failed." msgstr "" -msgid "Attachment" -msgstr "" - -msgid "Attachments" -msgstr "" - msgid "Audit Events" msgstr "" diff --git a/qa/Dockerfile b/qa/Dockerfile index 76c81d03071..dda882dc5e6 100644 --- a/qa/Dockerfile +++ b/qa/Dockerfile @@ -38,6 +38,14 @@ RUN unzip chromedriver_linux64.zip -d /usr/local/bin RUN rm -f chromedriver_linux64.zip ## +# Install root certificate +# +RUN mkdir -p /usr/share/ca-certificates/gitlab +ADD ./qa/tls_certificates/authority/ca.crt /usr/share/ca-certificates/gitlab/ +RUN echo 'gitlab/ca.crt' >> /etc/ca-certificates.conf +RUN chmod -R 644 /usr/share/ca-certificates/gitlab && update-ca-certificates + +## # Install gcloud and kubectl CLI used in Auto DevOps test to create K8s # clusters # diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb index 728df77a266..f858b82e70f 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb @@ -5,6 +5,7 @@ module QA describe 'Add project member' do before do Runtime::Feature.enable('vue_project_members_list') + Runtime::Feature.enable(:invite_members_group_modal) end after do Runtime::Feature.disable('vue_project_members_list') @@ -19,8 +20,6 @@ module QA project.name = 'add-member-project' end - Runtime::Feature.enable(:invite_members_group_modal) - project.visit! Page::Project::Menu.perform(&:click_members) diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb index 600ce36d1e4..714c4a2da67 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb @@ -2,7 +2,8 @@ module QA RSpec.describe 'Manage' do - describe 'Repository tags' do + # TODO: Remove :requires_admin meta when the `Runtime::Feature.enable` method call is removed + describe 'Repository tags', :requires_admin do let(:project) do Resource::Project.fabricate_via_api! do |project| project.name = 'project-for-tags' diff --git a/qa/tls_certificates/authority/ca.crt b/qa/tls_certificates/authority/ca.crt new file mode 100644 index 00000000000..8812d718ede --- /dev/null +++ b/qa/tls_certificates/authority/ca.crt @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFizCCA3OgAwIBAgIUJBX+SiNuqUYjf33EuMObynTcKx0wDQYJKoZIhvcNAQEL +BQAwVTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM +DVNhbiBGcmFuY2lzY28xGTAXBgNVBAoMEEdpdExhYiBBdXRob3JpdHkwHhcNMjEw +MjExMDYyMTUzWhcNMzEwMjA5MDYyMTUzWjBVMQswCQYDVQQGEwJVUzETMBEGA1UE +CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQ +R2l0TGFiIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALxpL/dfJwhIWGYK93ovIVj+gqvJI58Sga7eWlp2LpuFQZETjJBA79R0gcwr42ph +ch1BuxoxkYizM8sqIyFa5aW8SCWmO+IQzedKWZv+UWZg6pG+Fzyp6GO1wmXZdeXw +xRiXp2qV+rqA8DaL2g1c2u6TB/mcfNTrfsSP3045yQW+4mdNx/g4wBf0dMpHe5DJ +5jIvowa2O0kesq1UQ1eM9IMNSwW8fMQenV+F41LWE1NO726ksglih9TQjAIrlX6I +XVmw0lgYegt2G+YQJ68nf2UmvK+C0KqzTZgqmzNMQnuSiJXMnlZvlgdLXTyTWCuq +tyxp3+Z2Wshk/Cghic2MCm2XwWBIqYGu+20qoPM61c3Rk5++2VOcajD1yCYxVtM2 +akVP/e9arlCdi/CtJh3qvOlj9Uhs6a1UR/ZngpPLOa3r4JazZc04pK7q3ZynmoUL +oDPF9AKOikvhYKxTYsgZ65VhI3myTBjQFk9qX++z2HF9UImGblqUtckn3eIoI8n2 +wd4pO/OFeFSXpR7jMywCwXTpC8yTTbuVzHEz8H83/qtsbjtw961g4kb8Vzh1zy73 +PFiJNI7hZlP1I5dqNTOAv+GnwiSnF28i7xbdkIfmjYqwcwGhAO7rjifq8ygBH3sF +0I/6dnw4BvNlSgSJlJ1+2eH1uiaikpuOGtQAttz536dNAgMBAAGjUzBRMB0GA1Ud +DgQWBBQSNZ46Xu4rfGVIPIQJpduWHJ+AQjAfBgNVHSMEGDAWgBQSNZ46Xu4rfGVI +PIQJpduWHJ+AQjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQC1 +4REbDKF1tdYeCxpmQHXLHu7OkrgKIea6eKxf8mI+ZsJA4iNr3aiZYU5Wm+uAq3mK +x6mrQRaqoo6JNbie5Tw8fU2c71EO4t3vwB7YOsBtcV0YrMtg316UE0lk+6kL0TRD +tV7dAGCB3wXZVLPolC26/kecc258p6h4rCJ8Gi6FsIKGBisTFk3QOdLG3DQNulPF +2bZaJjs/6HqLL+QMdChUfJP3i71LdNxzwXNPbjJ3fm5f9RNeOcWo6oI2fkQArl2i +vcP/QtuqeOoJusbeL9zaF/EFlOggjkEtzFWCB05d6J7dMKYp5Lg4eMZQHPw6ycdk +Ek/XTupvBk+8UiXeHLvX6II9zww9+gm3uycPiO/CSPNw4yQBPPGW+30WznbedsuY +m79rxuq50KYvseJSPv7lw8v77ajQbRQzFi4frAFR+A1g8FArLxdpIptI9E+ekmaB +UMhCmi17mEuBtj8Hc3VrokTFtAJV6YNIk1X+Q/zLh4TaR5mm6C/82j/ZvkSm5OX7 +TfaayRWDr7AfDKeG5Amt52BmYncsPUXnOofSz5UkqpeOWr0rKn+A7f2BeUP9R2nY +6DncxYA+yOgU7RpnMBscsW6SkVIMJKFrfeZ1SbvZGRJd4L1PwfeaU+3yEG6oAfMa +CFquw23nWhjvUlnCe9BaUiEtOJ2ruGjdu2sdvXPcnw== +-----END CERTIFICATE----- diff --git a/qa/tls_certificates/authority/ca.key b/qa/tls_certificates/authority/ca.key new file mode 100644 index 00000000000..b465551e841 --- /dev/null +++ b/qa/tls_certificates/authority/ca.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/qa/tls_certificates/authority/ca.pem b/qa/tls_certificates/authority/ca.pem new file mode 100644 index 00000000000..51c2c7a20e7 --- /dev/null +++ b/qa/tls_certificates/authority/ca.pem @@ -0,0 +1,83 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFizCCA3OgAwIBAgIUJBX+SiNuqUYjf33EuMObynTcKx0wDQYJKoZIhvcNAQEL +BQAwVTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM +DVNhbiBGcmFuY2lzY28xGTAXBgNVBAoMEEdpdExhYiBBdXRob3JpdHkwHhcNMjEw +MjExMDYyMTUzWhcNMzEwMjA5MDYyMTUzWjBVMQswCQYDVQQGEwJVUzETMBEGA1UE +CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQ +R2l0TGFiIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALxpL/dfJwhIWGYK93ovIVj+gqvJI58Sga7eWlp2LpuFQZETjJBA79R0gcwr42ph +ch1BuxoxkYizM8sqIyFa5aW8SCWmO+IQzedKWZv+UWZg6pG+Fzyp6GO1wmXZdeXw +xRiXp2qV+rqA8DaL2g1c2u6TB/mcfNTrfsSP3045yQW+4mdNx/g4wBf0dMpHe5DJ +5jIvowa2O0kesq1UQ1eM9IMNSwW8fMQenV+F41LWE1NO726ksglih9TQjAIrlX6I +XVmw0lgYegt2G+YQJ68nf2UmvK+C0KqzTZgqmzNMQnuSiJXMnlZvlgdLXTyTWCuq +tyxp3+Z2Wshk/Cghic2MCm2XwWBIqYGu+20qoPM61c3Rk5++2VOcajD1yCYxVtM2 +akVP/e9arlCdi/CtJh3qvOlj9Uhs6a1UR/ZngpPLOa3r4JazZc04pK7q3ZynmoUL +oDPF9AKOikvhYKxTYsgZ65VhI3myTBjQFk9qX++z2HF9UImGblqUtckn3eIoI8n2 +wd4pO/OFeFSXpR7jMywCwXTpC8yTTbuVzHEz8H83/qtsbjtw961g4kb8Vzh1zy73 +PFiJNI7hZlP1I5dqNTOAv+GnwiSnF28i7xbdkIfmjYqwcwGhAO7rjifq8ygBH3sF +0I/6dnw4BvNlSgSJlJ1+2eH1uiaikpuOGtQAttz536dNAgMBAAGjUzBRMB0GA1Ud +DgQWBBQSNZ46Xu4rfGVIPIQJpduWHJ+AQjAfBgNVHSMEGDAWgBQSNZ46Xu4rfGVI +PIQJpduWHJ+AQjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQC1 +4REbDKF1tdYeCxpmQHXLHu7OkrgKIea6eKxf8mI+ZsJA4iNr3aiZYU5Wm+uAq3mK +x6mrQRaqoo6JNbie5Tw8fU2c71EO4t3vwB7YOsBtcV0YrMtg316UE0lk+6kL0TRD +tV7dAGCB3wXZVLPolC26/kecc258p6h4rCJ8Gi6FsIKGBisTFk3QOdLG3DQNulPF +2bZaJjs/6HqLL+QMdChUfJP3i71LdNxzwXNPbjJ3fm5f9RNeOcWo6oI2fkQArl2i +vcP/QtuqeOoJusbeL9zaF/EFlOggjkEtzFWCB05d6J7dMKYp5Lg4eMZQHPw6ycdk +Ek/XTupvBk+8UiXeHLvX6II9zww9+gm3uycPiO/CSPNw4yQBPPGW+30WznbedsuY +m79rxuq50KYvseJSPv7lw8v77ajQbRQzFi4frAFR+A1g8FArLxdpIptI9E+ekmaB +UMhCmi17mEuBtj8Hc3VrokTFtAJV6YNIk1X+Q/zLh4TaR5mm6C/82j/ZvkSm5OX7 +TfaayRWDr7AfDKeG5Amt52BmYncsPUXnOofSz5UkqpeOWr0rKn+A7f2BeUP9R2nY +6DncxYA+yOgU7RpnMBscsW6SkVIMJKFrfeZ1SbvZGRJd4L1PwfeaU+3yEG6oAfMa +CFquw23nWhjvUlnCe9BaUiEtOJ2ruGjdu2sdvXPcnw== +-----END CERTIFICATE----- diff --git a/spec/factories/snippet_repository_storage_moves.rb b/spec/factories/snippet_repository_storage_moves.rb index ed65dc5374f..dd82ec5cfcb 100644 --- a/spec/factories/snippet_repository_storage_moves.rb +++ b/spec/factories/snippet_repository_storage_moves.rb @@ -1,29 +1,29 @@ # frozen_string_literal: true FactoryBot.define do - factory :snippet_repository_storage_move, class: 'SnippetRepositoryStorageMove' do + factory :snippet_repository_storage_move, class: 'Snippets::RepositoryStorageMove' do container { association(:snippet) } source_storage_name { 'default' } trait :scheduled do - state { SnippetRepositoryStorageMove.state_machines[:state].states[:scheduled].value } + state { Snippets::RepositoryStorageMove.state_machines[:state].states[:scheduled].value } end trait :started do - state { SnippetRepositoryStorageMove.state_machines[:state].states[:started].value } + state { Snippets::RepositoryStorageMove.state_machines[:state].states[:started].value } end trait :replicated do - state { SnippetRepositoryStorageMove.state_machines[:state].states[:replicated].value } + state { Snippets::RepositoryStorageMove.state_machines[:state].states[:replicated].value } end trait :finished do - state { SnippetRepositoryStorageMove.state_machines[:state].states[:finished].value } + state { Snippets::RepositoryStorageMove.state_machines[:state].states[:finished].value } end trait :failed do - state { SnippetRepositoryStorageMove.state_machines[:state].states[:failed].value } + state { Snippets::RepositoryStorageMove.state_machines[:state].states[:failed].value } end end end diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb index d773126e00c..a4e9df604a9 100644 --- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb +++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb @@ -89,6 +89,8 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j before do page.within '.mr-widget-body' do page.click_link 'Resolve all threads in new issue', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid) + + wait_for_all_requests end end diff --git a/spec/features/project_variables_spec.rb b/spec/features/project_variables_spec.rb index a7f94f38d85..947fcf3549a 100644 --- a/spec/features/project_variables_spec.rb +++ b/spec/features/project_variables_spec.rb @@ -24,7 +24,6 @@ RSpec.describe 'Project variables', :js do find('[data-qa-selector="ci_variable_key_field"] input').set('akey') find('#ci-variable-value').set('akey_value') find('[data-testid="environment-scope"]').click - find_button('clear').click find('[data-testid="ci-environment-search"]').set('review/*') find('[data-testid="create-wildcard-button"]').click diff --git a/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js b/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js index 75c6e8e4540..5c5ea102f12 100644 --- a/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js +++ b/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js @@ -1,4 +1,4 @@ -import { GlDropdownItem, GlIcon } from '@gitlab/ui'; +import { GlDropdown, GlDropdownItem, GlIcon } from '@gitlab/ui'; import { mount, createLocalVue } from '@vue/test-utils'; import Vuex from 'vuex'; import CiEnvironmentsDropdown from '~/ci_variable_list/components/ci_environments_dropdown.vue'; @@ -10,6 +10,9 @@ describe('Ci environments dropdown', () => { let wrapper; let store; + const enterSearchTerm = (value) => + wrapper.find('[data-testid="ci-environment-search"]').setValue(value); + const createComponent = (term) => { store = new Vuex.Store({ getters: { @@ -24,11 +27,12 @@ describe('Ci environments dropdown', () => { value: term, }, }); + enterSearchTerm(term); }; - const findAllDropdownItems = () => wrapper.findAll(GlDropdownItem); - const findDropdownItemByIndex = (index) => wrapper.findAll(GlDropdownItem).at(index); - const findActiveIconByIndex = (index) => findDropdownItemByIndex(index).find(GlIcon); + const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem); + const findDropdownItemByIndex = (index) => wrapper.findAllComponents(GlDropdownItem).at(index); + const findActiveIconByIndex = (index) => findDropdownItemByIndex(index).findComponent(GlIcon); afterEach(() => { wrapper.destroy(); @@ -68,8 +72,9 @@ describe('Ci environments dropdown', () => { }); describe('Environments found', () => { - beforeEach(() => { + beforeEach(async () => { createComponent('prod'); + await wrapper.vm.$nextTick(); }); it('renders only the environment searched for', () => { @@ -84,21 +89,29 @@ describe('Ci environments dropdown', () => { }); it('should not display empty results message', () => { - expect(wrapper.find({ ref: 'noMatchingResults' }).exists()).toBe(false); + expect(wrapper.findComponent({ ref: 'noMatchingResults' }).exists()).toBe(false); }); it('should display active checkmark if active', () => { expect(findActiveIconByIndex(0).classes('gl-visibility-hidden')).toBe(false); }); + it('should clear the search term when showing the dropdown', () => { + wrapper.findComponent(GlDropdown).trigger('click'); + + expect(wrapper.find('[data-testid="ci-environment-search"]').text()).toBe(''); + }); + describe('Custom events', () => { it('should emit selectEnvironment if an environment is clicked', () => { findDropdownItemByIndex(0).vm.$emit('click'); expect(wrapper.emitted('selectEnvironment')).toEqual([['prod']]); }); - it('should emit createClicked if an environment is clicked', () => { + it('should emit createClicked if an environment is clicked', async () => { createComponent('newscope'); + + await wrapper.vm.$nextTick(); findDropdownItemByIndex(1).vm.$emit('click'); expect(wrapper.emitted('createClicked')).toEqual([['newscope']]); }); diff --git a/spec/lib/api/entities/snippet_repository_storage_move_spec.rb b/spec/lib/api/entities/snippets/repository_storage_move_spec.rb index 8086be3ffa7..a848afbcff9 100644 --- a/spec/lib/api/entities/snippet_repository_storage_move_spec.rb +++ b/spec/lib/api/entities/snippets/repository_storage_move_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe API::Entities::SnippetRepositoryStorageMove do +RSpec.describe API::Entities::Snippets::RepositoryStorageMove do describe '#as_json' do subject { entity.as_json } diff --git a/spec/lib/banzai/filter/sanitization_filter_spec.rb b/spec/lib/banzai/filter/sanitization_filter_spec.rb index bc4b60dfe60..f880fe06ce3 100644 --- a/spec/lib/banzai/filter/sanitization_filter_spec.rb +++ b/spec/lib/banzai/filter/sanitization_filter_spec.rb @@ -33,14 +33,14 @@ RSpec.describe Banzai::Filter::SanitizationFilter do end it 'sanitizes `class` attribute from all elements' do - act = %q{<pre class="code highlight white c"><code><span class="k">def</span></code></pre>} - exp = %q{<pre><code><span class="k">def</span></code></pre>} + act = %q(<pre class="code highlight white c"><code><span class="k">def</span></code></pre>) + exp = %q(<pre><code><span class="k">def</span></code></pre>) expect(filter(act).to_html).to eq exp end it 'sanitizes `class` attribute from non-highlight spans' do - act = %q{<span class="k">def</span>} - expect(filter(act).to_html).to eq %q{<span>def</span>} + act = %q(<span class="k">def</span>) + expect(filter(act).to_html).to eq %q(<span>def</span>) end it 'allows `text-align` property in `style` attribute on table elements' do @@ -82,12 +82,12 @@ RSpec.describe Banzai::Filter::SanitizationFilter do end it 'allows `span` elements' do - exp = act = %q{<span>Hello</span>} + exp = act = %q(<span>Hello</span>) expect(filter(act).to_html).to eq exp end it 'allows `abbr` elements' do - exp = act = %q{<abbr title="HyperText Markup Language">HTML</abbr>} + exp = act = %q(<abbr title="HyperText Markup Language">HTML</abbr>) expect(filter(act).to_html).to eq exp end @@ -132,7 +132,7 @@ RSpec.describe Banzai::Filter::SanitizationFilter do end it 'allows the `data-sourcepos` attribute globally' do - exp = %q{<p data-sourcepos="1:1-1:10">foo/bar.md</p>} + exp = %q(<p data-sourcepos="1:1-1:10">foo/bar.md</p>) act = filter(exp) expect(act.to_html).to eq exp @@ -140,41 +140,41 @@ RSpec.describe Banzai::Filter::SanitizationFilter do describe 'footnotes' do it 'allows correct footnote id property on links' do - exp = %q{<a href="#fn1" id="fnref1">foo/bar.md</a>} + exp = %q(<a href="#fn1" id="fnref1">foo/bar.md</a>) act = filter(exp) expect(act.to_html).to eq exp end it 'allows correct footnote id property on li element' do - exp = %q{<ol><li id="fn1">footnote</li></ol>} + exp = %q(<ol><li id="fn1">footnote</li></ol>) act = filter(exp) expect(act.to_html).to eq exp end it 'removes invalid id for footnote links' do - exp = %q{<a href="#fn1">link</a>} + exp = %q(<a href="#fn1">link</a>) %w[fnrefx test xfnref1].each do |id| - act = filter(%Q{<a href="#fn1" id="#{id}">link</a>}) + act = filter(%(<a href="#fn1" id="#{id}">link</a>)) expect(act.to_html).to eq exp end end it 'removes invalid id for footnote li' do - exp = %q{<ol><li>footnote</li></ol>} + exp = %q(<ol><li>footnote</li></ol>) %w[fnx test xfn1].each do |id| - act = filter(%Q{<ol><li id="#{id}">footnote</li></ol>}) + act = filter(%(<ol><li id="#{id}">footnote</li></ol>)) expect(act.to_html).to eq exp end end it 'allows footnotes numbered higher than 9' do - exp = %q{<a href="#fn15" id="fnref15">link</a><ol><li id="fn15">footnote</li></ol>} + exp = %q(<a href="#fn15" id="fnref15">link</a><ol><li id="fn15">footnote</li></ol>) act = filter(exp) expect(act.to_html).to eq exp diff --git a/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb b/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb index d0e51593fd4..1f1877f5d2b 100644 --- a/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb +++ b/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb @@ -17,8 +17,10 @@ RSpec.describe Gitlab::BackgroundMigration::SetDefaultIterationCadences, schema: let!(:iteration_2) { iterations.create!(group_id: group_3.id, iid: 1, title: 'Iteration 2', start_date: 10.days.ago, due_date: 8.days.ago) } let!(:iteration_3) { iterations.create!(group_id: group_3.id, iid: 1, title: 'Iteration 3', start_date: 5.days.ago, due_date: 2.days.ago) } + subject { described_class.new.perform(group_1.id, group_2.id, group_3.id, namespaces.last.id + 1) } + before do - described_class.new.perform(group_1.id, group_2.id, group_3.id, namespaces.last.id + 1) + subject end it 'creates iterations_cadence records for the requested groups' do @@ -45,6 +47,12 @@ RSpec.describe Gitlab::BackgroundMigration::SetDefaultIterationCadences, schema: expect(iteration_records.first.id).to eq(iteration_2.id) expect(iteration_records.second.id).to eq(iteration_3.id) end + + it 'does not call Group class' do + expect(::Group).not_to receive(:where) + + subject + end end context 'when an iteration cadence exists for a group' do diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb index 0efc7484699..23d52c8f106 100644 --- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb @@ -85,17 +85,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do { key: 'VAR2', value: 'var 2', public: true }, { key: 'VAR3', value: 'var 3', public: true }]) end - - context 'when FF ci_rules_variables is disabled' do - before do - stub_feature_flags(ci_rules_variables: false) - end - - it do - is_expected.to include(yaml_variables: [{ key: 'VAR1', value: 'var 1', public: true }, - { key: 'VAR2', value: 'var 2', public: true }]) - end - end end context 'with cache:key' do diff --git a/spec/lib/object_storage/direct_upload_spec.rb b/spec/lib/object_storage/direct_upload_spec.rb index 547bba5117a..12c6cbe03b3 100644 --- a/spec/lib/object_storage/direct_upload_spec.rb +++ b/spec/lib/object_storage/direct_upload_spec.rb @@ -224,6 +224,17 @@ RSpec.describe ObjectStorage::DirectUpload do expect(subject[:CustomPutHeaders]).to be_truthy expect(subject[:PutHeaders]).to eq({}) end + + context 'with an object with UTF-8 characters' do + let(:object_name) { 'tmp/uploads/テスト' } + + it 'returns an escaped path' do + expect(subject[:GetURL]).to start_with(storage_url) + + uri = Addressable::URI.parse(subject[:GetURL]) + expect(uri.path).to include("tmp/uploads/#{CGI.escape("テスト")}") + end + end end shared_examples 'a valid upload with multipart data' do diff --git a/spec/migrations/schedule_set_default_iteration_cadences_spec.rb b/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb index 9d7f1ac0dec..25c2b4efe8b 100644 --- a/spec/migrations/schedule_set_default_iteration_cadences_spec.rb +++ b/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require_migration! -RSpec.describe ScheduleSetDefaultIterationCadences do +RSpec.describe RescheduleSetDefaultIterationCadences do let(:namespaces) { table(:namespaces) } let(:iterations) { table(:sprints) } diff --git a/spec/models/project_services/discord_service_spec.rb b/spec/models/project_services/discord_service_spec.rb index d4bd08ddeb6..67e5ba79f01 100644 --- a/spec/models/project_services/discord_service_spec.rb +++ b/spec/models/project_services/discord_service_spec.rb @@ -6,7 +6,16 @@ RSpec.describe DiscordService do it_behaves_like "chat service", "Discord notifications" do let(:client) { Discordrb::Webhooks::Client } let(:client_arguments) { { url: webhook_url } } - let(:content_key) { :content } + let(:payload) do + { + embeds: [ + include( + author: include(name: be_present), + description: be_present + ) + ] + } + end end describe '#execute' do diff --git a/spec/models/project_services/hangouts_chat_service_spec.rb b/spec/models/project_services/hangouts_chat_service_spec.rb index 042e32439d1..9d3bd457fc8 100644 --- a/spec/models/project_services/hangouts_chat_service_spec.rb +++ b/spec/models/project_services/hangouts_chat_service_spec.rb @@ -6,6 +6,10 @@ RSpec.describe HangoutsChatService do it_behaves_like "chat service", "Hangouts Chat" do let(:client) { HangoutsChat::Sender } let(:client_arguments) { webhook_url } - let(:content_key) { :text } + let(:payload) do + { + text: be_present + } + end end end diff --git a/spec/models/project_services/unify_circuit_service_spec.rb b/spec/models/project_services/unify_circuit_service_spec.rb index 73702aa8471..0c749322e07 100644 --- a/spec/models/project_services/unify_circuit_service_spec.rb +++ b/spec/models/project_services/unify_circuit_service_spec.rb @@ -5,6 +5,12 @@ require "spec_helper" RSpec.describe UnifyCircuitService do it_behaves_like "chat service", "Unify Circuit" do let(:client_arguments) { webhook_url } - let(:content_key) { :subject } + let(:payload) do + { + subject: project.full_name, + text: be_present, + markdown: true + } + end end end diff --git a/spec/models/project_services/webex_teams_service_spec.rb b/spec/models/project_services/webex_teams_service_spec.rb index bd73d0c93b8..ed63f5bc48c 100644 --- a/spec/models/project_services/webex_teams_service_spec.rb +++ b/spec/models/project_services/webex_teams_service_spec.rb @@ -5,6 +5,10 @@ require "spec_helper" RSpec.describe WebexTeamsService do it_behaves_like "chat service", "Webex Teams" do let(:client_arguments) { webhook_url } - let(:content_key) { :markdown } + let(:payload) do + { + markdown: be_present + } + end end end diff --git a/spec/models/snippet_repository_storage_move_spec.rb b/spec/models/snippet_repository_storage_move_spec.rb index 357951f8859..f5ad837fb36 100644 --- a/spec/models/snippet_repository_storage_move_spec.rb +++ b/spec/models/snippet_repository_storage_move_spec.rb @@ -8,6 +8,6 @@ RSpec.describe SnippetRepositoryStorageMove, type: :model do let(:repository_storage_factory_key) { :snippet_repository_storage_move } let(:error_key) { :snippet } - let(:repository_storage_worker) { SnippetUpdateRepositoryStorageWorker } + let(:repository_storage_worker) { Snippets::UpdateRepositoryStorageWorker } end end diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb index c194a98fdd8..09f9cf8e222 100644 --- a/spec/models/snippet_spec.rb +++ b/spec/models/snippet_spec.rb @@ -21,7 +21,7 @@ RSpec.describe Snippet do it { is_expected.to have_many(:user_mentions).class_name("SnippetUserMention") } it { is_expected.to have_one(:snippet_repository) } it { is_expected.to have_one(:statistics).class_name('SnippetStatistics').dependent(:destroy) } - it { is_expected.to have_many(:repository_storage_moves).class_name('SnippetRepositoryStorageMove').inverse_of(:container) } + it { is_expected.to have_many(:repository_storage_moves).class_name('Snippets::RepositoryStorageMove').inverse_of(:container) } end describe 'validation' do diff --git a/spec/models/snippets/repository_storage_move_spec.rb b/spec/models/snippets/repository_storage_move_spec.rb new file mode 100644 index 00000000000..ed518faf6ff --- /dev/null +++ b/spec/models/snippets/repository_storage_move_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Snippets::RepositoryStorageMove, type: :model do + it_behaves_like 'handles repository moves' do + let_it_be_with_refind(:container) { create(:snippet) } + + let(:repository_storage_factory_key) { :snippet_repository_storage_move } + let(:error_key) { :snippet } + let(:repository_storage_worker) { Snippets::UpdateRepositoryStorageWorker } + end +end diff --git a/spec/requests/api/snippet_repository_storage_moves_spec.rb b/spec/requests/api/snippet_repository_storage_moves_spec.rb index edb92569823..40d01500ac1 100644 --- a/spec/requests/api/snippet_repository_storage_moves_spec.rb +++ b/spec/requests/api/snippet_repository_storage_moves_spec.rb @@ -7,6 +7,6 @@ RSpec.describe API::SnippetRepositoryStorageMoves do let_it_be(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } } let_it_be(:storage_move) { create(:snippet_repository_storage_move, :scheduled, container: container) } let(:repository_storage_move_factory) { :snippet_repository_storage_move } - let(:bulk_worker_klass) { SnippetScheduleBulkRepositoryShardMovesWorker } + let(:bulk_worker_klass) { Snippets::ScheduleBulkRepositoryShardMovesWorker } end end diff --git a/spec/services/ci/create_pipeline_service/rules_spec.rb b/spec/services/ci/create_pipeline_service/rules_spec.rb index 04ecac6a85a..8025443d4ae 100644 --- a/spec/services/ci/create_pipeline_service/rules_spec.rb +++ b/spec/services/ci/create_pipeline_service/rules_spec.rb @@ -180,20 +180,6 @@ RSpec.describe Ci::CreatePipelineService do expect(variables['VAR2']).to eq('my var 2') expect(variables['VAR3']).to be_nil end - - context 'when FF ci_rules_variables is disabled' do - before do - stub_feature_flags(ci_rules_variables: false) - end - - it 'does not affect variables' do - variables = job.scoped_variables_hash - - expect(variables['VAR1']).to eq('my var 1') - expect(variables['VAR2']).to eq('my var 2') - expect(variables['VAR3']).to be_nil - end - end end context 'when matching to the second rule' do diff --git a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb index cb2e8aff8a1..2581cab5d1a 100644 --- a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb +++ b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb @@ -3,12 +3,15 @@ require 'spec_helper' RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do - subject(:execute_service) { described_class.new(track, interval).execute } + subject(:execute_service) do + travel_to(frozen_time) { described_class.new(track, interval).execute } + end let(:track) { :create } let(:interval) { 1 } - let(:previous_action_completed_at) { 2.days.ago.middle_of_day } + let(:frozen_time) { Time.current } + let(:previous_action_completed_at) { frozen_time - 2.days } let(:current_action_completed_at) { nil } let(:experiment_enabled) { true } let(:user_can_perform_current_track_action) { true } @@ -35,22 +38,22 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do end end - context 'for each track and series with the right conditions', :quarantine do # https://gitlab.com/gitlab-org/gitlab/-/issues/322092 + context 'for each track and series with the right conditions' do using RSpec::Parameterized::TableSyntax where(:track, :interval, :actions_completed) do - :create | 1 | { created_at: 2.days.ago.middle_of_day } - :create | 5 | { created_at: 6.days.ago.middle_of_day } - :create | 10 | { created_at: 11.days.ago.middle_of_day } - :verify | 1 | { created_at: 2.days.ago.middle_of_day, git_write_at: 2.days.ago.middle_of_day } - :verify | 5 | { created_at: 6.days.ago.middle_of_day, git_write_at: 6.days.ago.middle_of_day } - :verify | 10 | { created_at: 11.days.ago.middle_of_day, git_write_at: 11.days.ago.middle_of_day } - :trial | 1 | { created_at: 2.days.ago.middle_of_day, git_write_at: 2.days.ago.middle_of_day, pipeline_created_at: 2.days.ago.middle_of_day } - :trial | 5 | { created_at: 6.days.ago.middle_of_day, git_write_at: 6.days.ago.middle_of_day, pipeline_created_at: 6.days.ago.middle_of_day } - :trial | 10 | { created_at: 11.days.ago.middle_of_day, git_write_at: 11.days.ago.middle_of_day, pipeline_created_at: 11.days.ago.middle_of_day } - :team | 1 | { created_at: 2.days.ago.middle_of_day, git_write_at: 2.days.ago.middle_of_day, pipeline_created_at: 2.days.ago.middle_of_day, trial_started_at: 2.days.ago.middle_of_day } - :team | 5 | { created_at: 6.days.ago.middle_of_day, git_write_at: 6.days.ago.middle_of_day, pipeline_created_at: 6.days.ago.middle_of_day, trial_started_at: 6.days.ago.middle_of_day } - :team | 10 | { created_at: 11.days.ago.middle_of_day, git_write_at: 11.days.ago.middle_of_day, pipeline_created_at: 11.days.ago.middle_of_day, trial_started_at: 11.days.ago.middle_of_day } + :create | 1 | { created_at: frozen_time - 2.days } + :create | 5 | { created_at: frozen_time - 6.days } + :create | 10 | { created_at: frozen_time - 11.days } + :verify | 1 | { created_at: frozen_time - 2.days, git_write_at: frozen_time - 2.days } + :verify | 5 | { created_at: frozen_time - 6.days, git_write_at: frozen_time - 6.days } + :verify | 10 | { created_at: frozen_time - 11.days, git_write_at: frozen_time - 11.days } + :trial | 1 | { created_at: frozen_time - 2.days, git_write_at: frozen_time - 2.days, pipeline_created_at: frozen_time - 2.days } + :trial | 5 | { created_at: frozen_time - 6.days, git_write_at: frozen_time - 6.days, pipeline_created_at: frozen_time - 6.days } + :trial | 10 | { created_at: frozen_time - 11.days, git_write_at: frozen_time - 11.days, pipeline_created_at: frozen_time - 11.days } + :team | 1 | { created_at: frozen_time - 2.days, git_write_at: frozen_time - 2.days, pipeline_created_at: frozen_time - 2.days, trial_started_at: frozen_time - 2.days } + :team | 5 | { created_at: frozen_time - 6.days, git_write_at: frozen_time - 6.days, pipeline_created_at: frozen_time - 6.days, trial_started_at: frozen_time - 6.days } + :team | 10 | { created_at: frozen_time - 11.days, git_write_at: frozen_time - 11.days, pipeline_created_at: frozen_time - 11.days, trial_started_at: frozen_time - 11.days } end with_them do @@ -64,7 +67,7 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do it { is_expected.not_to send_in_product_marketing_email } context 'when the previous track actions have been completed' do - let(:current_action_completed_at) { 2.days.ago.middle_of_day } + let(:current_action_completed_at) { frozen_time - 2.days } it { is_expected.to send_in_product_marketing_email(user.id, group.id, :verify, 0) } end @@ -76,7 +79,7 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do it { is_expected.not_to send_in_product_marketing_email } context 'when the previous track action was completed within the intervals range' do - let(:previous_action_completed_at) { 6.days.ago.middle_of_day } + let(:previous_action_completed_at) { frozen_time - 6.days } it { is_expected.to send_in_product_marketing_email(user.id, group.id, :create, 1) } end @@ -113,13 +116,13 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do end context 'when the previous track action is completed outside the intervals range' do - let(:previous_action_completed_at) { 3.days.ago } + let(:previous_action_completed_at) { frozen_time - 3.days } it { is_expected.not_to send_in_product_marketing_email } end context 'when the current track action is completed' do - let(:current_action_completed_at) { Time.current } + let(:current_action_completed_at) { frozen_time } it { is_expected.not_to send_in_product_marketing_email } end diff --git a/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb b/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb index 764c7f94a46..9286d73ed4a 100644 --- a/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb +++ b/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Snippets::ScheduleBulkRepositoryShardMovesService do it_behaves_like 'moves repository shard in bulk' do let_it_be_with_reload(:container) { create(:snippet, :repository) } - let(:move_service_klass) { SnippetRepositoryStorageMove } - let(:bulk_worker_klass) { ::SnippetScheduleBulkRepositoryShardMovesWorker } + let(:move_service_klass) { Snippets::RepositoryStorageMove } + let(:bulk_worker_klass) { ::Snippets::ScheduleBulkRepositoryShardMovesWorker } end end diff --git a/spec/support/helpers/stub_object_storage.rb b/spec/support/helpers/stub_object_storage.rb index 0d0ac171baa..56177d445d6 100644 --- a/spec/support/helpers/stub_object_storage.rb +++ b/spec/support/helpers/stub_object_storage.rb @@ -114,7 +114,7 @@ module StubObjectStorage end def stub_object_storage_multipart_init(endpoint, upload_id = "upload_id") - stub_request(:post, %r{\A#{endpoint}tmp/uploads/[a-z0-9-]*\?uploads\z}) + stub_request(:post, %r{\A#{endpoint}tmp/uploads/[%A-Za-z0-9-]*\?uploads\z}) .to_return status: 200, body: <<-EOS.strip_heredoc <?xml version="1.0" encoding="UTF-8"?> <InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> diff --git a/spec/support/shared_examples/models/chat_service_shared_examples.rb b/spec/support/shared_examples/models/chat_service_shared_examples.rb index ad237ad9f49..59e249bb865 100644 --- a/spec/support/shared_examples/models/chat_service_shared_examples.rb +++ b/spec/support/shared_examples/models/chat_service_shared_examples.rb @@ -53,9 +53,13 @@ RSpec.shared_examples "chat service" do |service_name| end it "calls #{service_name} API" do - subject.execute(sample_data) + result = subject.execute(sample_data) - expect(WebMock).to have_requested(:post, webhook_url).with { |req| req.body =~ /\A{"#{content_key}":.+}\Z/ }.once + expect(result).to be(true) + expect(WebMock).to have_requested(:post, webhook_url).once.with { |req| + json_body = Gitlab::Json.parse(req.body).with_indifferent_access + expect(json_body).to include(payload) + } end end @@ -67,7 +71,8 @@ RSpec.shared_examples "chat service" do |service_name| it "does not call #{service_name} API" do result = subject.execute(sample_data) - expect(result).to be_falsy + expect(result).to be(false) + expect(WebMock).not_to have_requested(:post, webhook_url) end end diff --git a/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb b/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb index 3a09b6ce449..a5f1c6b7b3d 100644 --- a/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb +++ b/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb @@ -6,7 +6,7 @@ RSpec.describe SnippetScheduleBulkRepositoryShardMovesWorker do it_behaves_like 'schedules bulk repository shard moves' do let_it_be_with_reload(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } } - let(:move_service_klass) { SnippetRepositoryStorageMove } - let(:worker_klass) { SnippetUpdateRepositoryStorageWorker } + let(:move_service_klass) { Snippets::RepositoryStorageMove } + let(:worker_klass) { Snippets::UpdateRepositoryStorageWorker } end end diff --git a/spec/workers/snippet_update_repository_storage_worker_spec.rb b/spec/workers/snippet_update_repository_storage_worker_spec.rb index a48abe4abf7..205cb2e432f 100644 --- a/spec/workers/snippet_update_repository_storage_worker_spec.rb +++ b/spec/workers/snippet_update_repository_storage_worker_spec.rb @@ -10,6 +10,6 @@ RSpec.describe SnippetUpdateRepositoryStorageWorker do let_it_be(:repository_storage_move) { create(:snippet_repository_storage_move) } let(:service_klass) { Snippets::UpdateRepositoryStorageService } - let(:repository_storage_move_klass) { SnippetRepositoryStorageMove } + let(:repository_storage_move_klass) { Snippets::RepositoryStorageMove } end end diff --git a/spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb b/spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb new file mode 100644 index 00000000000..be7d8ebe2d3 --- /dev/null +++ b/spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Snippets::ScheduleBulkRepositoryShardMovesWorker do + it_behaves_like 'schedules bulk repository shard moves' do + let_it_be_with_reload(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } } + + let(:move_service_klass) { Snippets::RepositoryStorageMove } + let(:worker_klass) { Snippets::UpdateRepositoryStorageWorker } + end +end diff --git a/spec/workers/snippets/update_repository_storage_worker_spec.rb b/spec/workers/snippets/update_repository_storage_worker_spec.rb new file mode 100644 index 00000000000..38e9012e9c5 --- /dev/null +++ b/spec/workers/snippets/update_repository_storage_worker_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Snippets::UpdateRepositoryStorageWorker do + subject { described_class.new } + + it_behaves_like 'an update storage move worker' do + let_it_be_with_refind(:container) { create(:snippet, :repository) } + let_it_be(:repository_storage_move) { create(:snippet_repository_storage_move) } + + let(:service_klass) { Snippets::UpdateRepositoryStorageService } + let(:repository_storage_move_klass) { Snippets::RepositoryStorageMove } + end +end |