Files
rust-package-builder/README.md
T
2026-10-07 09:23:17 +02:00

4.6 KiB

RustProxy unified package builder

Jeden kontener buildera buduje z jednego commita RustProxy:

  • Linux x86_64: DEB + podpisane repo APT,
  • Linux x86_64: RPM + podpisane repo DNF/YUM,
  • FreeBSD x86_64: cross-build bez VM FreeBSD,
  • OPNsense: os-rustproxy-<version>_<revision>.pkg + statyczne repo pkg.

Nie ma Docker-in-Docker, SCP ani osobnego watchera repo OPNsense. FreeBSD sysroot, clang/lld i Rust target są częścią głównego obrazu buildera. OPNsense dostaje osobny publiczny adres, ale wszystkie artefakty są publikowane jednym atomowym przełączeniem repository/current.

Szybki start

cp .env.example .env
nano .env
./start.sh

Minimalnie ustaw:

SOURCE_REPO=https://git.linuxiarz.pl/gru/RustProxy.git
REPOSITORY_URL=http://192.168.1.100
OPNSENSE_REPOSITORY_URL=https://opn-rustproxy.linuxiarz.pl

Dla http:// bez portu start.sh dopisze domyślny port. Dla https:// zakładany jest zewnętrzny reverse proxy/TLS.

Domyślne lokalne porty:

APT/RPM:  18765 -> nginx :8080
OPNsense: 18766 -> nginx :8081

Przykładowo reverse proxy może kierować:

packages.example.net             -> http://builder:18765
opn-rustproxy.linuxiarz.pl       -> http://builder:18766

Pipeline

Git RustProxy
   |
   +-> cargo test
   +-> Linux cargo build
   |     +-> DEB
   |     +-> RPM
   |
   +-> izolowana kopia źródła
         +-> poprawki FreeBSD/OPNsense
         +-> x86_64-unknown-freebsd
         +-> os-rustproxy.pkg
   |
   +-> APT metadata
   +-> RPM metadata
   +-> OPNsense pkg metadata
   +-> walidacja
   +-> atomic switch repository/current

Jeżeli którykolwiek etap się nie powiedzie, publiczne repozytoria nie są przełączane.

OPNsense repo

Publiczny root OPNSENSE_REPOSITORY_URL zawiera m.in.:

/
├── meta.conf
├── packagesite.pkg
├── data.pkg
├── RustProxy.conf
├── BUILD-INFO.txt
├── SHA256
├── os-rustproxy-latest.pkg
└── 26.7/
    └── amd64/
        ├── os-rustproxy-0.20.0_123.pkg
        └── ...

RustProxy.conf jest generowany automatycznie i wskazuje na OPNSENSE_REPOSITORY_URL. Repo OPNsense jest obecnie niesygnowane, zgodnie z wcześniejszym builderem/repo (signature_type: "none"). Repo APT/RPM pozostaje podpisane GPG.

Ręczna konfiguracja na OPNsense:

mkdir -p /usr/local/etc/pkg/repos
fetch -o /usr/local/etc/pkg/repos/RustProxy.conf \
  https://opn-rustproxy.linuxiarz.pl/RustProxy.conf
pkg update -f
pkg install os-rustproxy

Konfiguracja

Najważniejsze zmienne:

SOURCE_REPO=https://git.linuxiarz.pl/gru/RustProxy.git
SOURCE_BRANCH=master

REPOSITORY_URL=http://192.168.1.100
HTTP_PORT=18765

OPNSENSE_REPOSITORY_URL=https://opn-rustproxy.linuxiarz.pl
OPNSENSE_HTTP_PORT=18766

POLL_INTERVAL=300
PACKAGE_RELEASE=auto
MAX_GLIBC_VERSION=2.34
RUN_LINUX_TESTS=1

OPNSENSE_ABI=26.7
OPNSENSE_RETENTION=10
FREEBSD_RELEASE=15.1-RELEASE
FREEBSD_ABI=FreeBSD:15:amd64
FREEBSD_ARCH=freebsd:15:x86:64
FREEBSD_RUST_TOOLCHAIN=1.88.0
APPLY_FREEBSD_PATCHES=1

OPNSENSE_RETENTION=10 zachowuje ostatnie 10 wersji pakietu dla danej serii/architektury OPNsense. 0 wyłącza usuwanie starych wersji.

FreeBSD cross-build

Obraz buildera pobiera i weryfikuje base.txz dla FREEBSD_RELEASE, a następnie używa:

/opt/freebsd-sysroot
clang / lld / llvm
Rust target x86_64-unknown-freebsd

Poprawki tylko dla builda OPNsense są w:

opnsense/patches/<wersja-RustProxy>/*.patch

Są nakładane na izolowaną kopię źródła. Build Linux nie jest modyfikowany.

Kod pluginu OPNsense znajduje się w:

opnsense/plugin/

Dane

data/
├── aptly/
├── cargo/
├── packages/
│   ├── deb/
│   └── rpm/x86_64/
├── repository/
│   ├── current -> releases/<build>
│   ├── apt -> current/apt
│   ├── rpm -> current/rpm
│   ├── opnsense -> current/opnsense
│   └── releases/
├── state/
└── work/

Jeden release zawiera jednocześnie apt/, rpm/ i opnsense/. Dzięki temu oba publiczne adresy przechodzą na nową wersję jednocześnie.

HTTP i logi

Jeden kontener nginx obsługuje oba repozytoria na dwóch lokalnych portach:

docker compose logs -f rust-package-builder
docker compose logs -f repository-http

curl -f http://127.0.0.1:18765/healthz
curl -f http://127.0.0.1:18766/healthz

Testy statyczne

./tests/static.sh
./tests/check-rustproxy-source.sh /sciezka/do/RustProxy

Klucz GPG

./start.sh generuje trwały klucz GPG przy pierwszym uruchomieniu. Katalogu gpg/ nie należy usuwać po publikacji APT/RPM.