Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ and this project adheres to
to send emails. This is now fixed for a limited number of use cases (see
(DEPLOYMENT.md)[https://github.com/OpenFn/lightning/blob/main/DEPLOYMENT.md#mail]
for details). [#4602](https://github.com/OpenFn/lightning/issues/4602)
- Include `webhook_reply` and `cron_cursor_job_id` in the workflow version hash
so that changes to these trigger fields are properly detected by CLI deploy and
sandbox merge
[#4596](https://github.com/OpenFn/lightning/issues/4596)

## [2.16.1] - 2026-04-07

Expand Down
8 changes: 7 additions & 1 deletion lib/lightning/workflow_versions.ex
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,13 @@ defmodule Lightning.WorkflowVersions do
:body
]

trigger_keys = [:type, :cron_expression, :enabled]
trigger_keys = [
:type,
:cron_expression,
:enabled,
:webhook_reply,
:cron_cursor_job_id
]

edge_keys = [
:name,
Expand Down
51 changes: 51 additions & 0 deletions test/lightning/workflow_versions_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,57 @@ defmodule Lightning.WorkflowVersionsTest do
refute hash1 == hash2
end

test "hash changes when webhook_reply changes" do
workflow = insert(:workflow, name: "Test")

trigger =
insert(:trigger,
workflow: workflow,
type: :webhook,
webhook_reply: :before_start
)

workflow = Repo.preload(workflow, [:triggers, :jobs, :edges])
hash1 = WorkflowVersions.generate_hash(workflow)

trigger
|> Ecto.Changeset.change(webhook_reply: :after_completion)
|> Repo.update!()

workflow = Repo.preload(workflow, [:triggers, :jobs, :edges], force: true)
hash2 = WorkflowVersions.generate_hash(workflow)

refute hash1 == hash2
end

test "hash changes when cron_cursor_job_id changes" do
workflow = insert(:workflow, name: "Test")
job1 = insert(:job, workflow: workflow, name: "Job A")
job2 = insert(:job, workflow: workflow, name: "Job B")

insert(:trigger,
workflow: workflow,
type: :cron,
cron_expression: "0 * * * *",
cron_cursor_job: job1
)

workflow = Repo.preload(workflow, [:triggers, :jobs, :edges])
hash1 = WorkflowVersions.generate_hash(workflow)

# Change the cron cursor job
[trigger] = workflow.triggers

trigger
|> Ecto.Changeset.change(cron_cursor_job_id: job2.id)
|> Repo.update!()

workflow = Repo.preload(workflow, [:triggers, :jobs, :edges], force: true)
hash2 = WorkflowVersions.generate_hash(workflow)

refute hash1 == hash2
end

test "properly orders triggers by type" do
workflow = insert(:workflow, name: "Test")

Expand Down