cleanup.rake 3.7 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2
namespace :gitlab do
  namespace :cleanup do
3
    desc "GitLab | Cleanup | Clean namespaces"
4
    task dirs: :environment  do
D
Dmitriy Zaporozhets 已提交
5 6 7 8
      warn_user_is_not_gitlab
      remove_flag = ENV['REMOVE']

      namespaces = Namespace.pluck(:path)
9 10
      Gitlab.config.repositories.storages.each do |name, git_base_path|
        all_dirs = Dir.glob(git_base_path + '/*')
D
Dmitriy Zaporozhets 已提交
11

12 13
        puts git_base_path.color(:yellow)
        puts "Looking for directories to remove... "
D
Dmitriy Zaporozhets 已提交
14

15 16 17 18
        all_dirs.reject! do |dir|
          # skip if git repo
          dir =~ /.git$/
        end
D
Dmitriy Zaporozhets 已提交
19

20 21
        all_dirs.reject! do |dir|
          dir_name = File.basename dir
D
Dmitriy Zaporozhets 已提交
22

23 24 25
          # skip if namespace present
          namespaces.include?(dir_name)
        end
D
Dmitriy Zaporozhets 已提交
26

27
        all_dirs.each do |dir_path|
D
Dmitriy Zaporozhets 已提交
28

29 30 31 32 33 34
          if remove_flag
            if FileUtils.rm_rf dir_path
              puts "Removed...#{dir_path}".color(:red)
            else
              puts "Cannot remove #{dir_path}".color(:red)
            end
D
Dmitriy Zaporozhets 已提交
35
          else
36
            puts "Can be removed: #{dir_path}".color(:red)
D
Dmitriy Zaporozhets 已提交
37 38 39 40 41
          end
        end
      end

      unless remove_flag
C
Connor Shea 已提交
42
        puts "To cleanup this directories run this command with REMOVE=true".color(:yellow)
D
Dmitriy Zaporozhets 已提交
43 44 45
      end
    end

46
    desc "GitLab | Cleanup | Clean repositories"
47
    task repos: :environment  do
D
Dmitriy Zaporozhets 已提交
48 49
      warn_user_is_not_gitlab

J
Jacob Vosmaer 已提交
50
      move_suffix = "+orphaned+#{Time.now.to_i}"
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
      Gitlab.config.repositories.storages.each do |name, repo_root|
        # Look for global repos (legacy, depth 1) and normal repos (depth 2)
        IO.popen(%W(find #{repo_root} -mindepth 1 -maxdepth 2 -name *.git)) do |find|
          find.each_line do |path|
            path.chomp!
            repo_with_namespace = path.
              sub(repo_root, '').
              sub(%r{^/*}, '').
              chomp('.git').
              chomp('.wiki')
            next if Project.find_with_namespace(repo_with_namespace)
            new_path = path + move_suffix
            puts path.inspect + ' -> ' + new_path.inspect
            File.rename(path, new_path)
          end
D
Dmitriy Zaporozhets 已提交
66 67 68
        end
      end
    end
69

70
    desc "GitLab | Cleanup | Block users that have been removed in LDAP"
71 72 73 74
    task block_removed_ldap_users: :environment  do
      warn_user_is_not_gitlab
      block_flag = ENV['BLOCK']

75 76 77 78
      User.find_each do |user|
        next unless user.ldap_user?
        print "#{user.name} (#{user.ldap_identity.extern_uid}) ..."
        if Gitlab::LDAP::Access.allowed?(user)
C
Connor Shea 已提交
79
          puts " [OK]".color(:green)
80 81
        else
          if block_flag
82
            user.block! unless user.blocked?
C
Connor Shea 已提交
83
            puts " [BLOCKED]".color(:red)
84
          else
C
Connor Shea 已提交
85
            puts " [NOT IN LDAP]".color(:yellow)
86 87 88 89 90
          end
        end
      end

      unless block_flag
C
Connor Shea 已提交
91
        puts "To block these users run this command with BLOCK=true".color(:yellow)
92 93
      end
    end
Z
Z.J. van de Weg 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

    # This is a rake task which removes faulty refs. These refs where only
    # created in the 8.13.RC cycle, and fixed in the stable builds which were
    # released. So likely this should only be run once on gitlab.com
    # Faulty refs are moved so they are kept around, else some features break.
    desc 'GitLab | Cleanup | Remove faulty deployment refs'
    task move_faulty_deployment_refs: :environment do
      projects = Project.where(id: Deployment.select(:project_id).distinct)

      projects.find_each do |project|
        rugged = project.repository.rugged

        max_iid = project.deployments.maximum(:iid)

        rugged.references.each('refs/environments/**/*') do |ref|
          id = ref.name.split('/').last.to_i
          next unless id > max_iid

          project.deployments.find(id).create_ref
          rugged.references.delete(ref)
        end
      end
    end
D
Dmitriy Zaporozhets 已提交
117 118
  end
end