Rails Cloud Tasks
APIs
The following APIs must be enabled in your project(s):
Setup
As an application (when contributing)
- Install packages:
bundle install
As a package (when inside another application)
- Add the gem to application's Gemfile:
gem 'rails-cloud-tasks'
- Add an initializer:
# ./config/initializers/rails_cloud_tasks.rb
require 'rails-cloud-tasks'
RailsCloudTasks.configure do |config|
config.service_account_email = 'test-account@test-project.iam.gserviceaccount.com'
config.project_id = 'my-gcp-project' # This is not needed if running on GCE
config.location_id = 'us-central1'
config.scheduler_file_path = './custom_path/scheduler_jobs.yml'
config.scheduler_prefix_name = 'my-app-name'
# Base url used by Cloud Tasks to reach your application and run the tasks
config.host = 'https://myapplication.host.com'
config.tasks_path = '/v2/tasks' # default: '/tasks'
# Inject routes into application
config.inject_routes
end
Check out the available configs and its usage description:
attribute | description | env support | app engine fallback | default value |
---|---|---|---|---|
service_account_email | The app service account email. It''s used to impersonate an user on schedule job | GCP_SERVICE_ACCOUNT | ✓ | |
project_id | The Project ID | GCP_PROJECT | ✓ | |
location_id | The region where you app is running (eg: us-central1, us-east1...) | GCP_LOCATION | ✓ | |
host | The app endpoint which the app is running. Do not use custom domain Use the generated domain by Cloud Run | GCP_APP_ENDPOINT | ||
scheduler_file_path | Path which the scheduler file is located | 𐄂 | './config/scheduler.yml' | |
scheduler_prefix_name | The prefix to be set into scheduler job name | 𐄂 | 'rails-cloud' | |
tasks_path | The path to run tasks | 𐄂 | '/tasks' |
- Configure ActiveJob queue_adapter
# ./config/application.rb
config.active_job.queue_adapter = RailsCloudTasks.queue_adapter
- Add a Job class:
# ./app/jobs/application_job.rb
class ApplicationJob < ActiveJob::Base
queue_as 'my-default-queue'
end
# ./app/jobs/my_first_job.rb
class MyFirstJob < ApplicationJob
# Here you may override the queue, if needed
queue_as 'some-other-queue'
def perform(attrs)
# Execute stuff
end
end
- Enqueue a job:
MyJob.perform_later(attrs)
Scheduled Jobs
We have support to Google Cloud Schedule. It's based on Cloud tasks, the jobs are scheduled with HTTP Target. We do not support Pub/Sub or App Engine HTTP for now.
Check out the follow sample of config file:
# config/scheduler.yml
- name: UsersSyncJob
schedule: 0 8 * * *
description: Sync user data
time_zone: "America/Los_Angeles"
class_name: Users::SyncJob
args:
- this_first: argument
is_a: hash
- - this second argument
- is an array
- this third argument is a string
attribute | description | required |
---|---|---|
name | Any descriptive name, following Tasks naming restrictions | ✓ |
schedule | The frequency to run your job. It should be a unix-cron format | ✓ |
description | What this job does | ✓ |
time_zone | Choose which one timezone your job must run | ✓ |
args | Arguments to the job execution. Important: if present, this must be an array of items. Check out the example above | 𐄂 |
class_name | The Job class name (including namespace) | ✓ |
Tests
To run tests:
bundle exec rspec
Version
Use Semantic versioning.