#!/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 'active_support/all' require 'docker-api' require 'fugit' require 'optparse' require 'gitlab-janitor' UTIL = File.basename(__FILE__) GitlabJanitor::Util.setup @opts = { includes: [ENV.fetch('INCLUDE', '*units*')], excludes: [ENV.fetch('EXCLUDE', '*gitlab*')], clean_delay: ENV.fetch('CLEAN_DELAY', '30m'), container_deadline: ENV.fetch('CONTAINER_DEADLINE', '1h10m'), volume_deadline: ENV.fetch('VOLUME_DEADLINE', '2d6h'), image_deadline: ENV.fetch('IMAGE_DEADLINE', '20d'), remove: ENV.fetch('REMOVE', 'false').to_bool, docker_host: ENV.fetch('DOCKER_HOST', 'unix:///var/run/docker.sock') } parser = OptionParser.new do |o| o.banner = "Usage: #{UTIL} [options] " o.on("--clean-delay=#{@opts[:clean_delay]}", 'Delay between clean operation ENV[CLEAN_DELAY]') do |pattern| @opts[:clean_delay] = pattern.strip end o.on("--include=#{@opts[:includes].join(',')}", ' Include container for removal. ENV[INCLUDE]') do |pattern| @opts[:includes] += pattern.split(/[,;]/) end o.on("--exclude=#{@opts[:excludes].join(',')}", ' Exclude container from removal by name. ENV[EXCLUDE]') do |pattern| @opts[:excludes] += pattern.split(/[,;]/) end o.on("--container-deadline=#{@opts[:container_deadline]}", 'Maximum container run duration. ENV[CONTAINER_DEADLINE]') do |pattern| @opts[:container_deadline] = pattern.strip end o.on("--volume-deadline=#{@opts[:volume_deadline]}", 'Maximum volume life dudation. ENV[VOLUME_DEADLINE]') do |pattern| @opts[:volume_deadline] = pattern.strip end o.on("--image-deadline=#{@opts[:image_deadline]}", 'Maximum image life duration. ENV[IMAGE_DEADLINE]') do |pattern| @opts[:image_deadline] = pattern.strip end o.on("--remove", 'Real remove instead of dry run. ENV[REMOVE]') do |value| @opts[:remove] = value.strip.to_bool end o.on("--docker=#{@opts[:docker_host]}", 'Docker api endpoint. ENV[DOCKER_HOST]') do |url| @opts[:docker_host] = value.strip end end parser.parse! Docker.url = @opts[:docker_host] GitlabJanitor::Util::logger.debug do "Config: #{JSON.pretty_generate(@opts)}" end containers = GitlabJanitor::ContainerCleaner.new( delay: Fugit::Duration.parse(@opts[:clean_delay]).to_sec, includes: @opts[:includes], excludes: @opts[:excludes], deadline: Fugit::Duration.parse(@opts[:container_deadline]).to_sec ) volumes = GitlabJanitor::VolumeCleaner.new( delay: Fugit::Duration.parse(@opts[:clean_delay]).to_sec, deadline: Fugit::Duration.parse(@opts[:volume_deadline]).to_sec ) while !$exiting do containers.clean(remove: @opts[:remove]) volumes.clean(remove: @opts[:remove]) sleep 3 end