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
5 changed files with 20 additions and 119 deletions
5
changelogs/unreleased/zj-remove-git-rake-tasks.yml
Normal file
5
changelogs/unreleased/zj-remove-git-rake-tasks.yml
Normal file
|
@ -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
|
||||
|
||||
>**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
|
||||
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.
|
||||
See [LDAP Rake Tasks - LDAP Check](ldap.md#check) for details.
|
||||
|
||||
[ce-15931]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/15931
|
||||
[ce-41699]: https://gitlab.com/gitlab-org/gitlab-ce/issues/41699
|
||||
[git-fsck]: https://git-scm.com/docs/git-fsck
|
||||
|
|
|
@ -385,14 +385,6 @@ namespace :gitlab do
|
|||
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
|
||||
desc 'Gitlab | Check for orphaned namespaces and repositories'
|
||||
task check: :gitlab_environment do
|
||||
|
|
|
@ -1,87 +1,24 @@
|
|||
namespace :gitlab 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'
|
||||
task fsck: :gitlab_environment do
|
||||
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} fsck --name-objects --no-progress), "Checking integrity") do |repo|
|
||||
check_config_lock(repo)
|
||||
check_ref_locks(repo)
|
||||
failures = []
|
||||
Project.find_each(batch_size: 100) do |project|
|
||||
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
|
||||
|
||||
if failures.empty?
|
||||
puts "Done".color(:green)
|
||||
else
|
||||
output_failures(failures)
|
||||
end
|
||||
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)
|
||||
puts "The following repositories reported errors:".color(:red)
|
||||
failures.each { |f| puts "- #{f}" }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,45 +2,19 @@ require 'rake_helper'
|
|||
|
||||
describe 'gitlab:git rake tasks' do
|
||||
let(:base_path) { 'tmp/tests/default_storage' }
|
||||
|
||||
before(:all) do
|
||||
@default_storage_hash = Gitlab.config.repositories.storages.default.to_h
|
||||
end
|
||||
let!(:project) { create(:project, :repository) }
|
||||
|
||||
before do
|
||||
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 }
|
||||
|
||||
stub_warn_user_is_not_gitlab
|
||||
end
|
||||
|
||||
after do
|
||||
FileUtils.rm_rf(Settings.absolute(base_path))
|
||||
end
|
||||
|
||||
describe 'fsck' 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
|
||||
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
|
||||
expect { run_rake_task('gitlab:git:fsck') }.to output(/Performed integrity check for/).to_stdout
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue