Releasing lightnovel-crawler
There is no version-bump GitHub workflow — bumping is local and the release is triggered
by pushing a v* tag.
The chain
make major|minor|patch # scripts/bump.py edits lncrawl/VERSION only
<fill in CHANGELOG.md> # add a "## [x.y.z]" section matching lncrawl/VERSION
make push-tag # tags v$(VERSION) and pushes → fires release.yml
release.yml (on tag v*) then runs, in dependency order:
- validate — reuses
lint.ymlwith the live crawl test enabled. - sync-web — reuses
web.ymlto pull the latest web build. - build-docker — reuses
build-docker.yml(multi-arch → ghcr.io, taggedlatest, the SHA, and the VERSION). - create-release — slices the matching version section out of
CHANGELOG.mdand creates a draft GitHub release. - build-windows / build-mac / build-linux — wheel + PyInstaller exe per OS (Windows also runs Inno Setup for the installer; Linux also uploads the wheel); artifacts attach to the draft release.
- publish-package — publishes the wheel to PyPI, updates short links, and flips the release from draft to published.
Supporting workflows
lint.yml— CI on push/PR touchinglncrawl/**,sources/**, or dependency files: lint (pyright + ruff), wheel build + install smoke test,sources list, anddev migrate verify(schema-drift gate). A live crawl test is opt-in via input/dispatch.web.yml("Sync Web") — onrepository_dispatch: web-build-updatedfrom the lncrawl-web repo (or manual/workflow_call): checks out lncrawl-web'sartifactsbranch intolncrawl/server/web/and auto-commits todev. That directory is committed build output — never hand-edit it.index-gen.yml— ondevpushes touchingsources/**or the index scripts: runsscripts/index_gen.pyand auto-commits the regeneratedsources/_index.json/.zipand README source tables.
Changelog & README
CHANGELOG.mdsections are curated by hand; the release step extracts the section whose heading matcheslncrawl/VERSIONfor the release notes.scripts/changelog_gen.pyis a manual maintainer tool that back-fills missing sections from GitHub Releases.README.mdregions between<!-- auto generated ... -->markers (source tables, CLI help) are rewritten byscripts/index_gen.py— never hand-edit them.
Packaging notes
- PyInstaller via
setup_pyi.py:--onediron Windows,--onefileelsewhere. It bundles the wholesources/tree as data and force-imports every source module so dynamically loaded crawlers survive freezing — a new top-level data dependency may need adding there. - Inno Setup (
installer/installer.iss): the AppId GUID must never change — it identifies the app for upgrades/uninstalls. Install is per-user (PrivilegesRequired=lowest). The doubled{{in the AppId is Inno's escape for a literal brace — don't "fix" it.