fix(showcase): preserve worker policy on railway pin

This commit is contained in:
Mark
2026-08-24 19:33:31 -07:00
parent c56f1d8a43
commit e90a3dd938
2 changed files with 77 additions and 2 deletions
+19 -2
View File
@@ -2610,8 +2610,25 @@ module Railway
return 0
end
RestoreCommand.pin_and_redeploy(gql,
service_id: service_id, env_id: env_id, image: image)
if options[:service] == "harness-workers"
ssot_env = env_id == PRODUCTION_ENV_ID ? "prod" : "staging"
promote_helper = PromoteCommand.new([])
ssot_entry = promote_helper.ssot_service(options[:service]) || {}
ssot_healthcheck = ssot_entry.dig("healthcheckPath", ssot_env)
ssot_replicas = promote_helper.ssot_replica_config(options[:service], ssot_env)
ssot_restart_policy = ssot_entry.dig("workerProvisioning", ssot_env, "restartPolicyType")
PromoteCommand.pin_and_verify(gql,
service_id: service_id,
env_id: env_id,
image: image,
healthcheck_path: ssot_healthcheck,
replica_config: ssot_replicas,
restart_policy_type: ssot_restart_policy)
else
RestoreCommand.pin_and_redeploy(gql,
service_id: service_id, env_id: env_id, image: image)
end
puts "pinned #{options[:service]} -> #{image}"
0
end
@@ -149,6 +149,25 @@ class HarnessWorkerRestartPolicyTest < Minitest::Test
cmd
end
def pin_command_with(argv, gql:)
cmd = Railway::PinCommand.new(argv)
cmd.instance_variable_set(:@gql, gql)
cmd
end
def with_resolved_service_id(expected_env_id:, expected_name:, service_id:)
original = Railway::RollbackCommand.instance_method(:resolve_service_id)
Railway::RollbackCommand.define_method(:resolve_service_id) do |env_id, name|
raise "unexpected env_id #{env_id.inspect}" unless env_id == expected_env_id
raise "unexpected service name #{name.inspect}" unless name == expected_name
service_id
end
yield
ensure
Railway::RollbackCommand.define_method(:resolve_service_id, original)
end
def worker_rollback_guidance
"Direct rollback is disabled for harness-workers; use " \
"`bin/railway pin --env <env> --service harness-workers " \
@@ -261,6 +280,45 @@ class HarnessWorkerRestartPolicyTest < Minitest::Test
refute_includes err, "Type 'production'"
end
def test_worker_pin_reasserts_ssot_restart_policy_and_replicas_then_deploys_and_verifies
image = "ghcr.io/copilotkit/showcase-harness@sha256:expected"
gql = RecordingGQL.new(deployment_meta_by_service: {
"svc-worker" => worker_policy_meta,
})
cmd = pin_command_with(
[
"--env", "production",
"--service", "harness-workers",
"--image", image,
"--yes",
"--non-interactive",
],
gql: gql,
)
out, err = capture_io do
@rc = with_resolved_service_id(
expected_env_id: Railway::PRODUCTION_ENV_ID,
expected_name: "harness-workers",
service_id: "svc-worker",
) do
cmd.run
end
end
assert_equal 0, @rc, "pin should succeed with recording fake; out=#{out.inspect} err=#{err.inspect}"
assert_includes err, "[non-interactive] proceeding with pin on production (--yes given)."
assert_includes out, "pinned harness-workers -> #{image}"
worker_vars = gql.update_vars_for("svc-worker")
assert_equal image, worker_vars.dig(:input, :source, :image)
assert_equal "ALWAYS", worker_vars.dig(:input, :restartPolicyType)
assert_equal 6, worker_vars.dig(:input, :multiRegionConfig, "us-west2", :numReplicas)
assert_equal [:recheck, :update, :deploy, :recheck, :recheck],
gql.call_order_for("svc-worker"),
"worker pin should deploy and verify the newly spawned deployment"
end
def test_non_worker_named_rollback_still_reaches_existing_rollback_path
gql = RollbackRecordingGQL.new
cmd = rollback_command_with(