fix: Version stand an zwei Stellen und lief auseinander
Die Oberfläche zeigte 0.2, während die Images schon 0.4 hiessen: os.js trug eine eigene Konstante, die ich beim Taggen nie mitgezogen habe. Jetzt steht sie nur noch in main.go. build.sh liest sie von dort und vergibt denselben Tag, die Oberfläche holt sie über /api/public und /api/me. Ein Test schlaegt an, falls je wieder eine zweite Version in os.js auftaucht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5ed4e30179
commit
5cf210ae97
5 files changed
+52
-9
No files matched your search
@@ -202,10 +202,15 @@ Konfiguration, nicht am Code.
|
|||||||
## Bauen und schieben
|
## Bauen und schieben
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./build.sh # → gitea.honeyy.duckdns.org/docker/honeyos:latest
|
./build.sh # Tag kommt aus `const Version` in main.go, dazu :latest
|
||||||
./build.sh 0.2 # mit Tag
|
./build.sh 1.0-test # abweichender Tag, falls nötig
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Die Version steht an genau einer Stelle:** `const Version` in `main.go`.
|
||||||
|
`build.sh` liest sie von dort, die Oberfläche holt sie über `/api/public`. Vorher
|
||||||
|
stand sie zusätzlich in `os.js` — dann hiess das Image 0.4 und der Schreibtisch
|
||||||
|
zeigte 0.2.
|
||||||
|
|
||||||
## Grenzen, die man kennen sollte
|
## Grenzen, die man kennen sollte
|
||||||
|
|
||||||
- **Die Lampe an der Kachel ist kein Health-Check.** Bei einer fremden Domain darf der
|
- **Die Lampe an der Kachel ist kein Health-Check.** Bei einer fremden Domain darf der
|
||||||
|
|||||||
@@ -570,3 +570,28 @@ func TestAppListeBringtDasAussehenMit(t *testing.T) {
|
|||||||
t.Errorf("Aussehen fehlt: %+v", got.Settings)
|
t.Errorf("Aussehen fehlt: %+v", got.Settings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Die angezeigte Version muss vom Server kommen. Vorher stand sie zusätzlich in
|
||||||
|
// os.js und blieb bei 0.2 stehen, während die Images schon 0.4 hiessen.
|
||||||
|
func TestVersionKommtVomServer(t *testing.T) {
|
||||||
|
h := proxyServer(t, Config{ProxyAuth: true}).routes()
|
||||||
|
|
||||||
|
for _, pfad := range []string{"/api/public", "/api/me"} {
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
h.ServeHTTP(rec, httptest.NewRequest("GET", pfad, nil))
|
||||||
|
var got struct{ Version string }
|
||||||
|
_ = json.Unmarshal(rec.Body.Bytes(), &got)
|
||||||
|
if got.Version != Version {
|
||||||
|
t.Errorf("%s nennt Version %q, erwartet %q", pfad, got.Version, Version)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Und in der Oberfläche darf keine zweite fest eingetragen sein.
|
||||||
|
raw, err := webFS.ReadFile("web/os.js")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if strings.Contains(string(raw), `const VERSION = "`) {
|
||||||
|
t.Error("os.js trägt wieder eine eigene Version — die läuft mit den Image-Tags auseinander")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,9 +3,13 @@ set -e
|
|||||||
|
|
||||||
REGISTRY="gitea.honeyy.duckdns.org"
|
REGISTRY="gitea.honeyy.duckdns.org"
|
||||||
OWNER="${GITEA_OWNER:-docker}"
|
OWNER="${GITEA_OWNER:-docker}"
|
||||||
TAG="${1:-latest}"
|
# Die Version steht in main.go. Von dort kommt der Tag, damit das Image nicht
|
||||||
|
# 0.4 heisst und die Oberflaeche 0.2 anzeigt — genau das war schon passiert.
|
||||||
|
VERSION="$(grep -oP 'const Version = "\K[^"]+' main.go)"
|
||||||
|
TAG="${1:-$VERSION}"
|
||||||
|
|
||||||
IMAGE="${REGISTRY}/${OWNER}/honeyos:${TAG}"
|
IMAGE="${REGISTRY}/${OWNER}/honeyos:${TAG}"
|
||||||
|
LATEST="${REGISTRY}/${OWNER}/honeyos:latest"
|
||||||
|
|
||||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
echo " HoneyOS — Build & Push to Gitea"
|
echo " HoneyOS — Build & Push to Gitea"
|
||||||
@@ -19,11 +23,12 @@ docker login "${REGISTRY}"
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "→ Building..."
|
echo "→ Building..."
|
||||||
docker build -t "${IMAGE}" .
|
docker build -t "${IMAGE}" -t "${LATEST}" .
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "→ Pushing..."
|
echo "→ Pushing..."
|
||||||
docker push "${IMAGE}"
|
docker push "${IMAGE}"
|
||||||
|
docker push "${LATEST}"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ var webFS embed.FS
|
|||||||
// localSub ist die Kennung im offenen Betrieb — dann gibt es genau einen Nutzer.
|
// localSub ist die Kennung im offenen Betrieb — dann gibt es genau einen Nutzer.
|
||||||
const localSub = "local"
|
const localSub = "local"
|
||||||
|
|
||||||
|
// Version ist die einzige Stelle, an der sie steht. build.sh liest sie hier aus
|
||||||
|
// und vergibt denselben Docker-Tag; die Oberfläche holt sie über /api/public.
|
||||||
|
// Vorher stand sie zusätzlich in os.js und lief mit den Image-Tags auseinander.
|
||||||
|
const Version = "0.5"
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Addr string
|
Addr string
|
||||||
PublicURL string
|
PublicURL string
|
||||||
@@ -131,8 +136,8 @@ func main() {
|
|||||||
ReadHeaderTimeout: 10 * time.Second,
|
ReadHeaderTimeout: 10 * time.Second,
|
||||||
IdleTimeout: 60 * time.Second,
|
IdleTimeout: 60 * time.Second,
|
||||||
}
|
}
|
||||||
log.Printf("HoneyOS lauscht auf %s (Daten: %s, Anmeldung: %s)",
|
log.Printf("HoneyOS %s lauscht auf %s (Daten: %s, Anmeldung: %s)",
|
||||||
cfg.Addr, dataPath(cfg.DataDir), map[bool]string{true: cfg.OIDCIssuer, false: "aus"}[s.auth.Enabled()])
|
Version, cfg.Addr, dataPath(cfg.DataDir), map[bool]string{true: cfg.OIDCIssuer, false: "aus"}[s.auth.Enabled()])
|
||||||
log.Fatal(srv.ListenAndServe())
|
log.Fatal(srv.ListenAndServe())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,6 +290,7 @@ func (s *Server) handlePublic(w http.ResponseWriter, r *http.Request) {
|
|||||||
"oidc": s.auth.Enabled(),
|
"oidc": s.auth.Enabled(),
|
||||||
"buttonLabel": s.cfg.ButtonLabel,
|
"buttonLabel": s.cfg.ButtonLabel,
|
||||||
"signedIn": signedIn,
|
"signedIn": signedIn,
|
||||||
|
"version": Version,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,6 +307,7 @@ func (s *Server) handleMe(w http.ResponseWriter, r *http.Request, sub string) {
|
|||||||
"picture": u.Picture,
|
"picture": u.Picture,
|
||||||
"settings": u.Settings,
|
"settings": u.Settings,
|
||||||
"oidc": s.auth.Enabled(),
|
"oidc": s.auth.Enabled(),
|
||||||
|
"version": Version,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
const LS_SETTINGS = "honeyos.settings";
|
const LS_SETTINGS = "honeyos.settings";
|
||||||
const SS_BOOTED = "honeyos.booted";
|
const SS_BOOTED = "honeyos.booted";
|
||||||
const VERSION = "0.2";
|
|
||||||
|
|
||||||
const DEFAULT_SETTINGS = {
|
const DEFAULT_SETTINGS = {
|
||||||
mode: "terminal", // terminal | desktop
|
mode: "terminal", // terminal | desktop
|
||||||
@@ -30,7 +29,7 @@ const DEFAULT_SETTINGS = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
cfg: { user: "", hostname: "honeyos", version: VERSION, apps: [] },
|
cfg: { user: "", hostname: "honeyos", version: "…", apps: [] },
|
||||||
me: null, // {sub, name, picture} sobald angemeldet
|
me: null, // {sub, name, picture} sobald angemeldet
|
||||||
oidc: false,
|
oidc: false,
|
||||||
settings: { ...DEFAULT_SETTINGS },
|
settings: { ...DEFAULT_SETTINGS },
|
||||||
@@ -217,6 +216,7 @@ function cookie(name) {
|
|||||||
async function loadFromServer() {
|
async function loadFromServer() {
|
||||||
const me = await api("/api/me");
|
const me = await api("/api/me");
|
||||||
state.me = { sub: me.sub, name: me.name, picture: me.picture };
|
state.me = { sub: me.sub, name: me.name, picture: me.picture };
|
||||||
|
if (me.version) state.cfg.version = me.version;
|
||||||
state.oidc = !!me.oidc;
|
state.oidc = !!me.oidc;
|
||||||
state.cfg.user = me.name || "";
|
state.cfg.user = me.name || "";
|
||||||
|
|
||||||
@@ -1132,7 +1132,7 @@ function showLogin(pub) {
|
|||||||
|
|
||||||
const fehler = new URLSearchParams(location.search).get("fehler");
|
const fehler = new URLSearchParams(location.search).get("fehler");
|
||||||
const lines = [
|
const lines = [
|
||||||
`HoneyOS ${VERSION} — ${state.cfg.hostname}`,
|
`HoneyOS ${state.cfg.version} — ${state.cfg.hostname}`,
|
||||||
"",
|
"",
|
||||||
"prüfe sitzung".padEnd(28, ".") + " keine",
|
"prüfe sitzung".padEnd(28, ".") + " keine",
|
||||||
"anmeldung erforderlich",
|
"anmeldung erforderlich",
|
||||||
@@ -1181,6 +1181,7 @@ async function main() {
|
|||||||
let pub = { oidc: false, buttonLabel: "Anmelden" };
|
let pub = { oidc: false, buttonLabel: "Anmelden" };
|
||||||
try {
|
try {
|
||||||
pub = await api("/api/public");
|
pub = await api("/api/public");
|
||||||
|
if (pub.version) state.cfg.version = pub.version;
|
||||||
} catch {
|
} catch {
|
||||||
/* Server nicht erreichbar — der Anmeldeschirm sagt es gleich selbst */
|
/* Server nicht erreichbar — der Anmeldeschirm sagt es gleich selbst */
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user