Files
artifactapi/docs/alpine/virtual.md
T
unkin-agent 9294686ea6
ci/woodpecker/tag/docker Pipeline was successful
Add alpine virtual repositories (#164)
Virtual repos cover rpm, deb, npm and others but not alpine, so a local alpine repo and github_alpine remotes cannot be served as one apk repository.

- merge members' `<dir>/APKINDEX.tar.gz` per directory; member order wins duplicate (P, V, A); a member 404 is skipped
- 302 `<dir>/<P>-<V>.apk` downloads to the member whose index listed the package
- serve the merged index unsigned, like local and github_alpine indexes
- cache merges per directory on the shared virtual cache; member errors fail with 502
- add docs/alpine/virtual.md, unit tests and an apk e2e with abuild-built packages

Requires unkin/artifactapi#163.

Reviewed-on: #164
Co-authored-by: unkin-agent <unkin-agent@unkin.net>
Co-committed-by: unkin-agent <unkin-agent@unkin.net>
2026-10-24 18:35:52 +11:00

1.1 KiB

alpine virtual

An alpine virtual serves one apk repository over local and remote alpine members at /api/v1/virtual/<name>/.

  • <dir>/APKINDEX.tar.gz merges each member's index for the same <dir> (e.g. x86_64/); on a duplicate (P, V, A) the earlier member wins. A member that 404s for that directory is skipped.
  • apk builds download paths itself (<dir>/<P>-<V>.apk), so the virtual 302s each download to the member whose index listed it.
  • The merged index is unsigned, like local and github_alpine indexes: clients need --allow-untrusted (packages keep their own signatures).
  • Any other member error fails the request with 502. Merges are cached for 60s per directory, up to 32 directories per virtual.
resource "artifactapi_virtual" "alpine" {
  name         = "alpine"
  package_type = "alpine"
  members      = [artifactapi_local_alpine.internal.name, artifactapi_remote_github_alpine.tool.name]
}
echo https://artifactapi.example.com/api/v1/virtual/alpine >> /etc/apk/repositories
apk update --allow-untrusted
apk add --allow-untrusted mytool

Upload to the local member directly; the virtual is read-only.