Skip to content

Commit

Permalink
Add Good Job (in Rails) (#125)
Browse files Browse the repository at this point in the history
# What's Changed?

- Added `good_job` gem with the queue configured to start when the app
builds
- Added dummy `UploadJob` that is triggered if the webhook relates to a
push on the relevant branch

closes #116
  • Loading branch information
loiswells97 authored Feb 13, 2023
2 parents 5112ae6 + 679e780 commit 8053f02
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 4 deletions.
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,5 @@ group :test do
gem 'shoulda-matchers', '~> 5.0'
gem 'webmock'
end

gem 'good_job', '~> 3.12'
16 changes: 16 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ GEM
dotenv (= 2.8.1)
railties (>= 3.2)
erubi (1.11.0)
et-orbi (1.2.7)
tzinfo
factory_bot (6.2.1)
activesupport (>= 5.0.0)
factory_bot_rails (6.2.0)
Expand All @@ -113,12 +115,23 @@ GEM
faraday-net_http (>= 2.0, < 3.1)
ruby2_keywords (>= 0.0.4)
faraday-net_http (3.0.2)
fugit (1.8.1)
et-orbi (~> 1, >= 1.2.7)
raabro (~> 1.4)
github_webhook (1.4.2)
activesupport (>= 4)
rack (>= 1.3)
railties (>= 4)
globalid (1.0.0)
activesupport (>= 5.0)
good_job (3.12.1)
activejob (>= 6.0.0)
activerecord (>= 6.0.0)
concurrent-ruby (>= 1.0.2)
fugit (>= 1.1)
railties (>= 6.0.0)
thor (>= 0.14.1)
webrick (>= 1.3)
hashdiff (1.0.1)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
Expand Down Expand Up @@ -178,6 +191,7 @@ GEM
public_suffix (5.0.0)
puma (5.6.5)
nio4r (~> 2.0)
raabro (1.4.0)
racc (1.6.1)
rack (2.2.4)
rack-cors (1.1.1)
Expand Down Expand Up @@ -279,6 +293,7 @@ GEM
addressable (>= 2.8.0)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
webrick (1.8.1)
websocket-driver (0.7.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
Expand All @@ -297,6 +312,7 @@ DEPENDENCIES
faker
faraday
github_webhook (~> 1.4)
good_job (~> 3.12)
importmap-rails
jbuilder
kaminari
Expand Down
3 changes: 2 additions & 1 deletion Procfile
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
web: bundle exec puma -C config/puma.rb
release: bundle exec rails projects:create_starter
release: bundle exec rails db:migrate projects:create_starter
worker: bundle exec good_job start --max-threads=8
4 changes: 2 additions & 2 deletions app/controllers/github_webhooks_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
class GithubWebhooksController < ActionController::API
include GithubWebhook::Processor

def github_push(_payload)
# TODO: handle push webhook
def github_push(payload)
UploadJob.perform_later if payload['ref'] == ENV.fetch('GITHUB_WEBHOOK_REF')
head :ok
end

Expand Down
12 changes: 12 additions & 0 deletions app/jobs/upload_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

class UploadJob < ApplicationJob
# Automatically retry jobs that encountered a deadlock
# retry_on ActiveRecord::Deadlocked

# Most jobs are safe to ignore if the underlying records are no longer available
# discard_on ActiveJob::DeserializationError
def perform
# puts 'hello world'
end
end
2 changes: 2 additions & 0 deletions config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,7 @@ class Application < Rails::Application
config.generators do |g|
g.orm :active_record, primary_key_type: :uuid
end

config.active_job.queue_adapter = :good_job
end
end
66 changes: 66 additions & 0 deletions db/migrate/20230209171350_create_good_jobs.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# frozen_string_literal: true
class CreateGoodJobs < ActiveRecord::Migration[7.0]
def change
enable_extension 'pgcrypto'

create_table :good_jobs, id: :uuid do |t|
t.text :queue_name
t.integer :priority
t.jsonb :serialized_params
t.datetime :scheduled_at
t.datetime :performed_at
t.datetime :finished_at
t.text :error

t.timestamps

t.uuid :active_job_id
t.text :concurrency_key
t.text :cron_key
t.uuid :retried_good_job_id
t.datetime :cron_at

t.uuid :batch_id
t.uuid :batch_callback_id
end

create_table :good_job_batches, id: :uuid do |t|
t.timestamps
t.text :description
t.jsonb :serialized_properties
t.text :on_finish
t.text :on_success
t.text :on_discard
t.text :callback_queue_name
t.integer :callback_priority
t.datetime :enqueued_at
t.datetime :discarded_at
t.datetime :finished_at
end

create_table :good_job_processes, id: :uuid do |t|
t.timestamps
t.jsonb :state
end

create_table :good_job_settings, id: :uuid do |t|
t.timestamps
t.text :key
t.jsonb :value
t.index :key, unique: true
end

add_index :good_jobs, :scheduled_at, where: "(finished_at IS NULL)", name: "index_good_jobs_on_scheduled_at"
add_index :good_jobs, [:queue_name, :scheduled_at], where: "(finished_at IS NULL)", name: :index_good_jobs_on_queue_name_and_scheduled_at
add_index :good_jobs, [:active_job_id, :created_at], name: :index_good_jobs_on_active_job_id_and_created_at
add_index :good_jobs, :concurrency_key, where: "(finished_at IS NULL)", name: :index_good_jobs_on_concurrency_key_when_unfinished
add_index :good_jobs, [:cron_key, :created_at], name: :index_good_jobs_on_cron_key_and_created_at
add_index :good_jobs, [:cron_key, :cron_at], name: :index_good_jobs_on_cron_key_and_cron_at, unique: true
add_index :good_jobs, [:active_job_id], name: :index_good_jobs_on_active_job_id
add_index :good_jobs, [:finished_at], where: "retried_good_job_id IS NULL AND finished_at IS NOT NULL", name: :index_good_jobs_jobs_on_finished_at
add_index :good_jobs, [:priority, :created_at], order: { priority: "DESC NULLS LAST", created_at: :asc },
where: "finished_at IS NULL", name: :index_good_jobs_jobs_on_priority_created_at_when_unfinished
add_index :good_jobs, [:batch_id], where: "batch_id IS NOT NULL"
add_index :good_jobs, [:batch_callback_id], where: "batch_callback_id IS NOT NULL"
end
end
61 changes: 60 additions & 1 deletion db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 8053f02

Please sign in to comment.