Reorganize paperspec commands and pin dependency versions (#2)
Reviewed-on: #2
This commit was merged in pull request #2.
This commit is contained in:
1 parent
4fa326dc76
commit
78101dc0db
65 files changed
+2360
-298
No files matched your search
+1
-1
@@ -1,4 +1,4 @@
|
||||
# Serves the paperspec website built by `python3 tools/site.py` (the `_site/` folder), copied to /srv/www/paperspec.
|
||||
# Serves the paperspec website built by `paperspec site` (`pixi run site`, the `_site/` folder), copied to /srv/www/paperspec.
|
||||
# The site mirrors the repository, so every schema is served at its $id and the JSON-LD context at the address
|
||||
# layers name; this file sets the media types those addresses need and lets any page fetch them.
|
||||
paperspec.scient.ing {
|
||||
|
||||
+68
-5
@@ -1,7 +1,8 @@
|
||||
# Deploying the website
|
||||
# Deploying the website and the Python package
|
||||
|
||||
This folder holds what it takes to serve the paperspec website at <https://paperspec.scient.ing>.
|
||||
The site is static: `tools/site.py` builds it into `_site/`, and any web server can serve that folder.
|
||||
The last sections say how the Python package `paperspec` is published to the Gitea package registry, and how other repositories install it from there.
|
||||
The site is static: `paperspec site` builds it into `_site/`, and any web server can serve that folder.
|
||||
|
||||
## What the site serves
|
||||
|
||||
@@ -21,8 +22,8 @@ The pages need no server-side code; search runs in the browser over a small inde
|
||||
## Build it
|
||||
|
||||
```sh
|
||||
pixi run python tools/site.py # writes _site/
|
||||
pixi run python tools/site.py --out /tmp/paperspec-site
|
||||
pixi run site # writes _site/
|
||||
pixi run site --out /tmp/paperspec-site
|
||||
```
|
||||
|
||||
`pixi run check` builds the site into a temporary folder and checks that every Markdown file has a page, that every internal link and fragment resolves, that no Markdown is left unrendered, and that each schema's `$id`, the context's address and the vocabulary's IRIs are files of the site.
|
||||
@@ -52,7 +53,69 @@ On a runner without that mount the workflow still builds and checks the site, an
|
||||
Only changed files are copied, so every other file keeps its `Last-Modified` and `ETag` and caches stay valid across releases.
|
||||
The environment in `.pixi/envs` is cached between runs under the hash of `pixi.lock`, so a fresh container installs it only when the lock file changes.
|
||||
|
||||
## Distributing packages
|
||||
## Publish the Python package
|
||||
|
||||
The Python package `paperspec` holds the reference implementation and the `paperspec` command.
|
||||
The workflow `.gitea/workflows/publish.yml` publishes it to the PyPI registry of the Gitea instance, `https://git.scient.ing/api/packages/infra/pypi`, when a version tag such as `v0.1.1` is pushed.
|
||||
It checks the repository, builds the sdist and the wheel with `pixi run -e dev dist`, confirms that the version setuptools-scm computed is the tag's, checks the metadata with twine, and uploads both files.
|
||||
The package version is the version of this code; the formats keep the version that `CHANGELOG.md` and `pixi.toml` state.
|
||||
|
||||
### Set it up once
|
||||
|
||||
1. Pick the account the workflow publishes as, a bot account or your own, and make it a member of a team in the `infra` organization with write access to packages.
|
||||
2. Signed in as that account, create an access token under Settings, Applications, with the `write:package` scope.
|
||||
3. In this repository's Settings, Actions, Secrets, add `PACKAGE_USER` with the account's user name and `PACKAGE_TOKEN` with the token.
|
||||
Organization secrets work as well, for every repository in `infra`.
|
||||
Gitea refuses secret names that start with `GITEA_` or `GITHUB_`.
|
||||
4. After the first upload, link the package to this repository in the package's settings, so it shows on the repository's Packages tab.
|
||||
|
||||
### Release a version
|
||||
|
||||
Tag a commit on `main` and push the tag:
|
||||
|
||||
```sh
|
||||
git tag -a v0.1.1 -m "Release the paperspec package, version 0.1.1"
|
||||
git push origin v0.1.1
|
||||
```
|
||||
|
||||
The job refuses to upload when the built version differs from the tag, for example when the tag is not on the commit it checked out.
|
||||
The registry never replaces a version, so to publish a fix, push a new tag.
|
||||
A rerun on the same tag skips the files already uploaded, which makes it safe to rerun a job that failed on its secrets: open the workflow under Actions and run it on the tag.
|
||||
|
||||
### Install from the registry
|
||||
|
||||
The registry does not mirror PyPI, so an installer needs two indexes: the registry for `paperspec`, and PyPI for `jsonschema`, `referencing` and `cryptography`.
|
||||
Tie `paperspec` to the registry wherever the installer allows it, so that a package of the same name on PyPI is never chosen instead.
|
||||
|
||||
With pixi, in `pixi.toml`:
|
||||
|
||||
```toml
|
||||
[pypi-dependencies]
|
||||
paperspec = { version = ">=0.1.1", extras = ["tools"], index = "https://git.scient.ing/api/packages/infra/pypi/simple" }
|
||||
```
|
||||
|
||||
With uv, in `pyproject.toml`:
|
||||
|
||||
```toml
|
||||
[[tool.uv.index]]
|
||||
name = "scienting"
|
||||
url = "https://git.scient.ing/api/packages/infra/pypi/simple"
|
||||
explicit = true
|
||||
|
||||
[tool.uv.sources]
|
||||
paperspec = { index = "scienting" }
|
||||
```
|
||||
|
||||
With pip, which cannot tie a package to an index and takes the highest version from either:
|
||||
|
||||
```sh
|
||||
pip install --index-url https://git.scient.ing/api/packages/infra/pypi/simple/ --extra-index-url https://pypi.org/simple/ "paperspec[tools]"
|
||||
```
|
||||
|
||||
If the organization or the package is private, the installer also needs a token with the `read:package` scope, for example in a `~/.netrc` entry for `git.scient.ing`.
|
||||
A git pin to a commit, as `pixi.toml` and `pyproject.toml` can also express, keeps working and needs no registry.
|
||||
|
||||
## Distributing document packages
|
||||
|
||||
A zipped package is an ordinary file, and the site serves the fixtures as such.
|
||||
For a team's own packages, the Gitea instance speaks the OCI distribution protocol, so packages can be pushed to and pulled from its package registry as OCI artifacts with ORAS, and signed there with cosign; the media type of the artifact is the package's, `application/vnd.scienting.doc+zip`.
|
||||
|
||||
Reference in new issue
Block a user