196 lines
4.6 KiB
Markdown
196 lines
4.6 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
nano .env
|
|
./start.sh
|
|
```
|
|
|
|
Minimalnie ustaw:
|
|
|
|
```env
|
|
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:
|
|
|
|
```text
|
|
APT/RPM: 18765 -> nginx :8080
|
|
OPNsense: 18766 -> nginx :8081
|
|
```
|
|
|
|
Przykładowo reverse proxy może kierować:
|
|
|
|
```text
|
|
packages.example.net -> http://builder:18765
|
|
opn-rustproxy.linuxiarz.pl -> http://builder:18766
|
|
```
|
|
|
|
## Pipeline
|
|
|
|
```text
|
|
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.:
|
|
|
|
```text
|
|
/
|
|
├── 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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```env
|
|
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:
|
|
|
|
```text
|
|
/opt/freebsd-sysroot
|
|
clang / lld / llvm
|
|
Rust target x86_64-unknown-freebsd
|
|
```
|
|
|
|
Poprawki tylko dla builda OPNsense są w:
|
|
|
|
```text
|
|
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:
|
|
|
|
```text
|
|
opnsense/plugin/
|
|
```
|
|
|
|
## Dane
|
|
|
|
```text
|
|
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:
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
./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.
|