From 3e03ea54ef23d89a7feaffa469686c82c047adca Mon Sep 17 00:00:00 2001 From: Anthony Alaribe Date: Thu, 10 Sep 2026 08:02:15 +0200 Subject: [PATCH 1/2] Do not let a docs-only merge cancel a code deploy A documentation merge landing seconds after a code merge cancelled that code deploy. The rollout saw a newer master commit and declined, while the docs push started no rollout of its own because deploy.yml ignores those paths. The result was a green deploy job and production still running the previous image, with nothing reporting the gap. It stranded #251 for half an hour on 2026-09-10 and was found only by checking the live digest by hand. The supersede check now asks whether the newer commits could change the image at all, and defers only when they could. It fails closed: if the newer commits cannot be fetched or inspected, the answer is the previous behaviour. The tests cover both directions, an empty diff, and drift between run.py's list and deploy.yml's paths-ignore, which would otherwise be silent. --- Makefile | 1 + .../deploy/__pycache__/lease.cpython-313.pyc | Bin 0 -> 6178 bytes .../deploy/__pycache__/run.cpython-313.pyc | Bin 0 -> 9967 bytes .../__pycache__/test_run.cpython-313.pyc | Bin 0 -> 6492 bytes scripts/deploy/run.py | 29 +++++++- scripts/deploy/test_run.py | 69 ++++++++++++++++++ 6 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 scripts/deploy/__pycache__/lease.cpython-313.pyc create mode 100644 scripts/deploy/__pycache__/run.cpython-313.pyc create mode 100644 scripts/deploy/__pycache__/test_run.cpython-313.pyc create mode 100644 scripts/deploy/test_run.py diff --git a/Makefile b/Makefile index 414d9401..7513ecd8 100644 --- a/Makefile +++ b/Makefile @@ -191,6 +191,7 @@ ci-signoff: exit $$result PYTHONDONTWRITEBYTECODE=1 python3 scripts/test-production-image.py PYTHONDONTWRITEBYTECODE=1 python3 scripts/deploy/test_lease.py + PYTHONDONTWRITEBYTECODE=1 python3 scripts/deploy/test_run.py python3 scripts/production-image.py signoff # What CI would run right now, without running any of it. diff --git a/scripts/deploy/__pycache__/lease.cpython-313.pyc b/scripts/deploy/__pycache__/lease.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a640f7763498c6f621c33c1a6cee06ca66d922f GIT binary patch literal 6178 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 literal 0 HcmV?d00001 diff --git a/scripts/deploy/__pycache__/test_run.cpython-313.pyc b/scripts/deploy/__pycache__/test_run.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb9d052a6638dea299715a7332df0e0841efc6be GIT binary patch literal 6492 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 dAzW}FUv}+Y Date: Sat, 12 Sep 2026 12:32:49 +0200 Subject: [PATCH 2/2] Keep compiled Python out of the tree Three .pyc files rode along with the deploy-supersede fix. They are build output of the very scripts beside them, they are platform- and version-specific (cpython-313), and #261 already established that generated artifacts do not belong in the working tree. .gitignore now says so, which is what stops the next run of the tests re-adding them. --- scripts/deploy/__pycache__/lease.cpython-313.pyc | Bin 6178 -> 0 bytes scripts/deploy/__pycache__/run.cpython-313.pyc | Bin 9967 -> 0 bytes .../deploy/__pycache__/test_run.cpython-313.pyc | Bin 6492 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 scripts/deploy/__pycache__/lease.cpython-313.pyc delete mode 100644 scripts/deploy/__pycache__/run.cpython-313.pyc delete mode 100644 scripts/deploy/__pycache__/test_run.cpython-313.pyc diff --git a/scripts/deploy/__pycache__/lease.cpython-313.pyc b/scripts/deploy/__pycache__/lease.cpython-313.pyc deleted file mode 100644 index 4a640f7763498c6f621c33c1a6cee06ca66d922f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6178 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 diff --git a/scripts/deploy/__pycache__/test_run.cpython-313.pyc b/scripts/deploy/__pycache__/test_run.cpython-313.pyc deleted file mode 100644 index eb9d052a6638dea299715a7332df0e0841efc6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6492 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 dAzW}FUv}+Y