The source for SQLServerUpdates.com — a community-maintained list of SQL Server build numbers, cumulative updates, and download links.
The site is static HTML generated from small data files and hosted on GitHub Pages. Contributors keep it current by editing data and opening pull requests — no HTML required.
python3 validate.py # validate the data files
python3 build.py # generate the site into _site/
python3 test_snapshot.py # verify output preserves the reference snapshotsNo dependencies — just Python 3 (standard library only).
data/
versions.json site metadata, nav, and the home-page summary table
updates/<slug>.csv one CSV per SQL Server version (the update tables)
fragments/<slug>.top.html intro text above each version's table
fragments/<slug>.bottom.html footnotes below each table
fragments/home.top.html home page intro / outro
pages/<slug>.html static pages (download, FAQ, contact, privacy)
assets/style.css site styling
reference/ frozen original HTML, used by the fidelity test
build.py the generator (stdlib only)
validate.py data validation (runs in CI)
test_snapshot.py verifies historical rows and table structure
.github/workflows/ CI (on PRs) and deploy (to GitHub Pages)
See CONTRIBUTING.md. The short version: add a line to the
right CSV in data/updates/, open a pull request, and the checks + deploy run
automatically.
- Pushes to
maintrigger.github/workflows/deploy.yml, which builds the site and publishes it to GitHub Pages. - The custom domain is set via the
CNAMEfile emitted into_site/. - Existing URLs are preserved exactly (e.g.
/sql-server-2022-updates/).
.github/workflows/poll-feed.yml runs every 6 hours and checks both Microsoft's
SQL Server blog RSS feed
and latest SQL Server updates table
for new cumulative updates, GDR/security updates, and service packs. RSS posts
use an LLM (poll_feed.py, OpenAI, called over plain urllib — no dependencies)
to extract release details. The Microsoft table is parsed deterministically, so
it can discover a new build even when no blog post is published. It adds a row
to the right data/updates/*.csv, advances the home-page pointer when the build
is higher, and opens a pull request labeled needs-review. A human always
reviews before it goes live; the same CI checks run on the change. Automated
PRs assign BrentOzar and request his review, which triggers participating
notifications. The repository can also be watched with Custom → Pull requests;
email and GitHub inbox delivery are controlled in account notification settings.
Requires an
OPENAI_API_KEY repository secret.
In GitHub Actions, select Poll Microsoft sources for new builds, then Run workflow and enable Test OpenAI access without changing site data. This sends a small request using the same secret and model as the poller, without fetching releases, editing data, or opening a pull request. The log reports the HTTP status, API error code/type, and request ID, without exposing the key or the API's free-form error message.
credit_balance_exhausted: add prepaid API credits in the key's OpenAI organization's billing settings.project_spend_limit_exceededororganization_spend_limit_exceeded: review the corresponding project's or organization's spending limit.organization_usage_limit_exceeded: request a higher approved usage limit.rate_limit_exceededorslow_down: temporary throttling; the poller retries twice, honoring numericRetry-Aftervalues up to 60 seconds. Quota and billing errors are not retried.
After correcting the reported account condition, run the diagnostic again.
Once it succeeds, run the workflow with the diagnostic option disabled to
resume release detection. Local diagnosis is also available via
python3 poll_feed.py --diagnose-api when OPENAI_API_KEY is set.
Version tables display numeric build numbers in descending order. Homepage installation instructions keep the CU and its GDR as separate download links, and Microsoft Support's relative KB links resolve on the Support domain.