Skip to content

Commit

Permalink
BREAKING: support Sidekiq >= 6.5, Ruby >= 3.0
Browse files Browse the repository at this point in the history
This primarily adds support for Sidekiq 7.

The support policy for Sidekiq states that the previous major releases
is supported "as long as they are less than five years old" [1]. With
Sidekiq 6.0 released in August 2019, that time has come.

This also adds an exhaustive test matrix covering
- Ruby 3.0..3.3
- Sidekiq 6.5..7.3
- official Redis server and its ValKey fork

Testing against ValKey ensures smooth transitioning from the proprietary
Redis 7.2 to a pure Open Source stack [2, 3].

[1]: https://github.com/sidekiq/sidekiq/wiki/Commercial-Support
[2]: https://redis.io/legal/licenses/
[3]: https://github.com/valkey-io/valkey?tab=License-1-ov-file#readme
  • Loading branch information
dmke committed Nov 18, 2024
1 parent eec44cf commit cc46b13
Show file tree
Hide file tree
Showing 11 changed files with 76 additions and 23 deletions.
11 changes: 9 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
push:
branches:
- main
- sidekiq-7

jobs:
lint:
Expand All @@ -28,18 +29,24 @@ jobs:
bundle exec stree check Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')
test:
name: Ruby ${{ matrix.ruby }}, Sidekiq ${{ matrix.sidekiq }}, ${{ matrix.redis }}
runs-on: ubuntu-latest
timeout-minutes: 5

services:
redis:
image: redis
image: ${{ matrix.redis }}
ports:
- 6379:6379

strategy:
matrix:
ruby: ["3.1", "3.2", "3.3"]
ruby: ["3.0", "3.1", "3.2", "3.3"]
redis: ["redis", "valkey/valkey"]
sidekiq: ["6.5", "7.0", "7.1", "7.2", "7.3"]

env:
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/sidekiq-${{ matrix.sidekiq }}.gemfile

steps:
- uses: actions/checkout@v4
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# next

- Remove support for Sidekiq < 6.5
- Update minimum Ruby version to 3.0

# 0.17.0 - 2024-08-06

- Add `MiniScheduler::Manager.discover_running_scheduled_jobs` API to allow running scheduled jobs to easily be discovered on the
Expand Down
6 changes: 6 additions & 0 deletions gemfiles/sidekiq-6.5.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true
source "https://rubygems.org"

gemspec path: ".."

gem "sidekiq", "~> 6.5.0"
6 changes: 6 additions & 0 deletions gemfiles/sidekiq-7.0.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true
source "https://rubygems.org"

gemspec path: ".."

gem "sidekiq", "~> 7.0.0"
6 changes: 6 additions & 0 deletions gemfiles/sidekiq-7.1.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true
source "https://rubygems.org"

gemspec path: ".."

gem "sidekiq", "~> 7.1.0"
6 changes: 6 additions & 0 deletions gemfiles/sidekiq-7.2.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true
source "https://rubygems.org"

gemspec path: ".."

gem "sidekiq", "~> 7.2.0"
6 changes: 6 additions & 0 deletions gemfiles/sidekiq-7.3.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true
source "https://rubygems.org"

gemspec path: ".."

gem "sidekiq", "~> 7.3.0"
18 changes: 8 additions & 10 deletions lib/mini_scheduler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
require "mini_scheduler/manager"
require "mini_scheduler/distributed_mutex"
require "sidekiq"
require "redis"

begin
require "sidekiq/exception_handler"
Expand All @@ -16,26 +17,23 @@ def self.configure
yield self
end

class SidekiqExceptionHandler
if defined?(Sidekiq::ExceptionHandler)
extend Sidekiq::ExceptionHandler
else
def self.handle_exception(exception, context)
Sidekiq.handle_exception(exception, context)
end
SidekiqExceptionHandler =
if defined?(Sidekiq.default_configuration) # Sidekiq 7+
->(ex, ctx, _config = nil) { Sidekiq.default_configuration.handle_exception(ex, ctx) }
else # Sidekiq 6.5
->(ex, ctx, _config = nil) { Sidekiq.handle_exception(ex, ctx) }
end
end

def self.job_exception_handler(&blk)
@job_exception_handler = blk if blk
@job_exception_handler
end

def self.handle_job_exception(ex, context = {})
def self.handle_job_exception(ex, context = {}, _config = nil)
if job_exception_handler
job_exception_handler.call(ex, context)
else
SidekiqExceptionHandler.handle_exception(ex, context)
SidekiqExceptionHandler.call(ex, context)
end
end

Expand Down
4 changes: 2 additions & 2 deletions lib/mini_scheduler/manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -394,10 +394,10 @@ def self.hostname
begin
require "socket"
Socket.gethostname
rescue => e
rescue StandardError
begin
`hostname`.strip
rescue => e
rescue StandardError
"unknown_host"
end
end
Expand Down
4 changes: 2 additions & 2 deletions mini_scheduler.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ Gem::Specification.new do |spec|
spec.homepage = "https://github.com/discourse/mini_scheduler"
spec.license = "MIT"

spec.required_ruby_version = ">= 2.7.0"
spec.required_ruby_version = ">= 3.0.0"

spec.files = `git ls-files`.split($/).reject { |s| s =~ /^(spec|\.)/ }
spec.require_paths = ["lib"]

spec.add_runtime_dependency "sidekiq", ">= 4.2.3", "< 7.0"
spec.add_runtime_dependency "sidekiq", ">= 6.5", "< 8.0"

spec.add_development_dependency "pg", "~> 1.0"
spec.add_development_dependency "activesupport", "~> 7.0"
Expand Down
27 changes: 20 additions & 7 deletions spec/mini_scheduler/manager_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -409,26 +409,37 @@ def queued_jobs(manager, with_hostname:)

def expect_job_failure(ex, ctx)
expect(ex).to be_kind_of ZeroDivisionError
expect(ctx).to match(
{ message: "Error while running a scheduled job", job: { "class" => Testing::FailingJob } },
)
expect(ctx).to match a_hash_including(
message: "Error while running a scheduled job",
job: {
"class" => Testing::FailingJob,
},
)
end

context "with default handler" do
class TempSidekiqLogger
attr_accessor :exception, :context

def call(ex, ctx)
def call(ex, ctx, _config = nil)
self.exception = ex
self.context = ctx
end
end

let(:logger) { TempSidekiqLogger.new }

before { Sidekiq.error_handlers << logger }
let(:error_handlers) do
if defined?(Sidekiq.default_configuration)
Sidekiq.default_configuration.error_handlers
else
Sidekiq.error_handlers
end
end

after { Sidekiq.error_handlers.delete(logger) }
before { error_handlers << logger }

after { error_handlers.delete(logger) }

it "captures failed jobs" do
manager.blocking_tick
Expand All @@ -438,7 +449,9 @@ def call(ex, ctx)
end

context "with custom handler" do
before { MiniScheduler.job_exception_handler { |ex, ctx| expect_job_failure(ex, ctx) } }
before do
MiniScheduler.job_exception_handler { |ex, ctx, _config = nil| expect_job_failure(ex, ctx) }
end

after { MiniScheduler.instance_variable_set :@job_exception_handler, nil }

Expand Down

0 comments on commit cc46b13

Please sign in to comment.