Repository navigation
Release v2.0 - #281
Merged
Merged
Release v2.0#281
Conversation
Breakthrough
force-pushed
the
releases/2.0
branch
from
November 8, 2026 21:41
1e0d88d to
3afa7a2
Compare
Breakthrough
force-pushed
the
releases/2.0
branch
from
November 8, 2026 22:11
3afa7a2 to
d76c995
Compare
Breakthrough
force-pushed
the
releases/2.0
branch
2 times, most recently
from
November 9, 2026 02:33
b89350e to
cb6fe16
Compare
Breakthrough
force-pushed
the
releases/2.0
branch
from
November 9, 2026 02:33
cb6fe16 to
2971d62
Compare
Breakthrough
marked this pull request as ready for review
November 9, 2026 04:17
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
DVR-Scan Release Checklist
Each release gets its own branch
releases/2.0[.Z]and a pull requestRelease v2.0intomain. Copy this checklist into the PR description and check off each item. Replace2.0throughout with the version.
0. Release branch
git checkout -b releases/2.0 main git push -u origin releases/2.0 gh pr create --draft --base main --head releases/2.0 --title "Release v2.0" --body-file RELEASE-PLAN.mdreleases/2.0exists and the draft PR is open with this checklist as its body.All release work (optional rehearsal, the release commit, the tag) happens on this branch; it
is merged into
mainin section 6 and then stays as the hotfix line for2.0.Zpatches.1. Pre-release
Dependency Roll
Where applicable (mark as complete if nothing to update):
dist/requirements_windows.txtpyproject.tomluv lock --upgrade.ffmpeg_version, GyanD/codexffmpeg release name) across all buildersappveyor.ymlresolves the installedAdvanced Installer version dynamically, so no path to update)
Changelog and docs
docs/changelog.mdis up to date and accuratedocs/download.mdis up to date and accurateREADME.md,docs/*.md, thedvr-scan.cfgconfig filetemplate,
dvr-scan --helpoutput,CONTRIBUTING.md, etc.Installer project (Windows releases)
python scripts/update_installer.pybumpsdist/installer/DVR-Scan.aipfrom__version__:ProductVersion->2.0, newProductCodeGUID,PackageFileName->dvr-scan-2.0-win64. Needs Advanced Installer installed locally (setADVINSTto the fullpath of
AdvancedInstaller.comif it is not underC:\Program Files (x86)\Caphyon).python scripts/update_installer.py --sync-filesafter the local frozen build below tore-sync
APPDIRagainstdist/dvr-scan/. CI re-syncs on every build (--sync-only), sothis only keeps the committed
.aiprepresentative. Structural changes (dialogs, features,prerequisites, shortcuts, install directory layout) still need the Advanced Installer GUI.
Local frozen build test
dist/dvr-scan/_internal/av.libs/exists with the PyAV FFmpeg DLLs.where ffmpegis empty), the following must succeed and produce an mp4 with audio:
dvr-scan.exe --version,dvr-scan-app.exe --version,dvr-scan.exe -i <repo>/tests/resources/simple_movement.mp4 -et 5s -df 3(
scripts/validate_release.pyrepeats these checks against the final artifacts)dvr-scan-app.exelaunches, wizard opens, and can perform a scanRehearsal (optional, recommended after changes to the build/sign/publish pipeline)
Exercises everything a tag triggers without publishing anything. On
releases/2.0, commit therelease edits with
__version__ = "2.0-rc1"(dates may still be placeholders), then:git tag v2.0-rc1-release && git push origin v2.0-rc1-releasegh run list --branch v2.0-rc1-release:Release Tests(tag vs__version__; thechangelog heading check is skipped for
-rc/-devtags),Python DistributionandWindows Distributionpass;Update Websiteis skipped (its job guard excludes-rc/-devtags)..aipre-sync, MSI nameddvr-scan-2.0-win64.msi(the.aipcarries the stable version, so rc builds produce the stable MSI name/version), SignPath
request created.
dvr-scan-signed.zipintodist/signed/, runpython scripts/finalize_windows_dist.py(section 4).--prerelease), thengh workflow run release.yml -f tag=v2.0-rc1-release -f verify-only=true: installerfresh-install + upgrade test (
test-installer.ymlmaps rc tags to the stable MSI version)and TestPyPI publish + pip smoke install.
gh release delete v2.0-rc1-release --yes,git push origin :refs/tags/v2.0-rc1-release && git tag -d v2.0-rc1-release, delete thelocal
dist/signed/*and downloaded artifacts. The rc commit stays in the branch history;the TestPyPI upload is harmless.
2. Release commit
On
releases/2.0:dvr_scan/__init__.py:__version__ = "2.0"(no-dev/-rcsuffix).docs/changelog.md: heading(In Development)->(YYYY-MM-DD); the heading must be### 2.0 (YYYY-MM-DD)(checked byrelease-test.yml).README.md:### Latest Release: v2.0 (Month D, YYYY).docs/download.md: Python block and Windows blocks need updated version/date informationand download links
docs/index.mdanddocs/index_docs.md:Latest Version: 2.0 (Month D, YYYY)dist/installer/DVR-Scan.aipif not already committed abovegit statusshows nothing else (dvr_scan/docs/is clean)git add README.md docs/changelog.md docs/download.md docs/index.md docs/index_docs.md \ dvr_scan/__init__.py dist/installer/DVR-Scan.aip git commit -m "[release] Release v2.0"3. Tag
releases/2.0(the release commit); the PR's CI is green.The PR is merged in section 6 with a merge commit or fast-forward, never squash: the tagged
commit must become an ancestor of
main.4. CI artifacts and code signing
Pushing the tag triggers
Python Distribution,Windows Distribution,Release Tests(tag vs
__version__, changelog heading,twine check,pip-audit),Update Website, and theAppVeyor build (which re-syncs the
.aipfile list viascripts/update_installer.py --sync-onlybefore building the MSI and hands the result to SignPath).
gh run list --branch v2.0-releaseshows all GitHub workflows passingdvr-scan-signed.zip(signeddvr-scan.exe,dvr-scan-app.exeand MSI) intodist/signed/. No other inputs areneeded: the portable zip is rebuilt from the signed MSI.
python scripts/finalize_windows_dist.py: verifies the Authenticode signatures, copies theMSI as
dvr-scan-2.0-win64.msi, extracts its file tree withmsiexec /aand repacks it asdvr-scan-2.0-win64.zipwith 7-Zip, writesdvr-scan-2.0-win64.manifest.json+SHA256SUMS, then runsscripts/validate_release.py(filenames, hashes, signatures on theMSI and both EXEs inside the zip, MSI/zip parity, frozen-exe smoke tests with ffmpeg removed
from
PATH). Re-run the checks alone withpython scripts/validate_release.py.dvr-scan.exe --versionand one scan (also covered by validate).Installing the MSI on a clean machine (shortcut,
dvr-scan --versionfrom a prompt, upgrade overthe previous version, clean uninstall) is automated by
test-installer.yml, run in section 6.5. GitHub release (draft)
Breakthrough/DVR-Scanis ON before publishing, so thepublish event mints a new DOI (the tag itself does not).
gh run download <run-id> -n dvr-scan-dist -D release/(should be four files:
dvr_scan-2.0anddvr_scan_headless-2.0,.whl+.tar.gz).dist/signed/intorelease/.2.0changelog section, but with adjusted####headings promoted to##(#### Release Notes->## Release Notes) since theexisting headers are chosen for the website
gh release create v2.0-release --draft --title "DVR-Scan v2.0" --notes-file release-notes.md \ release/dvr-scan-2.0-win64.msi release/dvr-scan-2.0-win64.zip \ release/dvr-scan-2.0-win64.manifest.json release/SHA256SUMS \ release/dvr_scan-2.0-py3-none-any.whl release/dvr_scan-2.0.tar.gz \ release/dvr_scan_headless-2.0-py3-none-any.whl release/dvr_scan_headless-2.0.tar.gzdocs/download.md. Leave the releaseas a draft; the orchestrator publishes it.
6. Publish (release orchestrator)
release.ymlverifies the draft release's artifacts and then publishes stage by stage:test-installer.yml(fresh install + upgrade from the previous release on a cleanwindows-latestrunner) -> TestPyPI publish + pip smoke install -> GitHub release(draft -> public, marked latest) -> PyPI publish + pip smoke install.
gh workflow run release.yml -f tag=v2.0-release -f verify-only=true # optional: stop before anything goes public gh workflow run release.yml -f tag=v2.0-release gh run watchpublish-pypi.ymlcan still be dispatched by hand (-f tag=v2.0-release -f environment=testpypi|pypi);for
pypiit requires the tag'sPython Distribution,Windows DistributionandRelease Testsruns to have succeeded.2.0.https://zenodo.org/account/settings/github/
pip:mainwith a merge commit or fast-forward (notsquash) so the tagged commit is an ancestor of
main. Keepreleases/2.0.7. Website
update-site.ymlruns automatically when thev2.0-releasetag is pushed (and onworkflow_dispatch). Because that happens before section 6, the download links on the siteresolve only once the release is public; re-dispatch if the site needs rebuilding later:
Latest Version: 2.0,/download/links resolve correctly,/changelog/shows the new section at the top8. Post-release
dvr_scan/__init__.py:__version__ = "X.(Y+1)-dev0", add### X.(Y+1) (In Development)at the top of
docs/changelog.md. Commit[dist] Prepare for vX.(Y+1) developmentgh issue close <n> -c "Released in v2.0"; close milestonev2.0on GitHub.CITATION.cff: addversion: 2.0,date-released: YYYY-MM-DD, and (first timeonly) the concept
doi:; add the DOI badge toREADME.md(snippet inNEXT.md).Automation Reference
scripts/common.pyscripts/update_installer.py.aipversion/GUID/package-name bump;--sync-files/--sync-only [--dev]re-syncAPPDIRscripts/finalize_windows_dist.pySHA256SUMS, then validatescripts/validate_release.py--allow-unsignedfor local dry runs)dist/pre_release.py --release.aipProductVersionmatches__version__release-test.yml__version__, changelog heading, build +twine check,pip-audittest-installer.ymlrelease.ymlverify-only=truestops before anything goes public)update-site.ymlv*-releasetagsappveyor.yml.aipre-sync, MSI build, SignPath hand-off