This repository ships four GitHub Actions workflows that cover validation, docs publishing, package publishing, and the scheduled daily scrape.
ci.yml: runs the tox matrix on every push and pull request.docs.yml: builds MkDocs and deploys the generated site to GitHub Pages on pushes to main and on manual dispatch.release.yml: auto-triggers from successful CI and Docs runs on main, creates the GitHub Release object, and publishes to PyPI with trusted publishing.daily-scrape.yml: runs the scheduled multi-city scrape, preserves SQLite state on the data branch, uploads artifacts, and opens a failure issue when the automation breaks.mkdocs.yml aligned with the published Pages URL.pypi if you want environment-level approval or separation..github/workflows/release.yml from this repository.Recommended release posture:
workflow_dispatch for controlled PyPI recovery or manual release runs from mainworkflow_run path publish automatically when the version in pyproject.toml increases and both CI and Docs are green on main.github/runtime/daily.toml.OPENAI_API_KEY as a repository secret.data branch so the scheduled workflow can commit state.contents: write and issues: write permissions in the workflow file.ci.yml is the push/PR gate.
It runs:
py311, py312, py313, and py314linttypedocsbuildThis keeps the local tox contract and the GitHub CI contract identical.
docs.yml performs two jobs:
python -m mkdocs build --strictsite/ artifact and deploy it with the GitHub Pages deployment actionsThe workflow is intentionally limited to main pushes and manual dispatch so preview behavior stays on the normal PR checks instead of publishing every branch.
release.yml now supports two release paths:
workflow_run on CI and Docs completions for automatic PyPI releases from mainworkflow_dispatch for controlled PyPI recovery or release rerunsThe automated release job sequence is:
main and both CI and Docs succeeded for the same SHApyproject.toml and compare it with the latest published releasetox -e buildManual dispatch uses the same artifact flow, but it still respects the version gate so duplicate releases are skipped.
PyPI does not allow overwriting a released version.
Rollback guidance:
daily-scrape.yml runs at 30 12 * * *, which is 12:30 UTC every day.
The workflow sequence is:
data branch worktreedata-latest release asset; a run refuses to start fresh unless it positively confirms the asset is absent and was dispatched with allow_fresh_state=true (first-run bootstrap only)linkedin-webscraper scrape daily --config .github/runtime/daily.tomlartifacts/state/linkedin_jobs.sqlite back to the data-latest release with --clobberdata/exports/latest and data/exports/YYYY-MM-DDdataThe workflow includes:
[automation] Daily scrape failureopenai_enabled = true in .github/runtime/daily.toml or a workflow env override.linkedin_jobs.sqlite lives as an asset on the rolling data-latest release (2 GiB per-file limit, kept out of git history); CSV exports live on the data branch. A future cloud database can replace the release asset without changing the CLI surface.artifacts/state as a workflow artifact with 14-day retention; re-upload a prior day’s database to the data-latest release to roll back.python -m tox -e preflight before risky pushes or merges. That local gate runs the same smoke, lint, type, docs, and build checks that the repo expects before release work.