#!/usr/bin/env ruby # cwd = __dir__ # $root = "#{cwd}/" # $: << $root # lib = File.expand_path('lib', __dir__) # $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) # require 'rubygems' # require 'bundler' # require 'bundler/setup' # Bundler.require(:default) require 'docker-api' require 'fugit' require 'optparse' require 'gitlab-janitor' UTIL = File.basename(__FILE__) GitlabJanitor::Util.setup @opts = { includes: [ENV.fetch('INCLUDE', '*units*').split(/[,;]/)].flatten.compact, excludes: [ENV.fetch('EXCLUDE', '*gitlab*').split(/[,;]/)].flatten.compact, clean_delay: ENV.fetch('CLEAN_DELAY', '10m'), container_deadline: ENV.fetch('CONTAINER_DEADLINE', '1h10m'), volume_includes: [ENV.fetch('IMAGE_INCLUDE', 'runner*cache*').split(/[,;]/)].flatten.compact, volume_deadline: ENV.fetch('VOLUME_DEADLINE', '3d'), image_deadline: ENV.fetch('IMAGE_DEADLINE', '14d'), image_store: ENV.fetch('IMAGE_STORE', './images.txt'), cache_size: ENV.fetch('CACHE_SIZE', '10G'), remove: ENV.fetch('REMOVE', 'false').to_bool, log_level: ENV.fetch('LOG_LEVEL', ::Logger::INFO), docker_host: ENV.fetch('DOCKER_HOST', 'unix:///var/run/docker.sock'), redis_url: ENV.fetch('REDIS_URL', 'redis://127.0.0.1:6379/0') } parser = OptionParser.new do |o| o.banner = "Usage: #{UTIL} [options] " o.on("--clean-delay=#{@opts[:clean_delay]}", 'ENV[CLEAN_DELAY]'.ljust(25) + 'Delay between clean operation.') do |pattern| @opts[:clean_delay] = pattern.strip end o.on("--include=#{@opts[:includes].join(',')}", 'ENV[INCLUDE]'.ljust(25) + ' Include container for removal.') do |pattern| @opts[:includes] += pattern.split(/[,;]/) end o.on("--exclude=#{@opts[:excludes].join(',')}", 'ENV[EXCLUDE]'.ljust(25) + ' Exclude container from removal by name.') do |pattern| @opts[:excludes] += pattern.split(/[,;]/) end o.on("--container-deadline=#{@opts[:container_deadline]}", 'ENV[CONTAINER_DEADLINE]'.ljust(25) + 'Maximum container run duration.') do |pattern| @opts[:container_deadline] = pattern.strip end o.on("--volume-include=#{@opts[:volume_includes].join(',')}", 'ENV[VOLUME_INCLUDE]'.ljust(25) + ' Include volumes for removal.') do |pattern| @opts[:volume_includes] += pattern.split(/[,;]/) end o.on("--volume-deadline=#{@opts[:volume_deadline]}", 'ENV[VOLUME_DEADLINE]'.ljust(25) + 'Maximum volume life duration.') do |pattern| @opts[:volume_deadline] = pattern.strip end o.on("--image-deadline=#{@opts[:image_deadline]}", 'ENV[IMAGE_DEADLINE]'.ljust(25) + 'Maximum image life duration.') do |pattern| @opts[:image_deadline] = pattern.strip end o.on("--image-store=#{@opts[:image_store]}", 'ENV[IMAGE_STORE]'.ljust(25) + 'File to store images timestamps.') do |value| @opts[:image_store] = value.strip end o.on("--cache-size=#{@opts[:cache_size]}", 'ENV[CACHE_SIZE]'.ljust(25) + 'Size of docker cache to keep.') do |value| @opts[:cache_size] = value.strip end o.on('--remove', 'ENV[REMOVE]'.ljust(25) + 'Real remove instead of dry run.') do |value| @opts[:remove] = value.strip.to_bool end o.on("--docker=#{@opts[:docker_host]}", 'ENV[DOCKER_HOST]'.ljust(25) + 'Docker api endpoint.') do |url| @opts[:docker_host] = url.strip end o.on("--redis=#{@opts[:redis_url]}", 'ENV[REDIS_URL]'.ljust(25) + 'Redis endpoint.') do |url| @opts[:redis_url] = url.strip end o.on('--debug', 'ENV[LOG_LEVEL]'.ljust(25) + 'Verbose logs. ENV values: debug, info, warn, error') do @opts[:log_level] = ::Logger::DEBUG end end parser.parse! Docker.url = @opts[:docker_host] GitlabJanitor::Util.logger.level = @opts[:log_level] GitlabJanitor::Util.logger.debug do "Config: #{JSON.pretty_generate(@opts)}" end containers = GitlabJanitor::ContainerCleaner.new( includes: @opts[:includes], excludes: @opts[:excludes], delay: Fugit::Duration.parse(@opts[:clean_delay]).to_sec, deadline: Fugit::Duration.parse(@opts[:container_deadline]).to_sec ) volumes = GitlabJanitor::VolumeCleaner.new( includes: @opts[:volume_includes], delay: Fugit::Duration.parse(@opts[:clean_delay]).to_sec, deadline: Fugit::Duration.parse(@opts[:volume_deadline]).to_sec ) images = GitlabJanitor::ImageCleaner.new( image_store: File.expand_path(@opts[:image_store]), redis: @opts[:redis_url], delay: Fugit::Duration.parse(@opts[:clean_delay]).to_sec, deadline: Fugit::Duration.parse(@opts[:image_deadline]).to_sec ) cache = GitlabJanitor::CacheCleaner.new( keep_size: @opts[:cache_size], delay: Fugit::Duration.parse(@opts[:clean_delay]).to_sec, deadline: Fugit::Duration.parse(@opts[:image_deadline]).to_sec ) until GitlabJanitor::Util.exiting? File.write('/tmp/service.pid', Process.pid) containers.clean(remove: @opts[:remove]) volumes.clean(remove: @opts[:remove]) images.clean(remove: @opts[:remove]) cache.clean(remove: @opts[:remove]) sleep 3 end