good_pipeline 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/README.md +1 -1
- data/app/helpers/good_pipeline/mermaid_diagram_builder.rb +1 -0
- data/app/models/good_pipeline/step_record.rb +5 -4
- data/demo/app/jobs/halt_execution_job.rb +7 -0
- data/demo/db/migrate/20260319205326_create_good_pipeline_tables.rb +2 -0
- data/demo/test/good_pipeline/test_bulk_enqueue.rb +193 -0
- data/demo/test/good_pipeline/test_queue_configuration.rb +157 -0
- data/demo/test/integration/test_bulk_enqueue_end_to_end.rb +109 -0
- data/demo/test/integration/test_end_to_end.rb +0 -15
- data/demo/test/integration/test_halt_execution.rb +100 -0
- data/demo/test/integration/test_queue_configuration.rb +82 -0
- data/demo/test/test_helper.rb +15 -0
- data/docs/architecture.md +8 -0
- data/docs/branching.md +2 -0
- data/docs/callbacks.md +2 -0
- data/docs/defining-pipelines.md +4 -0
- data/docs/failure-strategies.md +35 -0
- data/docs/getting-started.md +12 -0
- data/docs/index.md +1 -1
- data/docs/introduction.md +19 -1
- data/docs/pipeline-chaining.md +2 -0
- data/lib/generators/good_pipeline/install/templates/create_good_pipeline_tables.rb.erb +2 -0
- data/lib/good_pipeline/chain_coordinator.rb +1 -5
- data/lib/good_pipeline/coordinator.rb +117 -16
- data/lib/good_pipeline/engine.rb +6 -0
- data/lib/good_pipeline/haltable.rb +10 -0
- data/lib/good_pipeline/pipeline.rb +24 -1
- data/lib/good_pipeline/runner.rb +3 -3
- data/lib/good_pipeline/version.rb +1 -1
- data/lib/good_pipeline.rb +16 -0
- metadata +10 -3
|
@@ -5,7 +5,16 @@ module GoodPipeline
|
|
|
5
5
|
|
|
6
6
|
class Pipeline # rubocop:disable Metrics/ClassLength
|
|
7
7
|
VALID_FAILURE_STRATEGIES = %i[halt continue ignore].freeze
|
|
8
|
-
DSL_ATTRIBUTES = %i[
|
|
8
|
+
DSL_ATTRIBUTES = %i[
|
|
9
|
+
display_name
|
|
10
|
+
description
|
|
11
|
+
failure_strategy
|
|
12
|
+
on_complete
|
|
13
|
+
on_success
|
|
14
|
+
on_failure
|
|
15
|
+
coordination_queue_name
|
|
16
|
+
callback_queue_name
|
|
17
|
+
].freeze
|
|
9
18
|
|
|
10
19
|
# --- Class-level DSL ---
|
|
11
20
|
|
|
@@ -58,6 +67,18 @@ module GoodPipeline
|
|
|
58
67
|
@on_failure = method_name
|
|
59
68
|
end
|
|
60
69
|
|
|
70
|
+
def coordination_queue_name(name = :__unset__)
|
|
71
|
+
return @coordination_queue_name || GoodPipeline.coordination_queue_name if name == :__unset__
|
|
72
|
+
|
|
73
|
+
@coordination_queue_name = name
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def callback_queue_name(name = :__unset__)
|
|
77
|
+
return @callback_queue_name || GoodPipeline.callback_queue_name if name == :__unset__
|
|
78
|
+
|
|
79
|
+
@callback_queue_name = name
|
|
80
|
+
end
|
|
81
|
+
|
|
61
82
|
alias build new
|
|
62
83
|
|
|
63
84
|
def run(**)
|
|
@@ -95,6 +116,8 @@ module GoodPipeline
|
|
|
95
116
|
def on_complete_callback = self.class.on_complete
|
|
96
117
|
def on_success_callback = self.class.on_success
|
|
97
118
|
def on_failure_callback = self.class.on_failure
|
|
119
|
+
def coordination_queue_name = self.class.coordination_queue_name
|
|
120
|
+
def callback_queue_name = self.class.callback_queue_name
|
|
98
121
|
|
|
99
122
|
def initialize(**kwargs) # rubocop:disable Metrics/MethodLength
|
|
100
123
|
@params = kwargs.freeze
|
data/lib/good_pipeline/runner.rb
CHANGED
|
@@ -32,6 +32,7 @@ module GoodPipeline
|
|
|
32
32
|
def create_pipeline_batch(pipeline_id)
|
|
33
33
|
batch = GoodJob::Batch.new
|
|
34
34
|
batch.on_finish = "GoodPipeline::PipelineReconciliationJob"
|
|
35
|
+
batch.callback_queue_name = @pipeline.coordination_queue_name
|
|
35
36
|
batch.properties = { pipeline_id: pipeline_id }
|
|
36
37
|
batch.save
|
|
37
38
|
batch
|
|
@@ -81,9 +82,8 @@ module GoodPipeline
|
|
|
81
82
|
end
|
|
82
83
|
|
|
83
84
|
def enqueue_root_steps(step_id_by_key)
|
|
84
|
-
@pipeline.root_steps.
|
|
85
|
-
|
|
86
|
-
end
|
|
85
|
+
root_step_ids = @pipeline.root_steps.map { |step_definition| step_id_by_key[step_definition.key] }
|
|
86
|
+
Coordinator.bulk_enqueue_steps(root_step_ids)
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
def resolve_job_class(step_definition)
|
data/lib/good_pipeline.rb
CHANGED
|
@@ -13,10 +13,26 @@ require_relative "good_pipeline/branch_resolver"
|
|
|
13
13
|
require_relative "good_pipeline/coordinator"
|
|
14
14
|
require_relative "good_pipeline/chain_coordinator"
|
|
15
15
|
require_relative "good_pipeline/runner"
|
|
16
|
+
require_relative "good_pipeline/haltable"
|
|
16
17
|
require_relative "good_pipeline/chain"
|
|
17
18
|
require_relative "good_pipeline/engine" if defined?(Rails::Engine)
|
|
18
19
|
|
|
19
20
|
module GoodPipeline
|
|
21
|
+
DEFAULT_COORDINATION_QUEUE_NAME = "good_pipeline_coordination"
|
|
22
|
+
DEFAULT_CALLBACK_QUEUE_NAME = "good_pipeline_callbacks"
|
|
23
|
+
|
|
24
|
+
class << self
|
|
25
|
+
attr_writer :coordination_queue_name, :callback_queue_name
|
|
26
|
+
|
|
27
|
+
def coordination_queue_name
|
|
28
|
+
@coordination_queue_name || DEFAULT_COORDINATION_QUEUE_NAME
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def callback_queue_name
|
|
32
|
+
@callback_queue_name || DEFAULT_CALLBACK_QUEUE_NAME
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
20
36
|
def self.run(*pipeline_configs)
|
|
21
37
|
pipeline_records = pipeline_configs.map do |config|
|
|
22
38
|
pipeline_class, pipeline_params = extract_pipeline_config(config)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: good_pipeline
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ali Hamdi Ali Fadel
|
|
@@ -29,14 +29,14 @@ dependencies:
|
|
|
29
29
|
requirements:
|
|
30
30
|
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
32
|
+
version: '4.14'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - ">="
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
39
|
+
version: '4.14'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: railties
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -93,6 +93,7 @@ files:
|
|
|
93
93
|
- demo/app/jobs/cleanup_job.rb
|
|
94
94
|
- demo/app/jobs/download_job.rb
|
|
95
95
|
- demo/app/jobs/failing_job.rb
|
|
96
|
+
- demo/app/jobs/halt_execution_job.rb
|
|
96
97
|
- demo/app/jobs/publish_job.rb
|
|
97
98
|
- demo/app/jobs/retryable_job.rb
|
|
98
99
|
- demo/app/jobs/thumbnail_job.rb
|
|
@@ -119,6 +120,7 @@ files:
|
|
|
119
120
|
- demo/db/seeds.rb
|
|
120
121
|
- demo/docs/screenshots/definitions.png
|
|
121
122
|
- demo/docs/screenshots/show.png
|
|
123
|
+
- demo/test/good_pipeline/test_bulk_enqueue.rb
|
|
122
124
|
- demo/test/good_pipeline/test_chain_record.rb
|
|
123
125
|
- demo/test/good_pipeline/test_cleanup.rb
|
|
124
126
|
- demo/test/good_pipeline/test_coordinator.rb
|
|
@@ -128,18 +130,22 @@ files:
|
|
|
128
130
|
- demo/test/good_pipeline/test_pipeline_callback_job.rb
|
|
129
131
|
- demo/test/good_pipeline/test_pipeline_reconciliation_job.rb
|
|
130
132
|
- demo/test/good_pipeline/test_pipeline_record.rb
|
|
133
|
+
- demo/test/good_pipeline/test_queue_configuration.rb
|
|
131
134
|
- demo/test/good_pipeline/test_runner.rb
|
|
132
135
|
- demo/test/good_pipeline/test_step_finished_job.rb
|
|
133
136
|
- demo/test/good_pipeline/test_step_record.rb
|
|
134
137
|
- demo/test/integration/test_branch_execution.rb
|
|
138
|
+
- demo/test/integration/test_bulk_enqueue_end_to_end.rb
|
|
135
139
|
- demo/test/integration/test_concurrent_fan_in.rb
|
|
136
140
|
- demo/test/integration/test_end_to_end.rb
|
|
137
141
|
- demo/test/integration/test_enqueue_atomicity.rb
|
|
142
|
+
- demo/test/integration/test_halt_execution.rb
|
|
138
143
|
- demo/test/integration/test_halt_ignore_chain.rb
|
|
139
144
|
- demo/test/integration/test_ignore_transitive_exemption.rb
|
|
140
145
|
- demo/test/integration/test_late_chain_registration.rb
|
|
141
146
|
- demo/test/integration/test_missing_decision_method.rb
|
|
142
147
|
- demo/test/integration/test_pipeline_chaining.rb
|
|
148
|
+
- demo/test/integration/test_queue_configuration.rb
|
|
143
149
|
- demo/test/integration/test_retry_scenarios.rb
|
|
144
150
|
- demo/test/integration/test_sequential_branches.rb
|
|
145
151
|
- demo/test/integration/test_step_finished_idempotency.rb
|
|
@@ -184,6 +190,7 @@ files:
|
|
|
184
190
|
- lib/good_pipeline/errors.rb
|
|
185
191
|
- lib/good_pipeline/failure_metadata.rb
|
|
186
192
|
- lib/good_pipeline/graph_validator.rb
|
|
193
|
+
- lib/good_pipeline/haltable.rb
|
|
187
194
|
- lib/good_pipeline/pipeline.rb
|
|
188
195
|
- lib/good_pipeline/runner.rb
|
|
189
196
|
- lib/good_pipeline/step_definition.rb
|