Setup and run a Gitaly server for testing if GitalyClient is enabled
This commit is contained in:
parent
5e1a802b15
commit
d6cc8feb6c
12 changed files with 196 additions and 142 deletions
|
@ -1,4 +1,4 @@
|
|||
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.3-git-2.7-phantomjs-2.1-node-7.1"
|
||||
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.3-golang-1.8-git-2.7-phantomjs-2.1-node-7.1"
|
||||
|
||||
cache:
|
||||
key: "ruby-233"
|
||||
|
|
|
@ -326,14 +326,13 @@ class Commit
|
|||
end
|
||||
|
||||
def raw_diffs(*args)
|
||||
use_gitaly = Gitlab::GitalyClient.feature_enabled?(:commit_raw_diffs)
|
||||
deltas_only = args.last.is_a?(Hash) && args.last[:deltas_only]
|
||||
|
||||
if use_gitaly && !deltas_only
|
||||
Gitlab::GitalyClient::Commit.diff_from_parent(self, *args)
|
||||
else
|
||||
raw.diffs(*args)
|
||||
end
|
||||
# NOTE: This feature is intentionally disabled until
|
||||
# https://gitlab.com/gitlab-org/gitaly/issues/178 is resolved
|
||||
# if Gitlab::GitalyClient.feature_enabled?(:commit_raw_diffs)
|
||||
# Gitlab::GitalyClient::Commit.diff_from_parent(self, *args)
|
||||
# else
|
||||
raw.diffs(*args)
|
||||
# end
|
||||
end
|
||||
|
||||
def diffs(diff_options = nil)
|
||||
|
|
|
@ -965,13 +965,15 @@ class Repository
|
|||
end
|
||||
|
||||
def is_ancestor?(ancestor_id, descendant_id)
|
||||
Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled|
|
||||
if is_enabled
|
||||
raw_repository.is_ancestor?(ancestor_id, descendant_id)
|
||||
else
|
||||
merge_base_commit(ancestor_id, descendant_id) == ancestor_id
|
||||
end
|
||||
end
|
||||
# NOTE: This feature is intentionally disabled until
|
||||
# https://gitlab.com/gitlab-org/gitlab-ce/issues/30586 is resolved
|
||||
# Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled|
|
||||
# if is_enabled
|
||||
# raw_repository.is_ancestor?(ancestor_id, descendant_id)
|
||||
# else
|
||||
merge_base_commit(ancestor_id, descendant_id) == ancestor_id
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
def empty_repo?
|
||||
|
|
|
@ -579,9 +579,9 @@ test:
|
|||
storages:
|
||||
default:
|
||||
path: tmp/tests/repositories/
|
||||
gitaly_address: unix:<%= Rails.root.join('tmp/sockets/private/gitaly.socket') %>
|
||||
gitaly_address: unix:tmp/tests/gitaly/gitaly.socket
|
||||
gitaly:
|
||||
enabled: false
|
||||
enabled: true
|
||||
backup:
|
||||
path: tmp/tests/backups
|
||||
gitlab_shell:
|
||||
|
|
|
@ -41,13 +41,15 @@ module Gitlab
|
|||
|
||||
# Default branch in the repository
|
||||
def root_ref
|
||||
@root_ref ||= Gitlab::GitalyClient.migrate(:root_ref) do |is_enabled|
|
||||
if is_enabled
|
||||
gitaly_ref_client.default_branch_name
|
||||
else
|
||||
discover_default_branch
|
||||
end
|
||||
end
|
||||
# NOTE: This feature is intentionally disabled until
|
||||
# https://gitlab.com/gitlab-org/gitaly/issues/179 is resolved
|
||||
# @root_ref ||= Gitlab::GitalyClient.migrate(:root_ref) do |is_enabled|
|
||||
# if is_enabled
|
||||
# gitaly_ref_client.default_branch_name
|
||||
# else
|
||||
@root_ref ||= discover_default_branch
|
||||
# end
|
||||
# end
|
||||
rescue GRPC::BadStatus => e
|
||||
raise CommandError.new(e)
|
||||
end
|
||||
|
@ -66,13 +68,15 @@ module Gitlab
|
|||
# Returns an Array of branch names
|
||||
# sorted by name ASC
|
||||
def branch_names
|
||||
Gitlab::GitalyClient.migrate(:branch_names) do |is_enabled|
|
||||
if is_enabled
|
||||
gitaly_ref_client.branch_names
|
||||
else
|
||||
branches.map(&:name)
|
||||
end
|
||||
end
|
||||
# Gitlab::GitalyClient.migrate(:branch_names) do |is_enabled|
|
||||
# NOTE: This feature is intentionally disabled until
|
||||
# https://gitlab.com/gitlab-org/gitaly/issues/179 is resolved
|
||||
# if is_enabled
|
||||
# gitaly_ref_client.branch_names
|
||||
# else
|
||||
branches.map(&:name)
|
||||
# end
|
||||
# end
|
||||
rescue GRPC::BadStatus => e
|
||||
raise CommandError.new(e)
|
||||
end
|
||||
|
@ -127,13 +131,15 @@ module Gitlab
|
|||
|
||||
# Returns an Array of tag names
|
||||
def tag_names
|
||||
Gitlab::GitalyClient.migrate(:tag_names) do |is_enabled|
|
||||
if is_enabled
|
||||
gitaly_ref_client.tag_names
|
||||
else
|
||||
rugged.tags.map { |t| t.name }
|
||||
end
|
||||
end
|
||||
# Gitlab::GitalyClient.migrate(:tag_names) do |is_enabled|
|
||||
# NOTE: This feature is intentionally disabled until
|
||||
# https://gitlab.com/gitlab-org/gitaly/issues/179 is resolved
|
||||
# if is_enabled
|
||||
# gitaly_ref_client.tag_names
|
||||
# else
|
||||
rugged.tags.map { |t| t.name }
|
||||
# end
|
||||
# end
|
||||
rescue GRPC::BadStatus => e
|
||||
raise CommandError.new(e)
|
||||
end
|
||||
|
@ -454,17 +460,19 @@ module Gitlab
|
|||
|
||||
# Returns a RefName for a given SHA
|
||||
def ref_name_for_sha(ref_path, sha)
|
||||
Gitlab::GitalyClient.migrate(:find_ref_name) do |is_enabled|
|
||||
if is_enabled
|
||||
gitaly_ref_client.find_ref_name(sha, ref_path)
|
||||
else
|
||||
args = %W(#{Gitlab.config.git.bin_path} for-each-ref --count=1 #{ref_path} --contains #{sha})
|
||||
# NOTE: This feature is intentionally disabled until
|
||||
# https://gitlab.com/gitlab-org/gitaly/issues/180 is resolved
|
||||
# Gitlab::GitalyClient.migrate(:find_ref_name) do |is_enabled|
|
||||
# if is_enabled
|
||||
# gitaly_ref_client.find_ref_name(sha, ref_path)
|
||||
# else
|
||||
args = %W(#{Gitlab.config.git.bin_path} for-each-ref --count=1 #{ref_path} --contains #{sha})
|
||||
|
||||
# Not found -> ["", 0]
|
||||
# Found -> ["b8d95eb4969eefacb0a58f6a28f6803f8070e7b9 commit\trefs/environments/production/77\n", 0]
|
||||
Gitlab::Popen.popen(args, @path).first.split.last
|
||||
end
|
||||
end
|
||||
# Not found -> ["", 0]
|
||||
# Found -> ["b8d95eb4969eefacb0a58f6a28f6803f8070e7b9 commit\trefs/environments/production/77\n", 0]
|
||||
Gitlab::Popen.popen(args, @path).first.split.last
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
# Returns commits collection
|
||||
|
|
|
@ -24,20 +24,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
|
|||
end
|
||||
end
|
||||
|
||||
context 'with gitaly enabled' do
|
||||
before { stub_gitaly }
|
||||
|
||||
it 'gets the branch name from GitalyClient' do
|
||||
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name)
|
||||
repository.root_ref
|
||||
end
|
||||
|
||||
it 'wraps GRPC exceptions' do
|
||||
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name).
|
||||
and_raise(GRPC::Unknown)
|
||||
expect { repository.root_ref }.to raise_error(Gitlab::Git::CommandError)
|
||||
end
|
||||
end
|
||||
# TODO: Uncomment when feature is reenabled
|
||||
# context 'with gitaly enabled' do
|
||||
# before { stub_gitaly }
|
||||
#
|
||||
# it 'gets the branch name from GitalyClient' do
|
||||
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name)
|
||||
# repository.root_ref
|
||||
# end
|
||||
#
|
||||
# it 'wraps GRPC exceptions' do
|
||||
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name).
|
||||
# and_raise(GRPC::Unknown)
|
||||
# expect { repository.root_ref }.to raise_error(Gitlab::Git::CommandError)
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
describe "#discover_default_branch" do
|
||||
|
@ -82,20 +83,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
|
|||
it { is_expected.to include("master") }
|
||||
it { is_expected.not_to include("branch-from-space") }
|
||||
|
||||
context 'with gitaly enabled' do
|
||||
before { stub_gitaly }
|
||||
|
||||
it 'gets the branch names from GitalyClient' do
|
||||
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names)
|
||||
subject
|
||||
end
|
||||
|
||||
it 'wraps GRPC exceptions' do
|
||||
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names).
|
||||
and_raise(GRPC::Unknown)
|
||||
expect { subject }.to raise_error(Gitlab::Git::CommandError)
|
||||
end
|
||||
end
|
||||
# TODO: Uncomment when feature is reenabled
|
||||
# context 'with gitaly enabled' do
|
||||
# before { stub_gitaly }
|
||||
#
|
||||
# it 'gets the branch names from GitalyClient' do
|
||||
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names)
|
||||
# subject
|
||||
# end
|
||||
#
|
||||
# it 'wraps GRPC exceptions' do
|
||||
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names).
|
||||
# and_raise(GRPC::Unknown)
|
||||
# expect { subject }.to raise_error(Gitlab::Git::CommandError)
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
describe '#tag_names' do
|
||||
|
@ -113,20 +115,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
|
|||
it { is_expected.to include("v1.0.0") }
|
||||
it { is_expected.not_to include("v5.0.0") }
|
||||
|
||||
context 'with gitaly enabled' do
|
||||
before { stub_gitaly }
|
||||
|
||||
it 'gets the tag names from GitalyClient' do
|
||||
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names)
|
||||
subject
|
||||
end
|
||||
|
||||
it 'wraps GRPC exceptions' do
|
||||
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names).
|
||||
and_raise(GRPC::Unknown)
|
||||
expect { subject }.to raise_error(Gitlab::Git::CommandError)
|
||||
end
|
||||
end
|
||||
# TODO: Uncomment when feature is reenabled
|
||||
# context 'with gitaly enabled' do
|
||||
# before { stub_gitaly }
|
||||
#
|
||||
# it 'gets the tag names from GitalyClient' do
|
||||
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names)
|
||||
# subject
|
||||
# end
|
||||
#
|
||||
# it 'wraps GRPC exceptions' do
|
||||
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names).
|
||||
# and_raise(GRPC::Unknown)
|
||||
# expect { subject }.to raise_error(Gitlab::Git::CommandError)
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
shared_examples 'archive check' do |extenstion|
|
||||
|
|
|
@ -389,31 +389,32 @@ eos
|
|||
end
|
||||
end
|
||||
|
||||
describe '#raw_diffs' do
|
||||
context 'Gitaly commit_raw_diffs feature enabled' do
|
||||
before do
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:commit_raw_diffs).and_return(true)
|
||||
end
|
||||
|
||||
context 'when a truthy deltas_only is not passed to args' do
|
||||
it 'fetches diffs from Gitaly server' do
|
||||
expect(Gitlab::GitalyClient::Commit).to receive(:diff_from_parent).
|
||||
with(commit)
|
||||
|
||||
commit.raw_diffs
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a truthy deltas_only is passed to args' do
|
||||
it 'fetches diffs using Rugged' do
|
||||
opts = { deltas_only: true }
|
||||
|
||||
expect(Gitlab::GitalyClient::Commit).not_to receive(:diff_from_parent)
|
||||
expect(commit.raw).to receive(:diffs).with(opts)
|
||||
|
||||
commit.raw_diffs(opts)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
# describe '#raw_diffs' do
|
||||
# TODO: Uncomment when feature is reenabled
|
||||
# context 'Gitaly commit_raw_diffs feature enabled' do
|
||||
# before do
|
||||
# allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:commit_raw_diffs).and_return(true)
|
||||
# end
|
||||
#
|
||||
# context 'when a truthy deltas_only is not passed to args' do
|
||||
# it 'fetches diffs from Gitaly server' do
|
||||
# expect(Gitlab::GitalyClient::Commit).to receive(:diff_from_parent).
|
||||
# with(commit)
|
||||
#
|
||||
# commit.raw_diffs
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# context 'when a truthy deltas_only is passed to args' do
|
||||
# it 'fetches diffs using Rugged' do
|
||||
# opts = { deltas_only: true }
|
||||
#
|
||||
# expect(Gitlab::GitalyClient::Commit).not_to receive(:diff_from_parent)
|
||||
# expect(commit.raw).to receive(:diffs).with(opts)
|
||||
#
|
||||
# commit.raw_diffs(opts)
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
|
|
@ -110,17 +110,18 @@ describe Environment, models: true do
|
|||
end
|
||||
end
|
||||
|
||||
context 'Gitaly find_ref_name feature enabled' do
|
||||
before do
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:find_ref_name).and_return(true)
|
||||
end
|
||||
|
||||
it 'calls GitalyClient' do
|
||||
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:find_ref_name)
|
||||
|
||||
environment.first_deployment_for(commit)
|
||||
end
|
||||
end
|
||||
# TODO: Uncomment when feature is reenabled
|
||||
# context 'Gitaly find_ref_name feature enabled' do
|
||||
# before do
|
||||
# allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:find_ref_name).and_return(true)
|
||||
# end
|
||||
#
|
||||
# it 'calls GitalyClient' do
|
||||
# expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:find_ref_name)
|
||||
#
|
||||
# environment.first_deployment_for(commit)
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
describe '#environment_type' do
|
||||
|
|
|
@ -1831,16 +1831,17 @@ describe Repository, models: true do
|
|||
end
|
||||
end
|
||||
|
||||
describe '#is_ancestor?' do
|
||||
context 'Gitaly is_ancestor feature enabled' do
|
||||
it 'asks Gitaly server if it\'s an ancestor' do
|
||||
commit = repository.commit
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:is_ancestor).and_return(true)
|
||||
expect(Gitlab::GitalyClient::Commit).to receive(:is_ancestor).
|
||||
with(repository.raw_repository, commit.id, commit.id).and_return(true)
|
||||
|
||||
expect(repository.is_ancestor?(commit.id, commit.id)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
# TODO: Uncomment when feature is reenabled
|
||||
# describe '#is_ancestor?' do
|
||||
# context 'Gitaly is_ancestor feature enabled' do
|
||||
# it 'asks Gitaly server if it\'s an ancestor' do
|
||||
# commit = repository.commit
|
||||
# allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:is_ancestor).and_return(true)
|
||||
# expect(Gitlab::GitalyClient::Commit).to receive(:is_ancestor).
|
||||
# with(repository.raw_repository, commit.id, commit.id).and_return(true)
|
||||
#
|
||||
# expect(repository.is_ancestor?(commit.id, commit.id)).to be true
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
|
|
@ -59,6 +59,10 @@ RSpec.configure do |config|
|
|||
TestEnv.init
|
||||
end
|
||||
|
||||
config.after(:suite) do
|
||||
TestEnv.cleanup
|
||||
end
|
||||
|
||||
if ENV['CI']
|
||||
# Retry only on feature specs that use JS
|
||||
config.around :each, :js do |ex|
|
||||
|
|
7
spec/support/gitaly.rb
Normal file
7
spec/support/gitaly.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
if Gitlab::GitalyClient.enabled?
|
||||
RSpec.configure do |config|
|
||||
config.before(:each) do
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).and_return(true)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -64,6 +64,8 @@ module TestEnv
|
|||
# Setup GitLab shell for test instance
|
||||
setup_gitlab_shell
|
||||
|
||||
setup_gitaly if Gitlab::GitalyClient.enabled?
|
||||
|
||||
# Create repository for FactoryGirl.create(:project)
|
||||
setup_factory_repo
|
||||
|
||||
|
@ -71,6 +73,10 @@ module TestEnv
|
|||
setup_forked_repo
|
||||
end
|
||||
|
||||
def cleanup
|
||||
stop_gitaly
|
||||
end
|
||||
|
||||
def disable_mailer
|
||||
allow_any_instance_of(NotificationService).to receive(:mailer).
|
||||
and_return(double.as_null_object)
|
||||
|
@ -92,7 +98,7 @@ module TestEnv
|
|||
tmp_test_path = Rails.root.join('tmp', 'tests', '**')
|
||||
|
||||
Dir[tmp_test_path].each do |entry|
|
||||
unless File.basename(entry) =~ /\Agitlab-(shell|test|test_bare|test-fork|test-fork_bare)\z/
|
||||
unless File.basename(entry) =~ /\A(gitaly|gitlab-(shell|test|test_bare|test-fork|test-fork_bare))\z/
|
||||
FileUtils.rm_rf(entry)
|
||||
end
|
||||
end
|
||||
|
@ -110,6 +116,28 @@ module TestEnv
|
|||
end
|
||||
end
|
||||
|
||||
def setup_gitaly
|
||||
socket_path = Gitlab::GitalyClient.get_address('default').sub(/\Aunix:/, '')
|
||||
gitaly_dir = File.dirname(socket_path)
|
||||
|
||||
unless File.directory?(gitaly_dir) || system('rake', "gitlab:gitaly:install[#{gitaly_dir}]")
|
||||
raise "Can't clone gitaly"
|
||||
end
|
||||
|
||||
start_gitaly(gitaly_dir, socket_path)
|
||||
end
|
||||
|
||||
def start_gitaly(gitaly_dir, socket_path)
|
||||
gitaly_exec = File.join(gitaly_dir, 'gitaly')
|
||||
@gitaly_pid = spawn({ "GITALY_SOCKET_PATH" => socket_path }, gitaly_exec, [:out, :err] => '/dev/null')
|
||||
end
|
||||
|
||||
def stop_gitaly
|
||||
return unless @gitaly_pid
|
||||
|
||||
Process.kill('KILL', @gitaly_pid)
|
||||
end
|
||||
|
||||
def setup_factory_repo
|
||||
setup_repo(factory_repo_path, factory_repo_path_bare, factory_repo_name,
|
||||
BRANCH_SHA)
|
||||
|
|
Loading…
Reference in a new issue