From ad5b797854a55c99cc7c0ab83d90f7b22e4aefba Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 28 Oct 2026 17:25:51 -0700 Subject: [PATCH] case 4690 - release procedure: publish order, check downloads before the droplet upgrades Co-Authored-By: Claude Opus 5.5 --- devdocs/build/RELEASE-PROCEDURE.md | 103 +++++++++++++++++------------ 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/devdocs/build/RELEASE-PROCEDURE.md b/devdocs/build/RELEASE-PROCEDURE.md index 2ac45030..a3c02f0c 100644 --- a/devdocs/build/RELEASE-PROCEDURE.md +++ b/devdocs/build/RELEASE-PROCEDURE.md @@ -19,15 +19,15 @@ bash on a droplet or the ayanova.com web server (logged in as root). 5. Test on devtest: upgrade it from `next`, remote E2E, check each change 6. Tag the release in git 7. Publish: docs and downloads go live (not announced yet) -8. **Upgrade the subscription droplets** (Thursday, by time zone) -9. **Announce**: upload `latest-version.json` -10. Download every published file back and check its version +8. Download every published file back and check its version +9. **Upgrade the subscription droplets** (Thursday, by time zone) +10. **Announce**: upload `latest-version.json` 11. Tell subscription customers 12. Start the next version **Subscription droplets are upgraded before the release is announced** (John, 2026-10-26, from 8.3.0 on). Uploading `latest-version.json` is what tells every AyaNova installation that a new -version exists, so it is the very last publishing step. Between steps 7 and 9 the new docs and +version exists, so it is the very last publishing step. Between steps 7 and 10 the new docs and downloads are already visible on the website; that gap is accepted. ## 1. Code complete @@ -148,53 +148,53 @@ next patch version (8.3.1) with its own tag. To see later what any release conta ## 7. Publish (not announced yet) -On the ayanova.com web server. In the archive folder name (`YYYY-MM-DD-vX.Y.Z`), replace the -example date and version with the real release date and version: +The download folders on the ayanova.com web server: -```bash -rm -r /var/www/html/ayanova.com/docs/* && cp -r /var/www/html/ayanova.com/docs-next/* /var/www/html/ayanova.com/docs -``` +- `download/` always holds the current release, plus files that are not part of a release (for + example `QBFC14_0installer.exe`), which stay. +- `download/next/` is staging: the release as built and tested in steps 4 and 5. +- `download/old/` archives the three most recent releases, including the current one, each in a + folder named for its release date and version. The current release is therefore in both + `download/` and `download/old/`, on purpose. -```bash -mkdir /var/www/html/ayanova.com/download/old/2026-11-05-v8.3.0 && cp -r /var/www/html/ayanova.com/download/next/* /var/www/html/ayanova.com/download/old/2026-11-05-v8.3.0 -``` +On the ayanova.com web server, in this order: -Remove the oldest release folder in `download/old`: only the three most recent releases are kept -(since December 2023; customers whose maintenance lapsed must purchase to upgrade, and the older -versions are kept only to diagnose a regression). List the folder, then remove the oldest; at -8.3.0 that is 8.2.2: +1. Replace the manual with the new one: -```bash -ls /var/www/html/ayanova.com/download/old -``` + ```bash + rm -r /var/www/html/ayanova.com/docs/* && cp -r /var/www/html/ayanova.com/docs-next/* /var/www/html/ayanova.com/docs + ``` -```bash -rm -r /var/www/html/ayanova.com/download/old/2024-10-23-v8.2.2 -``` +2. Replace this release's files in `download/` with the tested ones from `next/`. Only the files + in `next/` are overwritten; everything else in `download/` stays. The same command keeps a copy + of the current `latest-version.json` (it is not in `next/` and is replaced only in step 10): -```bash -cp /var/www/html/ayanova.com/download/next/* /var/www/html/ayanova.com/download && cp /var/www/html/ayanova.com/download/latest-version.json /var/www/html/ayanova.com/download/previous-latest-version.json -``` + ```bash + cp /var/www/html/ayanova.com/download/next/* /var/www/html/ayanova.com/download && cp /var/www/html/ayanova.com/download/latest-version.json /var/www/html/ayanova.com/download/previous-latest-version.json + ``` + +3. Archive the release in `download/old/`, in a folder named `YYYY-MM-DD-vX.Y.Z` with the release + date and version (for 8.3.0, released 2026-10-29): + + ```bash + mkdir /var/www/html/ayanova.com/download/old/2026-10-29-v8.3.0 && cp /var/www/html/ayanova.com/download/next/* /var/www/html/ayanova.com/download/old/2026-10-29-v8.3.0 + ``` + +4. Remove the oldest release folder in `download/old`, so three remain (kept since December 2023; + customers whose maintenance lapsed must purchase to upgrade, and the older versions are kept + only to diagnose a regression). List the folder, then remove the oldest; at 8.3.0 that is 8.2.2: + + ```bash + ls /var/www/html/ayanova.com/download/old + ``` + + ```bash + rm -r /var/www/html/ayanova.com/download/old/2024-10-23-v8.2.2 + ``` Do **not** upload the new `latest-version.json` yet. -## 8. Upgrade the subscription droplets - -On the normal Thursday schedule and times (or out of band for an emergency), as in the -[weekly update](#weekly-os-update): snapshot, health check, OS update, reboot; then any -one-time steps for this release, then the [release upgrade commands](#upgrade-commands); then the -health check and the log entry. Mark each server as upgraded in its Sockeye subscription server record. - -## 9. Announce - -Only after the last subscription droplet is upgraded, from PowerShell on the workstation (overwrites -the old one; from this moment every AyaNova installation shows that the new version is available): - -```powershell -scp C:\data\code\raven\dist\latest-version.json root@ayanova.com:/var/www/html/ayanova.com/download/ -``` - -## 10. Check what was published +## 8. Check what was published Download every installer and package back from ayanova.com and check its version: Windows installers by the .exe's ProductVersion, Linux zips by the `AyaNova.dll` inside. (Found @@ -204,7 +204,24 @@ installers by the .exe's ProductVersion, Linux zips by the `AyaNova.dll` inside. $ProgressPreference = 'SilentlyContinue'; $d = "$env:TEMP\ayanova-published"; Remove-Item $d -Recurse -Force -ErrorAction SilentlyContinue; New-Item -ItemType Directory $d | Out-Null; foreach ($f in 'ayanova-windows-x64-single-setup.exe','ayanova-windows-x64-lan-setup.exe','ayanova-linux-x64-server.zip','ayanova-linux-x64-desktop.zip','ayanova-subscription-linux-x64-server.zip') { Invoke-WebRequest "https://www.ayanova.com/download/$f" -OutFile "$d\$f" -UseBasicParsing; if ($f -like '*.exe') { "$f $((Get-Item "$d\$f").VersionInfo.ProductVersion)" } else { Expand-Archive "$d\$f" "$d\$($f -replace '\.zip$','')" ; "$f $((Get-Item "$d\$($f -replace '\.zip$','')\AyaNova.dll").VersionInfo.ProductVersion)" } } ``` -Every line must show the new version. +Every line must show the new version. If one does not, fix the download folder (step 7) and check +again; no subscription droplet is upgraded and nothing is announced until every line is right. + +## 9. Upgrade the subscription droplets + +On the normal Thursday schedule and times (or out of band for an emergency), as in the +[weekly update](#weekly-os-update): snapshot, health check, OS update, reboot; then any +one-time steps for this release, then the [release upgrade commands](#upgrade-commands); then the +health check and the log entry. Mark each server as upgraded in its Sockeye subscription server record. + +## 10. Announce + +Only after the last subscription droplet is upgraded, from PowerShell on the workstation (overwrites +the old one; from this moment every AyaNova installation shows that the new version is available): + +```powershell +scp C:\data\code\raven\dist\latest-version.json root@ayanova.com:/var/www/html/ayanova.com/download/ +``` ## 11. Tell subscription customers