Remove git rake tasks
These tasks are happening through housekeeping right now, by default
ever 10th push. This removes the need for these tasks.
Side note, this removes one of my first contributions to GitLab, as back
than I introduced these tasks through: 54e6c0045b
Closes https://gitlab.com/gitlab-org/gitaly/issues/768
This commit is contained in:
parent
02e35a0d26
commit
f1f7bfc06f
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Remove git maintainance housekeeping tasks
|
||||||
|
merge_request: 20806
|
||||||
|
author:
|
||||||
|
type: removed
|
|
@ -28,12 +28,6 @@ exactly which repositories are causing the trouble.
|
||||||
|
|
||||||
### Check all GitLab repositories
|
### Check all GitLab repositories
|
||||||
|
|
||||||
>**Note:**
|
|
||||||
>
|
|
||||||
> - `gitlab:repo:check` has been deprecated in favor of `gitlab:git:fsck`
|
|
||||||
> - [Deprecated][ce-15931] in GitLab 10.4.
|
|
||||||
> - `gitlab:repo:check` will be removed in the future. [Removal issue][ce-41699]
|
|
||||||
|
|
||||||
This task loops through all repositories on the GitLab server and runs the
|
This task loops through all repositories on the GitLab server and runs the
|
||||||
3 integrity checks described previously.
|
3 integrity checks described previously.
|
||||||
|
|
||||||
|
@ -167,5 +161,4 @@ The LDAP check Rake task will test the bind_dn and password credentials
|
||||||
executed as part of the `gitlab:check` task, but can run independently.
|
executed as part of the `gitlab:check` task, but can run independently.
|
||||||
See [LDAP Rake Tasks - LDAP Check](ldap.md#check) for details.
|
See [LDAP Rake Tasks - LDAP Check](ldap.md#check) for details.
|
||||||
|
|
||||||
[ce-15931]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/15931
|
[git-fsck]: https://git-scm.com/docs/git-fsck
|
||||||
[ce-41699]: https://gitlab.com/gitlab-org/gitlab-ce/issues/41699
|
|
||||||
|
|
|
@ -385,14 +385,6 @@ namespace :gitlab do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :repo do
|
|
||||||
desc "GitLab | Check the integrity of the repositories managed by GitLab"
|
|
||||||
task check: :gitlab_environment do
|
|
||||||
puts "This task is deprecated. Please use gitlab:git:fsck instead".color(:red)
|
|
||||||
Rake::Task["gitlab:git:fsck"].execute
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
namespace :orphans do
|
namespace :orphans do
|
||||||
desc 'Gitlab | Check for orphaned namespaces and repositories'
|
desc 'Gitlab | Check for orphaned namespaces and repositories'
|
||||||
task check: :gitlab_environment do
|
task check: :gitlab_environment do
|
||||||
|
|
|
@ -1,87 +1,24 @@
|
||||||
namespace :gitlab do
|
namespace :gitlab do
|
||||||
namespace :git do
|
namespace :git do
|
||||||
desc "GitLab | Git | Repack"
|
|
||||||
task repack: :gitlab_environment do
|
|
||||||
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} repack -a --quiet), "Repacking repo")
|
|
||||||
if failures.empty?
|
|
||||||
puts "Done".color(:green)
|
|
||||||
else
|
|
||||||
output_failures(failures)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
desc "GitLab | Git | Run garbage collection on all repos"
|
|
||||||
task gc: :gitlab_environment do
|
|
||||||
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} gc --auto --quiet), "Garbage Collecting")
|
|
||||||
if failures.empty?
|
|
||||||
puts "Done".color(:green)
|
|
||||||
else
|
|
||||||
output_failures(failures)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
desc "GitLab | Git | Prune all repos"
|
|
||||||
task prune: :gitlab_environment do
|
|
||||||
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} prune), "Git Prune")
|
|
||||||
if failures.empty?
|
|
||||||
puts "Done".color(:green)
|
|
||||||
else
|
|
||||||
output_failures(failures)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
desc 'GitLab | Git | Check all repos integrity'
|
desc 'GitLab | Git | Check all repos integrity'
|
||||||
task fsck: :gitlab_environment do
|
task fsck: :gitlab_environment do
|
||||||
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} fsck --name-objects --no-progress), "Checking integrity") do |repo|
|
failures = []
|
||||||
check_config_lock(repo)
|
Project.find_each(batch_size: 100) do |project|
|
||||||
check_ref_locks(repo)
|
begin
|
||||||
|
project.repository.fsck
|
||||||
|
|
||||||
|
rescue => e
|
||||||
|
failures << "#{project.full_path} on #{project.repository_storage}: #{e}"
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Performed integrity check for #{project.repository.full_path}"
|
||||||
end
|
end
|
||||||
|
|
||||||
if failures.empty?
|
if failures.empty?
|
||||||
puts "Done".color(:green)
|
puts "Done".color(:green)
|
||||||
else
|
else
|
||||||
output_failures(failures)
|
puts "The following repositories reported errors:".color(:red)
|
||||||
end
|
failures.each { |f| puts "- #{f}" }
|
||||||
end
|
|
||||||
|
|
||||||
def perform_git_cmd(cmd, message)
|
|
||||||
puts "Starting #{message} on all repositories"
|
|
||||||
|
|
||||||
failures = []
|
|
||||||
all_repos do |repo|
|
|
||||||
if system(*cmd, chdir: repo)
|
|
||||||
puts "Performed #{message} at #{repo}"
|
|
||||||
else
|
|
||||||
failures << repo
|
|
||||||
end
|
|
||||||
|
|
||||||
yield(repo) if block_given?
|
|
||||||
end
|
|
||||||
|
|
||||||
failures
|
|
||||||
end
|
|
||||||
|
|
||||||
def output_failures(failures)
|
|
||||||
puts "The following repositories reported errors:".color(:red)
|
|
||||||
failures.each { |f| puts "- #{f}" }
|
|
||||||
end
|
|
||||||
|
|
||||||
def check_config_lock(repo_dir)
|
|
||||||
config_exists = File.exist?(File.join(repo_dir, 'config.lock'))
|
|
||||||
config_output = config_exists ? 'yes'.color(:red) : 'no'.color(:green)
|
|
||||||
|
|
||||||
puts "'config.lock' file exists?".color(:yellow) + " ... #{config_output}"
|
|
||||||
end
|
|
||||||
|
|
||||||
def check_ref_locks(repo_dir)
|
|
||||||
lock_files = Dir.glob(File.join(repo_dir, 'refs/heads/*.lock'))
|
|
||||||
|
|
||||||
if lock_files.present?
|
|
||||||
puts "Ref lock files exist:".color(:red)
|
|
||||||
|
|
||||||
lock_files.each { |lock_file| puts " #{lock_file}" }
|
|
||||||
else
|
|
||||||
puts "No ref lock files exist".color(:green)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,45 +2,19 @@ require 'rake_helper'
|
||||||
|
|
||||||
describe 'gitlab:git rake tasks' do
|
describe 'gitlab:git rake tasks' do
|
||||||
let(:base_path) { 'tmp/tests/default_storage' }
|
let(:base_path) { 'tmp/tests/default_storage' }
|
||||||
|
let!(:project) { create(:project, :repository) }
|
||||||
before(:all) do
|
|
||||||
@default_storage_hash = Gitlab.config.repositories.storages.default.to_h
|
|
||||||
end
|
|
||||||
|
|
||||||
before do
|
before do
|
||||||
Rake.application.rake_require 'tasks/gitlab/git'
|
Rake.application.rake_require 'tasks/gitlab/git'
|
||||||
storages = { 'default' => Gitlab::GitalyClient::StorageSettings.new(@default_storage_hash.merge('path' => base_path)) }
|
|
||||||
|
|
||||||
path = Settings.absolute("#{base_path}/@hashed/1/2/test.git")
|
|
||||||
FileUtils.mkdir_p(path)
|
|
||||||
Gitlab::Popen.popen(%W[git -C #{path} init --bare])
|
|
||||||
|
|
||||||
allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
|
|
||||||
allow_any_instance_of(String).to receive(:color) { |string, _color| string }
|
allow_any_instance_of(String).to receive(:color) { |string, _color| string }
|
||||||
|
|
||||||
stub_warn_user_is_not_gitlab
|
stub_warn_user_is_not_gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
|
||||||
FileUtils.rm_rf(Settings.absolute(base_path))
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'fsck' do
|
describe 'fsck' do
|
||||||
it 'outputs the integrity check for a repo' do
|
it 'outputs the integrity check for a repo' do
|
||||||
expect { run_rake_task('gitlab:git:fsck') }.to output(%r{Performed Checking integrity at .*@hashed/1/2/test.git}).to_stdout
|
expect { run_rake_task('gitlab:git:fsck') }.to output(/Performed integrity check for/).to_stdout
|
||||||
end
|
|
||||||
|
|
||||||
it 'errors out about config.lock issues' do
|
|
||||||
FileUtils.touch(Settings.absolute("#{base_path}/@hashed/1/2/test.git/config.lock"))
|
|
||||||
|
|
||||||
expect { run_rake_task('gitlab:git:fsck') }.to output(/file exists\? ... yes/).to_stdout
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'errors out about ref lock issues' do
|
|
||||||
FileUtils.mkdir_p(Settings.absolute("#{base_path}/@hashed/1/2/test.git/refs/heads"))
|
|
||||||
FileUtils.touch(Settings.absolute("#{base_path}/@hashed/1/2/test.git/refs/heads/blah.lock"))
|
|
||||||
|
|
||||||
expect { run_rake_task('gitlab:git:fsck') }.to output(/Ref lock files exist:/).to_stdout
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue