cleanup.rake 4.13 KB
Newer Older
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
1
2
namespace :gitlab do
  namespace :cleanup do
3
    desc "GitLab | Cleanup | Clean namespaces"
4
    task dirs: :environment  do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
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, repository_storage|
        git_base_path = repository_storage['path']
11
        all_dirs = Dir.glob(git_base_path + '/*')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
12

13
14
        puts git_base_path.color(:yellow)
        puts "Looking for directories to remove... "
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
15

16
17
18
19
        all_dirs.reject! do |dir|
          # skip if git repo
          dir =~ /.git$/
        end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
20

21
22
        all_dirs.reject! do |dir|
          dir_name = File.basename dir
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
23

24
25
26
          # skip if namespace present
          namespaces.include?(dir_name)
        end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
27

28
29
30
31
32
33
34
        all_dirs.each do |dir_path|
          if remove_flag
            if FileUtils.rm_rf dir_path
              puts "Removed...#{dir_path}".color(:red)
            else
              puts "Cannot remove #{dir_path}".color(:red)
            end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
35
          else
36
            puts "Can be removed: #{dir_path}".color(:red)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
37
38
39
40
41
          end
        end
      end

      unless remove_flag
42
        puts "To cleanup this directories run this command with REMOVE=true".color(:yellow)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
43
44
45
      end
    end

46
    desc "GitLab | Cleanup | Clean repositories"
47
    task repos: :environment  do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
48
49
      warn_user_is_not_gitlab

Jacob Vosmaer's avatar
Jacob Vosmaer committed
50
      move_suffix = "+orphaned+#{Time.now.to_i}"
51
52
      Gitlab.config.repositories.storages.each do |name, repository_storage|
        repo_root = repository_storage['path']
53
54
55
56
        # 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!
57
58
59
60
61
            repo_with_namespace = path
              .sub(repo_root, '')
              .sub(%r{^/*}, '')
              .chomp('.git')
              .chomp('.wiki')
62
<<<<<<< HEAD
63
            next if Project.find_by_full_path(repo_with_namespace)
64
65
66
67
68
69
70
=======

            # TODO ignoring hashed repositories for now.  But revisit to fully support
            # possible orphaned hashed repos
            next if repo_with_namespace.start_with?('@hashed/') || Project.find_by_full_path(repo_with_namespace)

>>>>>>> b462edfddb... Merge branch '40291-ignore-hashed-repos-cleanup-repositories' into 'master'
71
72
73
74
            new_path = path + move_suffix
            puts path.inspect + ' -> ' + new_path.inspect
            File.rename(path, new_path)
          end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
75
76
77
        end
      end
    end
78

79
    desc "GitLab | Cleanup | Block users that have been removed in LDAP"
80
81
82
83
    task block_removed_ldap_users: :environment  do
      warn_user_is_not_gitlab
      block_flag = ENV['BLOCK']

84
85
86
87
      User.find_each do |user|
        next unless user.ldap_user?
        print "#{user.name} (#{user.ldap_identity.extern_uid}) ..."
        if Gitlab::LDAP::Access.allowed?(user)
88
          puts " [OK]".color(:green)
89
90
        else
          if block_flag
91
            user.block! unless user.blocked?
92
            puts " [BLOCKED]".color(:red)
93
          else
94
            puts " [NOT IN LDAP]".color(:yellow)
95
96
97
98
99
          end
        end
      end

      unless block_flag
100
        puts "To block these users run this command with BLOCK=true".color(:yellow)
101
102
      end
    end
Z.J. van de Weg's avatar
Z.J. van de Weg committed
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121

    # 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
122
          project.repository.delete_refs(ref)
Z.J. van de Weg's avatar
Z.J. van de Weg committed
123
124
125
        end
      end
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
126
127
  end
end