diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c1726e..0bd2822 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: push: branches: - main + - sidekiq-7 jobs: lint: @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b2667e..f8cf796 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/gemfiles/sidekiq-6.5.gemfile b/gemfiles/sidekiq-6.5.gemfile new file mode 100644 index 0000000..74a077b --- /dev/null +++ b/gemfiles/sidekiq-6.5.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true +source "https://rubygems.org" + +gemspec path: ".." + +gem "sidekiq", "~> 6.5.0" diff --git a/gemfiles/sidekiq-7.0.gemfile b/gemfiles/sidekiq-7.0.gemfile new file mode 100644 index 0000000..2e43d33 --- /dev/null +++ b/gemfiles/sidekiq-7.0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true +source "https://rubygems.org" + +gemspec path: ".." + +gem "sidekiq", "~> 7.0.0" diff --git a/gemfiles/sidekiq-7.1.gemfile b/gemfiles/sidekiq-7.1.gemfile new file mode 100644 index 0000000..1bf9eca --- /dev/null +++ b/gemfiles/sidekiq-7.1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true +source "https://rubygems.org" + +gemspec path: ".." + +gem "sidekiq", "~> 7.1.0" diff --git a/gemfiles/sidekiq-7.2.gemfile b/gemfiles/sidekiq-7.2.gemfile new file mode 100644 index 0000000..a93c3fb --- /dev/null +++ b/gemfiles/sidekiq-7.2.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true +source "https://rubygems.org" + +gemspec path: ".." + +gem "sidekiq", "~> 7.2.0" diff --git a/gemfiles/sidekiq-7.3.gemfile b/gemfiles/sidekiq-7.3.gemfile new file mode 100644 index 0000000..0e9dc69 --- /dev/null +++ b/gemfiles/sidekiq-7.3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true +source "https://rubygems.org" + +gemspec path: ".." + +gem "sidekiq", "~> 7.3.0" diff --git a/lib/mini_scheduler.rb b/lib/mini_scheduler.rb index fbf217b..962a6ca 100644 --- a/lib/mini_scheduler.rb +++ b/lib/mini_scheduler.rb @@ -5,6 +5,7 @@ require "mini_scheduler/manager" require "mini_scheduler/distributed_mutex" require "sidekiq" +require "redis" begin require "sidekiq/exception_handler" @@ -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 diff --git a/lib/mini_scheduler/manager.rb b/lib/mini_scheduler/manager.rb index 1b1cd4a..a05513b 100644 --- a/lib/mini_scheduler/manager.rb +++ b/lib/mini_scheduler/manager.rb @@ -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 diff --git a/mini_scheduler.gemspec b/mini_scheduler.gemspec index 67e7423..2bcab88 100644 --- a/mini_scheduler.gemspec +++ b/mini_scheduler.gemspec @@ -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" diff --git a/spec/mini_scheduler/manager_spec.rb b/spec/mini_scheduler/manager_spec.rb index 5491a99..0af7bb3 100644 --- a/spec/mini_scheduler/manager_spec.rb +++ b/spec/mini_scheduler/manager_spec.rb @@ -409,16 +409,19 @@ 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 @@ -426,9 +429,17 @@ def call(ex, ctx) 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 @@ -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 }