Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2021-09-06 06:09:17 +00:00
parent 23d951df2d
commit 578fc86533
39 changed files with 464 additions and 109 deletions

View File

@ -75,3 +75,16 @@ ui-docs-links lint:
needs: []
script:
- bundle exec haml-lint -i DocumentationLinks
deprecations-doc check:
variables:
SETUP_DB: "false"
extends:
- .default-retry
- .rails-cache
- .default-before_script
- .docs:rules:deprecations
stage: test
needs: []
script:
- bundle exec rake gitlab:docs:check_deprecations

View File

@ -147,6 +147,13 @@
- ".markdownlint.yml"
- "scripts/lint-doc.sh"
.docs-deprecations-patterns: &docs-deprecations-patterns
- "doc/deprecations/index.md"
- "data/deprecations/*.yml"
- "data/deprecations/templates/_deprecation_template.md.erb"
- "lib/tasks/gitlab/docs/compile_deprecations.rake"
- "tooling/deprecations/docs.rb"
.bundler-patterns: &bundler-patterns
- '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
@ -453,6 +460,12 @@
changes: *docs-patterns
when: on_success
.docs:rules:deprecations:
rules:
- <<: *if-default-refs
changes: *docs-deprecations-patterns
when: on_success
##################
# GraphQL rules #
##################

View File

@ -308,6 +308,7 @@ module Ci
scope :ci_and_parent_sources, -> { where(source: Enums::Ci::Pipeline.ci_and_parent_sources.values) }
scope :for_user, -> (user) { where(user: user) }
scope :for_sha, -> (sha) { where(sha: sha) }
scope :where_not_sha, -> (sha) { where.not(sha: sha) }
scope :for_source_sha, -> (source_sha) { where(source_sha: source_sha) }
scope :for_sha_or_source_sha, -> (sha) { for_sha(sha).or(for_source_sha(sha)) }
scope :for_ref, -> (ref) { where(ref: ref) }

View File

@ -4,6 +4,9 @@ module Ci
module Sources
class Pipeline < Ci::ApplicationRecord
include Ci::NamespacedModelName
include IgnorableColumns
ignore_columns 'source_job_id_convert_to_bigint', remove_with: '14.5', remove_after: '2021-11-22'
self.table_name = "ci_sources_pipelines"

View File

@ -52,8 +52,7 @@ module FeatureFlags
scopes = strategy.scopes
.map { |scope| %Q("#{scope.environment_scope}") }
.join(', ')
%Q(Created strategy \"#{strategy.name}\" )\
"with scopes #{scopes}."
%Q(Created strategy "#{strategy.name}" with scopes #{scopes}.)
end
def feature_flag_by_name

View File

@ -2,10 +2,9 @@
stage: none
group: none
info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
description: "View features that are currently deprecated"
---
# Deprecated features by planned removal milestone
# Deprecated feature removal schedule
<!--
This page is automatically generated from the YAML files in `/data/deprecations` by the rake task
@ -16,15 +15,16 @@ Do not edit this page directly.
To add a deprecation, use the example.yml file in `/data/deprecations/templates` as a template,
then run `bin/rake gitlab:docs:compile_deprecations`.
-->
<% if milestones.any? %>
<%- milestones.each do |milestone| %>
## <%= milestone %>
<%- deprecations.select{|d| d["removal_milestone"] == milestone}.each do |deprecation| %>
### <%= deprecation["name"]%>
<% if milestones.any? -%>
<% milestones.each do |milestone| %>
### <%= milestone %>
<% deprecations.select{|d| d["removal_milestone"] == milestone}.each do |deprecation| %>
#### <%= deprecation["name"] %>
<%= deprecation["body"]%>
<% end %>
<% end %>
<% else -%>
## There are no deprecated features for this version of GitLab
<%= deprecation["body"] -%>
<%- end -%>
<%- end -%>
<%- else -%>
Deprecated features scheduled for removal will be listed here, sorted by GitLab milestone.
<% end -%>

View File

@ -10,8 +10,8 @@
#
# Please delete this line and above before submitting your merge request.
- name: # The name of the feature to be deprecated
removal_milestone: # XX.YY format - the milestone when this feature is planned to be removed
- name: "Feature name" # The name of the feature to be deprecated
removal_milestone: "XX.YY" # the milestone when this feature is planned to be removed
body: | # Do not modify this line, instead modify the lines below.
<!-- START OF BODY COMMENT

View File

@ -0,0 +1,23 @@
# frozen_string_literal: true
class RemoveDuplicateDastSiteTokensWithSameToken < ActiveRecord::Migration[6.1]
include Gitlab::Database::MigrationHelpers
INDEX_NAME = 'index_dast_site_token_on_token'
# rubocop: disable Migration/AddIndex
def up
execute("WITH duplicate_tokens AS(
SELECT id, rank() OVER (PARTITION BY token ORDER BY id) r FROM dast_site_tokens
)
DELETE FROM dast_site_tokens c USING duplicate_tokens t
WHERE c.id = t.id AND t.r > 1;")
add_index :dast_site_tokens, :token, name: INDEX_NAME, unique: true
end
# rubocop: disable Migration/RemoveIndex
def down
remove_index :dast_site_tokens, :token, name: INDEX_NAME
end
end

View File

@ -0,0 +1,18 @@
# frozen_string_literal: true
class RescheduleExtractProjectTopicsIntoSeparateTable < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
MIGRATION = 'ExtractProjectTopicsIntoSeparateTable'
DELAY_INTERVAL = 4.minutes
disable_ddl_transaction!
def up
requeue_background_migration_jobs_by_range_at_intervals(MIGRATION, DELAY_INTERVAL)
end
def down
# no-op
end
end

View File

@ -0,0 +1,28 @@
# frozen_string_literal: true
class DropTemporaryTriggerForCiSourcesPipelines < Gitlab::Database::Migration[1.0]
disable_ddl_transaction!
TABLE = 'ci_sources_pipelines'
TEMPORARY_COLUMN = 'source_job_id_convert_to_bigint'
MAIN_COLUMN = 'source_job_id'
TRIGGER = 'trigger_8485e97c00e3'
# rubocop:disable Migration/WithLockRetriesDisallowedMethod
def up
check_trigger_permissions!(TABLE)
with_lock_retries do
remove_rename_triggers(TABLE, TRIGGER)
end
end
def down
check_trigger_permissions!(TABLE)
with_lock_retries do
install_rename_triggers(TABLE, MAIN_COLUMN, TEMPORARY_COLUMN, trigger_name: TRIGGER)
end
end
# rubocop:enable Migration/WithLockRetriesDisallowedMethod
end

View File

@ -0,0 +1,55 @@
# frozen_string_literal: true
class SliceMergeRequestDiffCommitMigrations < ActiveRecord::Migration[6.1]
include Gitlab::Database::MigrationHelpers
BATCH_SIZE = 5_000
MIGRATION_CLASS = 'MigrateMergeRequestDiffCommitUsers'
STEAL_MIGRATION_CLASS = 'StealMigrateMergeRequestDiffCommitUsers'
def up
old_jobs = Gitlab::Database::BackgroundMigrationJob
.for_migration_class(MIGRATION_CLASS)
.pending
.to_a
return if old_jobs.empty?
# This ensures we stop processing the old ranges, as the background
# migrations skip already processed jobs.
Gitlab::Database::BackgroundMigrationJob
.for_migration_class(MIGRATION_CLASS)
.pending
.update_all(status: :succeeded)
rows = []
old_jobs.each do |job|
min, max = job.arguments
while min < max
rows << {
class_name: MIGRATION_CLASS,
arguments: [min, min + BATCH_SIZE],
created_at: Time.now.utc,
updated_at: Time.now.utc
}
min += BATCH_SIZE
end
end
Gitlab::Database::BackgroundMigrationJob.insert_all!(rows)
job = Gitlab::Database::BackgroundMigrationJob
.for_migration_class(MIGRATION_CLASS)
.pending
.first
migrate_in(1.hour, STEAL_MIGRATION_CLASS, job.arguments)
end
def down
# no-op
end
end

View File

@ -0,0 +1 @@
a7f4911fcb9ab939a6e5e9a6e5e927fd6828ff062324d8483d78c8f8a4ded4e6

View File

@ -0,0 +1 @@
84a68304f95ae04b85625c214b28a251014582fb142390ff3df8ea6d6f0947e1

View File

@ -0,0 +1 @@
36572ad3a4a8a7511512ff45e2a68252950ce852af1b5a28c6b4e4491f97be07

View File

@ -0,0 +1 @@
34287b86616026b94374856991c793ad869c52badddc09be923984002c6214bd

View File

@ -107,15 +107,6 @@ BEGIN
END;
$$;
CREATE FUNCTION trigger_8485e97c00e3() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW."source_job_id_convert_to_bigint" := NEW."source_job_id";
RETURN NEW;
END;
$$;
CREATE FUNCTION trigger_8487d4de3e7b() RETURNS trigger
LANGUAGE plpgsql
AS $$
@ -24813,6 +24804,8 @@ CREATE UNIQUE INDEX index_dast_site_profiles_pipelines_on_ci_pipeline_id ON dast
CREATE UNIQUE INDEX index_dast_site_token_on_project_id_and_url ON dast_site_tokens USING btree (project_id, url);
CREATE UNIQUE INDEX index_dast_site_token_on_token ON dast_site_tokens USING btree (token);
CREATE INDEX index_dast_site_tokens_on_project_id ON dast_site_tokens USING btree (project_id);
CREATE INDEX index_dast_site_validations_on_dast_site_token_id ON dast_site_validations USING btree (dast_site_token_id);
@ -27327,8 +27320,6 @@ CREATE TRIGGER trigger_542d6c2ad72e BEFORE INSERT OR UPDATE ON ci_builds_metadat
CREATE TRIGGER trigger_77f5e1d20482 BEFORE INSERT OR UPDATE ON deployments FOR EACH ROW EXECUTE FUNCTION trigger_77f5e1d20482();
CREATE TRIGGER trigger_8485e97c00e3 BEFORE INSERT OR UPDATE ON ci_sources_pipelines FOR EACH ROW EXECUTE FUNCTION trigger_8485e97c00e3();
CREATE TRIGGER trigger_8487d4de3e7b BEFORE INSERT OR UPDATE ON ci_builds_metadata FOR EACH ROW EXECUTE FUNCTION trigger_8487d4de3e7b();
CREATE TRIGGER trigger_91dc388a5fe6 BEFORE INSERT OR UPDATE ON dep_ci_build_trace_sections FOR EACH ROW EXECUTE FUNCTION trigger_91dc388a5fe6();

View File

@ -340,6 +340,12 @@ disable enforcement. For more information, see the documentation on configuring
1. Run `sudo -u git /home/git/gitaly/gitaly-hooks check /home/git/gitaly/config.toml`
to confirm that Gitaly can perform callbacks to the GitLab internal API.
WARNING:
If directly copying repository data from a GitLab server to Gitaly, ensure that the metadata file,
default path `/var/opt/gitlab/git-data/repositories/.gitaly-metadata`, is not included in the transfer.
Copying this file causes GitLab to use the [Rugged patches](index.md#direct-access-to-git-in-gitlab) for repositories hosted on the Gitaly server,
leading to `Error creating pipeline` and `Commit not found` errors, or stale data.
### Configure Gitaly clients
As the final step, you must update Gitaly clients to switch from using local Gitaly service to use

View File

@ -539,12 +539,6 @@ To see if GitLab can access the repository file system directly, we use the foll
Direct Git access is enable by default in Omnibus GitLab because it fills in the correct repository
paths in the GitLab configuration file `config/gitlab.yml`. This satisfies the UUID check.
WARNING:
If directly copying repository data from a GitLab server to Gitaly, ensure that the metadata file,
default path `/var/opt/gitlab/git-data/repositories/.gitaly-metadata`, is not included in the transfer.
Copying this file causes GitLab to use the Rugged patches for repositories hosted on the Gitaly server,
leading to `Error creating pipeline` and `Commit not found` errors, or stale data.
### Transition to Gitaly Cluster
For the sake of removing complexity, we must remove direct Git access in GitLab. However, we can't

View File

@ -443,6 +443,15 @@ When possible, try to avoid acronyms in headings.
- List item 2
```
### Comments
To embed comments within Markdown, use standard HTML comments that are not rendered
when published. Example:
```html
<!-- This is a comment that is not rendered -->
```
### Emphasis
- Use double asterisks (`**`) to mark a word or text in bold (`**bold**`).

View File

@ -16,9 +16,16 @@ It combines [feature-driven development](https://en.wikipedia.org/wiki/Feature-d
Organizations coming to Git from other version control systems frequently find it hard to develop a productive workflow.
This article describes GitLab flow, which integrates the Git workflow with an issue tracking system.
It offers a transparent and effective way to work with Git.
It offers a transparent and effective way to work with Git:
![Four stages (working copy, index, local repository, remote repository) and three steps between them](img/gitlab_flow_four_stages.png)
```mermaid
graph LR
subgraph Git workflow
A[Working copy] --> |git add| B[Index]
B --> |git commit| C[Local repository]
C --> |git push| D[Remote repository]
end
```
When converting to Git, you have to get used to the fact that it takes three steps to share a commit with colleagues.
Most version control systems have only one step: committing from the working copy to a shared server.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -2,10 +2,9 @@
stage: none
group: none
info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
description: "View features that are currently deprecated"
---
# Deprecated features by planned removal milestone
# Deprecated feature removal schedule
<!--
This page is automatically generated from the YAML files in `/data/deprecations` by the rake task
@ -17,4 +16,4 @@ To add a deprecation, use the example.yml file in `/data/deprecations/templates`
then run `bin/rake gitlab:docs:compile_deprecations`.
-->
## There are no deprecated features for this version of GitLab
Deprecated features scheduled for removal will be listed here, sorted by GitLab milestone.

View File

@ -26,12 +26,21 @@ module Gitlab
belongs_to :topic
end
# Temporary AR table for projects
class Project < ActiveRecord::Base
self.table_name = 'projects'
end
def perform(start_id, stop_id)
Tagging.includes(:tag).where(taggable_type: 'Project', id: start_id..stop_id).each do |tagging|
topic = Topic.find_or_create_by(name: tagging.tag.name)
project_topic = ProjectTopic.find_or_create_by(project_id: tagging.taggable_id, topic: topic)
if Project.exists?(id: tagging.taggable_id)
topic = Topic.find_or_create_by(name: tagging.tag.name)
project_topic = ProjectTopic.find_or_create_by(project_id: tagging.taggable_id, topic: topic)
tagging.delete if project_topic.persisted?
tagging.delete if project_topic.persisted?
else
tagging.delete
end
end
mark_job_as_succeeded(start_id, stop_id)

View File

@ -14,7 +14,7 @@ module Gitlab
# The number of rows in merge_request_diff_commits to get in a single
# query.
COMMIT_ROWS_PER_QUERY = 10_000
COMMIT_ROWS_PER_QUERY = 1_000
# The number of rows in merge_request_diff_commits to update in a single
# query.

View File

@ -15,13 +15,10 @@ module Gitlab
end
def schedule_next_job
# We process jobs in reverse order, so that (hopefully) we are less
# likely to process jobs that the regular background migration job is
# also processing.
next_job = Database::BackgroundMigrationJob
.for_migration_class('MigrateMergeRequestDiffCommitUsers')
.pending
.last
.first
return unless next_job

View File

@ -7,15 +7,19 @@ module Gitlab
class CancelPendingPipelines < Chain::Base
include Chain::Helpers
BATCH_SIZE = 25
# rubocop: disable CodeReuse/ActiveRecord
def perform!
return unless project.auto_cancel_pending_pipelines?
Gitlab::OptimisticLocking.retry_lock(auto_cancelable_pipelines, name: 'cancel_pending_pipelines') do |cancelables|
cancelables.find_each do |cancelable|
cancelable.auto_cancel_running(pipeline)
cancelables.select(:id).each_batch(of: BATCH_SIZE) do |cancelables_batch|
auto_cancel_interruptible_pipelines(cancelables_batch.ids)
end
end
end
# rubocop: enable CodeReuse/ActiveRecord
def break?
false
@ -23,16 +27,21 @@ module Gitlab
private
# rubocop: disable CodeReuse/ActiveRecord
def auto_cancelable_pipelines
project.all_pipelines.ci_and_parent_sources
.where(ref: pipeline.ref)
.where.not(id: pipeline.same_family_pipeline_ids)
.where.not(sha: project.commit(pipeline.ref).try(:id))
project.all_pipelines.created_after(1.week.ago)
.ci_and_parent_sources
.for_ref(pipeline.ref)
.id_not_in(pipeline.same_family_pipeline_ids)
.where_not_sha(project.commit(pipeline.ref).try(:id))
.alive_or_scheduled
.with_only_interruptible_builds
end
# rubocop: enable CodeReuse/ActiveRecord
def auto_cancel_interruptible_pipelines(pipeline_ids)
::Ci::Pipeline
.id_in(pipeline_ids)
.with_only_interruptible_builds
.each { |cancelable| cancelable.auto_cancel_running(pipeline) }
end
end
end
end

View File

@ -4,28 +4,26 @@ namespace :gitlab do
namespace :docs do
desc "Generate deprecation list from individual files"
task :compile_deprecations do
require_relative '../../../../tooling/deprecations/docs/renderer'
require_relative '../../../../tooling/deprecations/docs'
source_files = Rake::FileList.new("data/deprecations/**/*.yml") do |fl|
fl.exclude(/example\.yml/)
File.write(Deprecations::Docs.path, Deprecations::Docs.render)
puts "Deprecations compiled to #{Deprecations::Docs.path}"
end
desc "Check that the deprecation doc is up to date"
task :check_deprecations do
require_relative '../../../../tooling/deprecations/docs'
contents = Deprecations::Docs.render
doc = File.read(Deprecations::Docs.path)
if doc == contents
puts "Deprecations doc is up to date."
else
format_output('Deprecations doc is outdated! Please update it by running `bundle exec rake gitlab:docs:compile_deprecations`.')
abort
end
deprecations = source_files.map do |file|
YAML.load_file(file)
end
deprecations.sort_by! { |d| -d["removal_milestone"].to_f }
milestones = deprecations.map { |d| d["removal_milestone"].to_f }.uniq
contents = Deprecations::Docs::Renderer
.render(deprecations: deprecations, milestones: milestones)
File.write(
File.expand_path("doc/deprecations/index.md", "#{__dir__}/../../../.."),
contents)
puts "Deprecations compiled to doc/deprecations/index.md"
end
end
end

View File

@ -35,8 +35,10 @@ module QA
end
def has_number_of_files?(snippet_title, number)
within_element(:snippet_link, snippet_title: snippet_title) do
has_element?(:snippet_file_count_content, snippet_files: number)
retry_until(max_attempts: 5, reload: true, sleep_interval: 1) do # snippet statistics computation can take a few moments
within_element(:snippet_link, snippet_title: snippet_title) do
has_element?(:snippet_file_count_content, snippet_files: number, wait: 5)
end
end
end
end

View File

@ -287,6 +287,17 @@ module QA
raise "Rebase did not appear to be successful" unless success
end
def merge_immediately!
merge_moment_dropdown_found = has_element?(:merge_moment_dropdown, wait: 0)
if merge_moment_dropdown_found
click_element(:merge_moment_dropdown)
click_element(:merge_immediately_menu_item)
else
click_element(:merge_button)
end
end
def try_to_merge!
# Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042
# To remove page refresh logic if possible

View File

@ -58,7 +58,7 @@ module QA
it_behaves_like 'successful tag creation', :maintainer_user
end
context 'when protected' do
context 'when protected', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/339727', type: :bug } do
before do
add_members_to_project(project)

View File

@ -21,14 +21,16 @@ RSpec.describe Gitlab::BackgroundMigration::ExtractProjectTopicsIntoSeparateTabl
tagging_2 = taggings.create!(taggable_type: 'Project', taggable_id: project.id, context: 'topics', tag_id: tag_2.id)
other_tagging = taggings.create!(taggable_type: 'Other', taggable_id: project.id, context: 'topics', tag_id: tag_1.id)
tagging_3 = taggings.create!(taggable_type: 'Project', taggable_id: project.id, context: 'topics', tag_id: tag_3.id)
tagging_4 = taggings.create!(taggable_type: 'Project', taggable_id: -1, context: 'topics', tag_id: tag_1.id)
subject.perform(tagging_1.id, tagging_3.id)
subject.perform(tagging_1.id, tagging_4.id)
# Tagging records
expect { tagging_1.reload }.to raise_error(ActiveRecord::RecordNotFound)
expect { tagging_2.reload }.to raise_error(ActiveRecord::RecordNotFound)
expect { other_tagging.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
expect { tagging_3.reload }.to raise_error(ActiveRecord::RecordNotFound)
expect { tagging_4.reload }.to raise_error(ActiveRecord::RecordNotFound)
# Topic records
topic_1 = topics.find_by(name: 'Topic1')

View File

@ -23,7 +23,7 @@ RSpec.describe Gitlab::BackgroundMigration::StealMigrateMergeRequestDiffCommitUs
end
describe '#schedule_next_job' do
it 'schedules the next job in reverse order' do
it 'schedules the next job in ascending order' do
Gitlab::Database::BackgroundMigrationJob.create!(
class_name: 'MigrateMergeRequestDiffCommitUsers',
arguments: [10, 20]
@ -36,7 +36,7 @@ RSpec.describe Gitlab::BackgroundMigration::StealMigrateMergeRequestDiffCommitUs
expect(BackgroundMigrationWorker)
.to receive(:perform_in)
.with(5.minutes, 'StealMigrateMergeRequestDiffCommitUsers', [40, 50])
.with(5.minutes, 'StealMigrateMergeRequestDiffCommitUsers', [10, 20])
migration.schedule_next_job
end

View File

@ -44,6 +44,14 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::CancelPendingPipelines do
expect(build_statuses(pipeline)).to contain_exactly('pending')
end
it 'cancels the builds with 2 queries to avoid query timeout' do
second_query_regex = /WHERE "ci_pipelines"\."id" = \d+ AND \(NOT EXISTS/
recorder = ActiveRecord::QueryRecorder.new { perform }
second_query = recorder.occurrences.keys.filter { |occ| occ =~ second_query_regex }
expect(second_query).to be_one
end
context 'when the previous pipeline has a child pipeline' do
let(:child_pipeline) { create(:ci_pipeline, child_of: prev_pipeline) }

View File

@ -0,0 +1,53 @@
# frozen_string_literal: true
require 'spec_helper'
require_migration!
RSpec.describe RemoveDuplicateDastSiteTokensWithSameToken do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:dast_site_tokens) { table(:dast_site_tokens) }
let!(:namespace) { namespaces.create!(id: 1, name: 'group', path: 'group') }
let!(:project1) { projects.create!(id: 1, namespace_id: namespace.id, path: 'project1') }
# create non duplicate dast site token
let!(:dast_site_token1) { dast_site_tokens.create!(project_id: project1.id, url: 'https://gitlab.com', token: SecureRandom.uuid) }
context 'when duplicate dast site tokens exists' do
# create duplicate dast site token
let_it_be(:duplicate_token) { 'duplicate_token' }
let_it_be(:other_duplicate_token) { 'other_duplicate_token' }
let!(:project2) { projects.create!(id: 2, namespace_id: namespace.id, path: 'project2') }
let!(:dast_site_token2) { dast_site_tokens.create!(project_id: project2.id, url: 'https://gitlab2.com', token: duplicate_token) }
let!(:dast_site_token3) { dast_site_tokens.create!(project_id: project2.id, url: 'https://gitlab3.com', token: duplicate_token) }
let!(:dast_site_token4) { dast_site_tokens.create!(project_id: project2.id, url: 'https://gitlab4.com', token: duplicate_token) }
let!(:project3) { projects.create!(id: 3, namespace_id: namespace.id, path: 'project3') }
let!(:dast_site_token5) { dast_site_tokens.create!(project_id: project3.id, url: 'https://gitlab2.com', token: other_duplicate_token) }
let!(:dast_site_token6) { dast_site_tokens.create!(project_id: project3.id, url: 'https://gitlab3.com', token: other_duplicate_token) }
let!(:dast_site_token7) { dast_site_tokens.create!(project_id: project3.id, url: 'https://gitlab4.com', token: other_duplicate_token) }
describe 'migration up' do
it 'does remove duplicated dast site tokens with the same token' do
expect(dast_site_tokens.count).to eq(7)
expect(dast_site_tokens.where(token: duplicate_token).size).to eq(3)
migrate!
expect(dast_site_tokens.count).to eq(3)
expect(dast_site_tokens.where(token: duplicate_token).size).to eq(1)
end
end
end
context 'when duplicate dast site tokens do not exist' do
let!(:dast_site_token5) { dast_site_tokens.create!(project_id: 1, url: 'https://gitlab5.com', token: SecureRandom.uuid) }
describe 'migration up' do
it 'does not remove any dast site tokens' do
expect { migrate! }.not_to change(dast_site_tokens, :count)
end
end
end
end

View File

@ -0,0 +1,69 @@
# frozen_string_literal: true
require 'spec_helper'
require_migration! 'slice_merge_request_diff_commit_migrations'
RSpec.describe SliceMergeRequestDiffCommitMigrations, :migration do
let(:migration) { described_class.new }
describe '#up' do
context 'when there are no jobs to process' do
it 'does nothing' do
expect(migration).not_to receive(:migrate_in)
expect(Gitlab::Database::BackgroundMigrationJob).not_to receive(:create!)
migration.up
end
end
context 'when there are pending jobs' do
let!(:job1) do
Gitlab::Database::BackgroundMigrationJob.create!(
class_name: described_class::MIGRATION_CLASS,
arguments: [1, 10_001]
)
end
let!(:job2) do
Gitlab::Database::BackgroundMigrationJob.create!(
class_name: described_class::MIGRATION_CLASS,
arguments: [10_001, 20_001]
)
end
it 'marks the old jobs as finished' do
migration.up
job1.reload
job2.reload
expect(job1).to be_succeeded
expect(job2).to be_succeeded
end
it 'the jobs are slices into smaller ranges' do
migration.up
new_jobs = Gitlab::Database::BackgroundMigrationJob
.for_migration_class(described_class::MIGRATION_CLASS)
.pending
.to_a
expect(new_jobs.map(&:arguments)).to eq([
[1, 5_001],
[5_001, 10_001],
[10_001, 15_001],
[15_001, 20_001]
])
end
it 'schedules a background migration for the first job' do
expect(migration)
.to receive(:migrate_in)
.with(1.hour, described_class::STEAL_MIGRATION_CLASS, [1, 5_001])
migration.up
end
end
end
end

View File

@ -183,6 +183,28 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
describe '.where_not_sha' do
let_it_be(:pipeline) { create(:ci_pipeline, sha: 'abcx') }
let_it_be(:pipeline_2) { create(:ci_pipeline, sha: 'abc') }
let(:sha) { 'abc' }
subject { described_class.where_not_sha(sha) }
it 'returns the pipeline without the specified sha' do
is_expected.to contain_exactly(pipeline)
end
context 'when argument is array' do
let(:sha) { %w[abc abcx] }
it 'returns the pipelines without the specified shas' do
pipeline_3 = create(:ci_pipeline, sha: 'abcy')
is_expected.to contain_exactly(pipeline_3)
end
end
end
describe '.for_source_sha' do
subject { described_class.for_source_sha(source_sha) }

View File

@ -69,15 +69,10 @@ RSpec.describe FeatureFlags::CreateService do
end
it 'creates audit event' do
expected_message = 'Created feature flag feature_flag '\
'with description "description". '\
'Created strategy "default" with scopes '\
'"*". '\
'Created strategy "default" with scopes '\
'"production".'
expect { subject }.to change { AuditEvent.count }.by(1)
expect(AuditEvent.last.details[:custom_message]).to eq(expected_message)
expect(AuditEvent.last.details[:custom_message]).to start_with('Created feature flag feature_flag with description "description".')
expect(AuditEvent.last.details[:custom_message]).to include('Created strategy "default" with scopes "*".')
expect(AuditEvent.last.details[:custom_message]).to include('Created strategy "default" with scopes "production".')
end
context 'when user is reporter' do

View File

@ -0,0 +1,37 @@
# frozen_string_literal: true
require 'erb'
module Deprecations
module Docs
module_function
def path
Rails.root.join("doc/update/deprecations.md")
end
def render
deprecations_yaml_glob = Rails.root.join("data/deprecations/**/*.yml")
source_files = Rake::FileList.new(deprecations_yaml_glob) do |fl|
fl.exclude(/example\.yml$/)
end
deprecations = source_files.flat_map do |file|
YAML.load_file(file)
end
deprecations = VersionSorter.rsort(deprecations) { |d| d["removal_milestone"] }
milestones = deprecations.map { |d| d["removal_milestone"] }.uniq
template = Rails.root.join("data/deprecations/templates/_deprecation_template.md.erb")
load_template(template)
.result_with_hash(deprecations: deprecations, milestones: milestones)
end
def load_template(filename)
ERB.new(File.read(filename), trim_mode: '-')
end
end
end

View File

@ -1,20 +0,0 @@
# frozen_string_literal: true
require 'erb'
module Deprecations
module Docs
module Renderer
module_function
def render(**variables)
template = File.expand_path("data/deprecations/templates/_deprecation_template.md.erb", "#{__dir__}/../../..")
load_template(template).result_with_hash(variables)
end
def load_template(filename)
ERB.new(File.read(filename), trim_mode: '-')
end
end
end
end