docs: gitea-local-fork end-to-end publishing flow
Rescued from the second flake-hub checkout (~/projects/flake-hub) before that working copy was removed. Documents the path from local Gitea fork to the attic binary cache.
This commit is contained in:
@@ -0,0 +1,174 @@
|
|||||||
|
# Publishing `gitea-local-fork`
|
||||||
|
|
||||||
|
End-to-end flow for taking a change in Oleks's local gitea fork
|
||||||
|
(`/home/oleks/projects/gitea`, branch `oleks/main`) all the way to a
|
||||||
|
binary in the `attic-infra-cache-k3s-1` cache, ready for any consumer
|
||||||
|
to fetch instead of recompiling Go 1.26.3 locally.
|
||||||
|
|
||||||
|
## Step-by-step
|
||||||
|
|
||||||
|
### 1. Develop in the gitea fork
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/projects/gitea
|
||||||
|
# work on oleks/main (the fork integration tip)
|
||||||
|
git commit -m "..."
|
||||||
|
git push oleks oleks/main:main
|
||||||
|
```
|
||||||
|
|
||||||
|
Lands on `git.oleks.space/oleks/gitea` at `refs/heads/main`.
|
||||||
|
|
||||||
|
This step alone does **not** trigger any CI on flake-hub — the binding
|
||||||
|
contract is the flake-hub pin commit in step 2.
|
||||||
|
|
||||||
|
### 2. Bump the pin in flake-hub
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/projects/nix-customs/flake-hub
|
||||||
|
just gitea-update
|
||||||
|
```
|
||||||
|
|
||||||
|
Under the hood, `scripts/update-gitea-local-fork.sh`:
|
||||||
|
|
||||||
|
1. **Wipes stale unstable tags** — `git push oleks :refs/tags/v*-unstable-*`
|
||||||
|
so `nix-update` sees only clean semver tags (`v1.26.0` etc.) when
|
||||||
|
constructing the new version.
|
||||||
|
2. **Bumps the pin** —
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run nixpkgs#nix-update -- \
|
||||||
|
--flake gitea-local-fork \
|
||||||
|
--version=branch=main \
|
||||||
|
--build
|
||||||
|
```
|
||||||
|
|
||||||
|
Updates `rev`, `vendorHash`, `pnpmDeps` hash, and `version` (formatted
|
||||||
|
as `<latest-semver-tag>-unstable-<commit-date>`).
|
||||||
|
3. **Tags the gitea fork** at the new rev with `v<version>` and pushes
|
||||||
|
the tag. **This is the load-bearing step:** the tag makes the rev
|
||||||
|
reachable forever, surviving any future rebase / force-push of
|
||||||
|
`oleks/main`.
|
||||||
|
4. **Commits + pushes flake-hub** — the bumped `packages/gitea-local-fork.nix`
|
||||||
|
lands on `git.oleks.space/oleks/flake-hub` `main`.
|
||||||
|
|
||||||
|
### 3. Woodpecker picks up the flake-hub push
|
||||||
|
|
||||||
|
Pipeline auto-triggers from `.woodpecker/amd64.yaml` and `.woodpecker/arm64.yaml`
|
||||||
|
running in parallel. Each workflow:
|
||||||
|
|
||||||
|
1. Clones `oleks/flake-hub` using the `gitea_clone_token` secret.
|
||||||
|
2. Runs `ci/setup.sh` — configures `/etc/hosts` to pin `armer`
|
||||||
|
directly (bypassing Cloudflare upload-size limits via hairpin NAT)
|
||||||
|
and writes the trusted substituters / public keys to `/etc/nix/nix.conf`.
|
||||||
|
3. Runs `ci/build.py <arch>` — for each package (including
|
||||||
|
`gitea-local-fork` on `x86_64-linux` and `aarch64-linux`):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix build .#packages.<arch>.gitea-local-fork --print-build-logs ...
|
||||||
|
attic push attic-infra-cache-k3s-1 <closure>
|
||||||
|
```
|
||||||
|
|
||||||
|
Authenticates the push with `ATTIC_TOKEN` against
|
||||||
|
`https://nix-cache-upload.oleks.space`.
|
||||||
|
|
||||||
|
### 4. Closure lives in attic
|
||||||
|
|
||||||
|
After both arch workflows succeed, the closure is queryable from:
|
||||||
|
|
||||||
|
- **Cache URL:** `https://nix-cache-custom.oleks.space/attic-infra-cache-k3s-1`
|
||||||
|
- **Public key:** `attic-infra-cache-k3s-1:qYSNK3DmttQXCFqn1t50qoWGtQNPRFWq9mgQjD05DeU=`
|
||||||
|
|
||||||
|
### 5. Consume from cache
|
||||||
|
|
||||||
|
Anyone (or any host) can pull the binary instead of building:
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD013 -->
|
||||||
|
```bash
|
||||||
|
just gitea-run
|
||||||
|
# or, equivalently:
|
||||||
|
nix run \
|
||||||
|
--extra-substituters "https://nix-cache-custom.oleks.space/attic-infra-cache-k3s-1" \
|
||||||
|
--extra-trusted-public-keys "attic-infra-cache-k3s-1:qYSNK3DmttQXCFqn1t50qoWGtQNPRFWq9mgQjD05DeU=" \
|
||||||
|
git+https://git.oleks.space/oleks/flake-hub#gitea-local-fork
|
||||||
|
```
|
||||||
|
<!-- markdownlint-enable MD013 -->
|
||||||
|
|
||||||
|
## Diagram
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 1. ~/projects/gitea (branch oleks/main) │
|
||||||
|
│ ─ git push oleks oleks/main:main ─► oleks/gitea refs/heads/main │
|
||||||
|
└────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 2. ~/projects/nix-customs/flake-hub │
|
||||||
|
│ ─ just gitea-update │
|
||||||
|
│ a. wipe v*-unstable-* tags on fork │
|
||||||
|
│ b. nix-update → bump rev/hashes/version │
|
||||||
|
│ c. tag fork at new rev: v<version> ─► push │
|
||||||
|
│ d. commit + push flake-hub origin/main │
|
||||||
|
└────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 3. ci.oleks.space pipeline auto-fires │
|
||||||
|
│ amd64 + arm64 (parallel): │
|
||||||
|
│ clone → ci/setup.sh → ci/build.py <arch> │
|
||||||
|
│ ─ nix build .#packages.<arch>.gitea-local-fork │
|
||||||
|
│ ─ attic push attic-infra-cache-k3s-1 <closure> │
|
||||||
|
└────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 4. attic-infra-cache-k3s-1 │
|
||||||
|
│ URL: https://nix-cache-custom.oleks.space/attic-infra-cache-k3s-1 │
|
||||||
|
└────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 5. Consumer: just gitea-run / nix run …#gitea-local-fork │
|
||||||
|
│ ─ closure pulled from cache, no recompile │
|
||||||
|
└────────────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Secrets
|
||||||
|
|
||||||
|
Both are Woodpecker repo secrets on `oleks/flake-hub` (never in code):
|
||||||
|
|
||||||
|
- `gitea_clone_token` — clone flake-hub source; netrc for `fetchgit` of
|
||||||
|
the fork.
|
||||||
|
- `attic_token` — authenticate `attic push` against
|
||||||
|
`nix-cache-upload.oleks.space`.
|
||||||
|
|
||||||
|
## Why the dance with tags in step 2c
|
||||||
|
|
||||||
|
The fork's `oleks/main` branch is rebaseable. `fetchgit` in the
|
||||||
|
derivation resolves by `rev`, so the rev must remain reachable from
|
||||||
|
*some* ref on the remote. Tags are immutable. The
|
||||||
|
`v<version>` tag created at update time becomes the load-bearing
|
||||||
|
reference: even if `oleks/main` later gets force-pushed and the rev
|
||||||
|
falls off the branch, the tag keeps it alive (and Gitea won't GC it).
|
||||||
|
|
||||||
|
## Failure points to watch
|
||||||
|
|
||||||
|
- **Step 2c — tag push rejected.** Check `oleks` remote auth in your
|
||||||
|
shell; the pre-push hook also runs lint.
|
||||||
|
- **Step 3 build — first cold build ≈10–15 min/arch, later ≈1–2 min.**
|
||||||
|
Normal; Go 1.26.3 compiles from source.
|
||||||
|
- **Step 3 attic — push hangs or 413.** `ci/setup.sh` pins armer in
|
||||||
|
`/etc/hosts` to bypass the Cloudflare 100 MB upload cap; confirm the
|
||||||
|
pin survived.
|
||||||
|
- **Step 5 consume — cache miss, recompile locally.** Check the closure
|
||||||
|
landed (`attic info` or browse the cache URL) and that the public key
|
||||||
|
matches.
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
- Derivation: `packages/gitea-local-fork.nix`
|
||||||
|
- Flake attr: `flake.nix` → `packages.<system>.gitea-local-fork`
|
||||||
|
- Update script: `scripts/update-gitea-local-fork.sh` *(untracked, local-only)*
|
||||||
|
- Pipelines: `.woodpecker/amd64.yaml`, `.woodpecker/arm64.yaml`
|
||||||
|
- Build driver: `ci/build.py`
|
||||||
|
- Justfile recipes: `just gitea-build`, `just gitea-update`, `just gitea-run`
|
||||||
Reference in New Issue
Block a user