ops: update release-to-production.sh with proper promote/settle APIs

40dbd83268a6 · AtlantisPleb · · parent d4e26c62fb45

ops: update release-to-production.sh with proper promote/settle APIs

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

pushed
by user · WAL seq 415 · 2026-08-25T19:23:40.937090Z

Changed files

  • modified ops/deploy/release-to-production.sh

Diff

1 file changed, +28 -10

ops/deploy/release-to-production.sh modified +28 -10

@@ -45,7 +45,7 @@ rpc_file() {

45 45
  gcloud compute scp "$script" "$instance:/tmp/rpc.exs" --zone="$zone" \
46 46
    --project="$project" >/dev/null
47 47
  on_node "$instance" "$zone" \
48
    "docker cp /tmp/rpc.exs openagents:/tmp/rpc.exs && docker exec openagents /app/bin/openagents rpc 'Code.eval_file(\"/tmp/rpc.exs\")'"
48
    "chmod 644 /tmp/rpc.exs && docker cp /tmp/rpc.exs openagents:/tmp/rpc.exs && docker exec openagents /app/bin/openagents rpc 'Code.eval_file(\"/tmp/rpc.exs\")'"
49 49
}
50 50
51 51
health_of() {

@@ -73,14 +73,31 @@ echo "image digest: $digest"

73 73
echo "==> promote"
74 74
promote=$(mktemp)
75 75
cat > "$promote" <<ELIXIR
76
{:ok, target} =
77
  OpenAgents.Forge.Targets.promote("openagents.com", %{
76
live = OpenAgents.Forge.Targets.live("openagents.com")
77
previous_sha = (live && live.sha) || "$sha"
78
previous_image_digest = (live && live.details["image_digest"]) || "$digest"
79
expected_nodes = Enum.sort(["openagents@10.128.0.4", "openagents@10.128.0.110", "openagents@10.128.0.111"])
80
81
target =
82
  case OpenAgents.Forge.Targets.current("openagents.com") do
83
    %{sha: "$sha", status: status} = t when status in ["promoted", "building", "built", "needs_rolling_replace"] ->
84
      t
85
    _ ->
86
      {:ok, t} = OpenAgents.Forge.Targets.promote("openagents.com", "$sha", "operator:14167547", details: %{"source" => "operator_console"})
87
      t
88
  end
89
90
{:ok, authorized} =
91
  OpenAgents.Forge.Targets.authorize_rolling_replacement(target.id, %{
78 92
    "sha" => "$sha",
79
    "source" => "operator_console",
80
    "promoted_by" => "operator:14167547"
93
    "image_digest" => "$digest",
94
    "previous_sha" => previous_sha,
95
    "previous_image_digest" => previous_image_digest,
96
    "expected_nodes" => expected_nodes,
97
    "authorized_by" => "operator:14167547"
81 98
  })
82 99
83
IO.puts("target=#{target.id} status=#{target.status}")
100
IO.puts("target=#{authorized.id} status=#{authorized.status}")
84 101
ELIXIR
85 102
rpc_file sarah-fleet-1 us-central1-a "$promote"
86 103
rm -f "$promote"

@@ -125,7 +142,8 @@ cat > "$settle" <<ELIXIR

125 142
target = OpenAgents.Forge.Targets.current("openagents.com")
126 143
sha = "$sha"
127 144
image_digest = "$digest"
128
expected = OpenAgents.Forge.Targets.rolling_authority(OpenAgents.Repo)["expected_nodes"]
145
authority = OpenAgents.Forge.Targets.rolling_authority("openagents.com")
146
expected = authority["expected_nodes"]
129 147
130 148
# Ask each node what it is running. Recording an assumed identity would make
131 149
# the log say something nobody checked, which is the one thing settlement

@@ -151,10 +169,10 @@ else

151 169
  result = %{
152 170
    schema: "openagents.rolling-replacement.v1",
153 171
    sha: sha,
154
    previous_sha: OpenAgents.Forge.Targets.rolling_authority(OpenAgents.Repo)["previous_sha"],
172
    previous_sha: authority["previous_sha"],
155 173
    image_digest: image_digest,
156
    previous_image_digest:
157
      OpenAgents.Forge.Targets.rolling_authority(OpenAgents.Repo)["previous_image_digest"],
174
    previous_image_digest: authority["previous_image_digest"],
175
    expected_nodes: expected,
158 176
    status: "live",
159 177
    node_results: Map.new(expected, &{&1, "ready"})
160 178
  }

This page updates live while a promote is in flight · changelog