Skip to content

Commit 4a2d7ca

Browse files
fix(plumber): handle skipped blocks in partial pipeline rebuilds (#429)
## 📝 Description When performing a partial rebuild, skipped blocks from the original pipeline caused the system to get stuck because: ## Result - ✅ Skipped blocks in partial rebuilds now transition directly to `done/passed/skipped` - ✅ No more failed `Block.duplicate` calls with `nil` `block_id` - ✅ Rebuilt pipelines preserve the skipped state semantically - ✅ System no longer gets stuck in `initializing` state for skipped blocks ## ✅ Checklist - [x] I have tested this change - [ ] This change requires documentation update
1 parent 929db53 commit 4a2d7ca

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
version: "v1.0"
2+
name: Pipeline
3+
agent:
4+
machine:
5+
type: e1-standard-2
6+
os_image: ubuntu1804
7+
blocks:
8+
- name: Failing
9+
dependencies: []
10+
task:
11+
jobs:
12+
- commands:
13+
- exit 127
14+
- name: B
15+
dependencies: []
16+
task:
17+
jobs:
18+
- commands:
19+
- echo ok
20+
- name: Deployment - skip on dev branches
21+
dependencies: [B]
22+
skip:
23+
when: "(branch =~ '^dev' and branch != 'dev-execute-dpl') or tag =~ '^v0\.' or pull_request =~ '1.*'"
24+
task:
25+
jobs:
26+
- commands:
27+
- exit 127

plumber/ppl/lib/ppl/ppl_blocks/stm_handler/initializing_state.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ defmodule Ppl.PplBlocks.STMHandler.InitializingState do
6060
end
6161
end
6262

63+
defp rebuild_or_duplicate_block(orig_ppl_blk = %{block_id: nil, state: "done", result: "passed", result_reason: "skipped"}, new_ppl_id) do
64+
{:ok, fn _, _ -> {:ok, %{state: "done", result: "passed", result_reason: "skipped"}} end}
65+
end
66+
6367
defp rebuild_or_duplicate_block(orig_ppl_blk = %{state: "done", result: "passed"}, new_ppl_id) do
6468
case Block.duplicate(orig_ppl_blk.block_id, new_ppl_id) do
6569
{:ok, new_block_id} ->

plumber/ppl/test/grpc/server_test.exs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2268,6 +2268,35 @@ defmodule Ppl.Grpc.Server.Test do
22682268
end
22692269
end
22702270

2271+
@tag :integration
2272+
test "gRPC partial_rebuild() - handles skipped blocks correctly" do
2273+
{:ok, %{ppl_id: ppl_id}} =
2274+
%{"repo_name" => "22_skip_block", "file_name" => "skip_block_with_failed_job.yml", "label" => "dev-test"}
2275+
|> Test.Helpers.schedule_request_factory(:local)
2276+
|> Actions.schedule()
2277+
2278+
loopers = Test.Helpers.start_all_loopers()
2279+
{:ok, _ppl} = Test.Helpers.wait_for_ppl_state(ppl_id, "done", 18_000)
2280+
2281+
2282+
{:ok, orig_blk} = PplBlocksQueries.get_by_id_and_index(ppl_id, 2)
2283+
assert orig_blk.result == "passed"
2284+
assert orig_blk.result_reason == "skipped"
2285+
assert orig_blk.block_id == nil
2286+
2287+
request_token = UUID.uuid4()
2288+
new_ppl_id = assert_partial_rebuild(ppl_id, request_token, :ok)
2289+
2290+
{:ok, _new_ppl} = Test.Helpers.wait_for_ppl_state(new_ppl_id, "done", 18_000)
2291+
Test.Helpers.stop_all_loopers(loopers)
2292+
2293+
{:ok, new_blk} = PplBlocksQueries.get_by_id_and_index(new_ppl_id, 2)
2294+
assert new_blk.result == "passed"
2295+
assert new_blk.result_reason == "skipped"
2296+
assert new_blk.block_id == nil
2297+
assert new_blk.duplicate == true
2298+
end
2299+
22712300
defp create_pipeline_with_deployment_target(deployment_target_id) do
22722301
source_args = Test.Support.RequestFactory.source_args(%{})
22732302

0 commit comments

Comments
 (0)