Sha256: f3d4dc6b0240698eff8c943e3927594b8d4152bfa3dfba5751c8c59b171f5773
Contents?: true
Size: 1.77 KB
Versions: 3
Compression:
Stored size: 1.77 KB
Contents
require "sidekiq/redis_connection" require "time" # This file is designed to be required within the user's # deployment script; it should need a bare minimum of dependencies. # Usage: # # require "sidekiq/deploy" # Sidekiq::Deploy.mark!("Some change") # # If you do not pass a label, Sidekiq will try to use the latest # git commit info. # module Sidekiq class Deploy MARK_TTL = 90 * 24 * 60 * 60 # 90 days LABEL_MAKER = -> { `git log -1 --format="%h %s"`.strip } def self.mark!(label = nil) Sidekiq::Deploy.new.mark!(label: label) end def initialize(pool = Sidekiq::RedisConnection.create) @pool = pool end def mark!(at: Time.now, label: nil) label ||= LABEL_MAKER.call # we need to round the timestamp so that we gracefully # handle an very common error in marking deploys: # having every process mark its deploy, leading # to N marks for each deploy. Instead we round the time # to the minute so that multple marks within that minute # will all naturally rollup into one mark per minute. whence = at.utc floor = Time.utc(whence.year, whence.month, whence.mday, whence.hour, whence.min, 0) datecode = floor.strftime("%Y%m%d") key = "#{datecode}-marks" stamp = floor.iso8601 @pool.with do |c| # only allow one deploy mark for a given label for the next minute lock = c.set("deploylock-#{label}", stamp, "nx", "ex", "60") if lock c.multi do |pipe| pipe.hsetnx(key, stamp, label) pipe.expire(key, MARK_TTL) end end end end def fetch(date = Time.now.utc.to_date) datecode = date.strftime("%Y%m%d") @pool.with { |c| c.hgetall("#{datecode}-marks") } end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
sidekiq-7.2.2 | lib/sidekiq/deploy.rb |
sidekiq-7.2.1 | lib/sidekiq/deploy.rb |
sidekiq-7.2.0 | lib/sidekiq/deploy.rb |