gitlab-janitor 0.0.3 → 1.0.2.92939
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Dockerfile +29 -4
- data/Gemfile +0 -3
- data/Gemfile.lock +7 -2
- data/README.md +150 -31
- data/bin/gitlab-janitor +80 -32
- data/docker-compose.yml +4 -0
- data/gitlab-janitor.gemspec +7 -4
- data/lib/gitlab-janitor.rb +2 -5
- data/lib/{gitlab-janitor/base-cleaner.rb → gitlab_janitor/base_cleaner.rb} +13 -5
- data/lib/gitlab_janitor/cache_cleaner.rb +24 -0
- data/lib/gitlab_janitor/container_cleaner.rb +120 -0
- data/lib/gitlab_janitor/image_cleaner/store.rb +66 -0
- data/lib/gitlab_janitor/image_cleaner.rb +140 -0
- data/lib/{gitlab-janitor → gitlab_janitor}/utils.rb +16 -21
- data/lib/gitlab_janitor/version.rb +6 -0
- data/lib/gitlab_janitor/volume_cleaner.rb +120 -0
- data/lib/gitlab_janitor.rb +8 -0
- metadata +50 -18
- data/lib/gitlab-janitor/container-cleaner.rb +0 -114
- data/lib/gitlab-janitor/version.rb +0 -5
- data/lib/gitlab-janitor/volume-cleaner.rb +0 -90
@@ -1,114 +0,0 @@
|
|
1
|
-
module GitlabJanitor
|
2
|
-
class ContainerCleaner < BaseCleaner
|
3
|
-
|
4
|
-
class Model < BaseCleaner::Model
|
5
|
-
def initialize(v)
|
6
|
-
super(v)
|
7
|
-
|
8
|
-
info['_Age'] = (Time.now - Time.at(created_at)).round(0)
|
9
|
-
end
|
10
|
-
|
11
|
-
def created_at
|
12
|
-
info['Created']
|
13
|
-
end
|
14
|
-
|
15
|
-
def name
|
16
|
-
@anme ||= info['Names'].first.sub(/^\//, '')
|
17
|
-
end
|
18
|
-
|
19
|
-
def age
|
20
|
-
info['_Age']
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
attr_reader :excludes, :includes
|
25
|
-
|
26
|
-
def initialize includes: [''], excludes: [''], **args
|
27
|
-
super(**args)
|
28
|
-
@includes = includes
|
29
|
-
@excludes = excludes
|
30
|
-
@deadline = deadline
|
31
|
-
end
|
32
|
-
|
33
|
-
def do_clean(remove: false)
|
34
|
-
to_remove, keep = prepare(Docker::Container.all(all: true).map{|m| Model.new(m)})
|
35
|
-
|
36
|
-
if !to_remove.empty?
|
37
|
-
keep.each do |c|
|
38
|
-
logger.debug(" KEEP #{c.name}")
|
39
|
-
end
|
40
|
-
|
41
|
-
if remove
|
42
|
-
logger.info "Removing containers..."
|
43
|
-
to_remove.each do |c|
|
44
|
-
logger.tagged(c.name) do
|
45
|
-
logger.debug " Removing..."
|
46
|
-
log_exception("Stop") {c.stop}
|
47
|
-
log_exception("Wait") {c.wait(15)}
|
48
|
-
log_exception("Remove") {c.remove}
|
49
|
-
logger.debug " Removing COMPLETED"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
else
|
53
|
-
logger.info "Skip removal due to dry run"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
def prepare containers
|
60
|
-
@logger.debug("Selecting containers by includes #{@includes}...")
|
61
|
-
to_remove = select_by_name(containers)
|
62
|
-
if to_remove.empty?
|
63
|
-
@logger.info("Noting to remove.")
|
64
|
-
return [], containers
|
65
|
-
end
|
66
|
-
@logger.info("Selected containers: \n#{to_remove.map{|c| " + #{format_item(c)}"}.join("\n")}")
|
67
|
-
|
68
|
-
@logger.debug("Filtering containers by excludes #{@excludes}...")
|
69
|
-
to_remove = reject_by_name(to_remove)
|
70
|
-
if to_remove.empty?
|
71
|
-
@logger.info("Noting to remove.")
|
72
|
-
return [], containers
|
73
|
-
end
|
74
|
-
@logger.info("Filtered containers: \n#{to_remove.map{|c| " + #{format_item(c)}"}.join("\n")}")
|
75
|
-
|
76
|
-
@logger.debug("Filtering containers by deadline: older than #{Fugit::Duration.parse(@deadline).deflate.to_plain_s}...")
|
77
|
-
to_remove = select_by_deadline(to_remove)
|
78
|
-
if to_remove.empty?
|
79
|
-
@logger.info("Noting to remove.")
|
80
|
-
return [], containers
|
81
|
-
end
|
82
|
-
@logger.info("Filtered containers: \n#{to_remove.map{|c| " + #{format_item(c)}"}.join("\n")}")
|
83
|
-
|
84
|
-
[to_remove, containers - to_remove]
|
85
|
-
end
|
86
|
-
|
87
|
-
def format_item c
|
88
|
-
"#{Time.at(c.created_at)} Age:#{Fugit::Duration.parse(c.age).deflate.to_plain_s.ljust(10)} #{c.name.first(60).ljust(60)}"
|
89
|
-
end
|
90
|
-
|
91
|
-
def select_by_name containers
|
92
|
-
containers.select do |c|
|
93
|
-
@includes.any? do |pattern|
|
94
|
-
File.fnmatch(pattern, c.name)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def reject_by_name containers
|
100
|
-
containers.reject do |c|
|
101
|
-
@excludes.any? do |pattern|
|
102
|
-
File.fnmatch(pattern, c.name)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def select_by_deadline containers
|
108
|
-
containers.select do |c|
|
109
|
-
c.age > deadline
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
114
|
-
end
|
@@ -1,90 +0,0 @@
|
|
1
|
-
module GitlabJanitor
|
2
|
-
class VolumeCleaner < BaseCleaner
|
3
|
-
|
4
|
-
class Model < BaseCleaner::Model
|
5
|
-
def initialize(v)
|
6
|
-
super(v)
|
7
|
-
|
8
|
-
info['_Age'] = (Time.now - Time.parse(created_at)).round(0)
|
9
|
-
end
|
10
|
-
|
11
|
-
def created_at
|
12
|
-
info['CreatedAt']
|
13
|
-
end
|
14
|
-
|
15
|
-
def name
|
16
|
-
info['Name']
|
17
|
-
end
|
18
|
-
|
19
|
-
def age
|
20
|
-
info['_Age']
|
21
|
-
end
|
22
|
-
|
23
|
-
def mountpoint
|
24
|
-
info['Mountpoint']
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def do_clean(remove: false)
|
29
|
-
to_remove, keep = prepare(Docker::Volume.all.map{|m| Model.new(m)})
|
30
|
-
|
31
|
-
if !to_remove.empty?
|
32
|
-
keep.each do |c|
|
33
|
-
logger.debug(" KEEP #{c.name}")
|
34
|
-
end
|
35
|
-
if remove
|
36
|
-
logger.info "Removing volumes..."
|
37
|
-
to_remove.each do |c|
|
38
|
-
logger.tagged(c.name.first(10)) do
|
39
|
-
logger.debug " Removing..."
|
40
|
-
log_exception("Remove") {c.remove}
|
41
|
-
logger.debug " Removing COMPLETED"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
else
|
45
|
-
logger.info "Skip removal due to dry run"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
def prepare volumes
|
52
|
-
@logger.debug("Selecting unnamed volumes...")
|
53
|
-
to_remove = select_unnamed(volumes)
|
54
|
-
if to_remove.empty?
|
55
|
-
@logger.info("Noting to remove.")
|
56
|
-
return [], volumes
|
57
|
-
end
|
58
|
-
@logger.info("Selected volumes: \n#{to_remove.map{|c| " + #{format_item(c)}"}.join("\n")}")
|
59
|
-
|
60
|
-
@logger.debug("Filtering volumes by deadline: older than #{@deadline} seconds...")
|
61
|
-
to_remove = select_by_deadline(to_remove)
|
62
|
-
if to_remove.empty?
|
63
|
-
@logger.info("Noting to remove.")
|
64
|
-
return [], volumes
|
65
|
-
end
|
66
|
-
@logger.info("Filtered volumes: \n#{to_remove.map{|c| " !! #{format_item(c)}"}.join("\n")}")
|
67
|
-
|
68
|
-
return to_remove, (volumes - to_remove)
|
69
|
-
end
|
70
|
-
|
71
|
-
def format_item c
|
72
|
-
"#{Time.parse(c.created_at)} Age:#{Fugit::Duration.parse(c.age).deflate.to_plain_s.ljust(13)} #{c.name.first(10).ljust(10)} #{c.mountpoint}"
|
73
|
-
end
|
74
|
-
|
75
|
-
SHA_RX = /^[a-zA-Z0-9]{64}$/
|
76
|
-
|
77
|
-
def select_unnamed volumes
|
78
|
-
volumes.select do |c|
|
79
|
-
SHA_RX.match(c.name)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def select_by_deadline containers
|
84
|
-
containers.select do |c|
|
85
|
-
c.age > deadline
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
end
|