Sha256: f64af362c730c7145461c313885f4d3c15dd4a25601b83e28f640b3f5d0ce9ff

Contents?: true

Size: 1.33 KB

Versions: 5

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: true
module Shipit
  class CommitChecks < EphemeralCommitChecks
    OUTPUT_TTL = 10.minutes.to_i
    FINAL_STATUSES = %w(failed error success).freeze

    def initialize(commit)
      @commit = commit
      super(commit)
    end

    def synchronize(&block)
      @lock ||= Redis::Lock.new(key('lock'), Shipit.redis, expiration: 1, timeout: 2)
      @lock.lock(&block)
    end

    def schedule
      return false if Shipit.redis.get(key('status')).present?
      synchronize do
        return false if Shipit.redis.get(key('status')).present?

        initialize_redis_state
      end
      PerformCommitChecksJob.perform_later(commit: commit)
      true
    end

    def initialize_redis_state
      Shipit.redis.set(key('status'), 'scheduled', ex: OUTPUT_TTL)
      @status = 'scheduled'
    end

    def status
      @status ||= Shipit.redis.get(key('status'))
    end

    def status=(status)
      Shipit.redis.set(key('status'), status)
      @status = status
    end

    def output(since: 0)
      Shipit.redis.getrange(key('output'), since, -1)
    end

    def write(output)
      Shipit.redis.pipelined do |pipeline|
        pipeline.append(key('output'), output)
        pipeline.expire(key('output'), OUTPUT_TTL)
      end
    end

    private

    def key(key)
      "commit:#{commit.id}:checks:#{key}"
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
shipit-engine-0.39.0 app/models/shipit/commit_checks.rb
shipit-engine-0.38.0 app/models/shipit/commit_checks.rb
shipit-engine-0.37.0 app/models/shipit/commit_checks.rb
shipit-engine-0.36.1 app/models/shipit/commit_checks.rb
shipit-engine-0.36.0 app/models/shipit/commit_checks.rb