chore: release v1.5.0

This commit is contained in:
admin committed 2026-09-07 15:32:50 +02:00
1 parent 7bb33e528c
commit 3383b91e49
6 files changed
+15 -15

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1.7 # syntax=docker/dockerfile:1.7
ARG VERSION=v1.4.3 ARG VERSION=v1.5.0
ARG MINIMUM_UPDATE_VERSION=v1.4.0 ARG MINIMUM_UPDATE_VERSION=v1.4.0
ARG MINIMUM_AGENT_PROTOCOL=2 ARG MINIMUM_AGENT_PROTOCOL=2
ARG RUNTIME_CONTRACT_VERSION=2 ARG RUNTIME_CONTRACT_VERSION=2
+1 -1
View File
@@ -25,7 +25,7 @@ Beim ersten Start werden Datenbank und Verschlüsselungsschlüssel automatisch i
```yaml ```yaml
services: services:
dyndns: dyndns:
image: &image git.j-mahler.de/admin/domain-control-webinterface-prod:v1.4.3 image: &image git.j-mahler.de/admin/domain-control-webinterface-prod:v1.5.0
restart: unless-stopped restart: unless-stopped
stop_grace_period: 20s stop_grace_period: 20s
ports: ["9090:8080"] ports: ["9090:8080"]
+3 -3
View File
@@ -1,6 +1,6 @@
# Domain Control aktualisieren # Domain Control aktualisieren
Die aktuelle Compose-Version ist `v1.4.3`. Datenbank, Einstellungen und Die aktuelle Compose-Version ist `v1.5.0`. Datenbank, Einstellungen und
verschlüsselte API-Zugänge liegen in benannten Docker-Volumes und bleiben bei verschlüsselte API-Zugänge liegen in benannten Docker-Volumes und bleiben bei
den folgenden Verfahren erhalten. den folgenden Verfahren erhalten.
@@ -45,7 +45,7 @@ In `compose.yml` wird nur die zentrale, konkret gepinnte Image-Zeile geändert:
```yaml ```yaml
services: services:
dyndns: dyndns:
image: &image git.j-mahler.de/admin/domain-control-webinterface-prod:v1.4.3 image: &image git.j-mahler.de/admin/domain-control-webinterface-prod:v1.5.0
update-agent: update-agent:
image: *image image: *image
``` ```
@@ -79,7 +79,7 @@ Die erwartete Antwort lautet `ok`.
## Portainer oder Dockge ## Portainer oder Dockge
1. Den bestehenden Stack bearbeiten. 1. Den bestehenden Stack bearbeiten.
2. Nur den Tag der zentralen Image-Zeile auf `v1.4.3` setzen. 2. Nur den Tag der zentralen Image-Zeile auf `v1.5.0` setzen.
3. Den Stack mit vorherigem Image-Pull erneut bereitstellen. 3. Den Stack mit vorherigem Image-Pull erneut bereitstellen.
4. Kontrollieren, dass beide Container laufen und die Web-App `healthy` ist. 4. Kontrollieren, dass beide Container laufen und die Web-App `healthy` ist.
+1 -1
View File
@@ -1,6 +1,6 @@
services: services:
dyndns: dyndns:
image: &image git.j-mahler.de/admin/domain-control-webinterface-prod:v1.4.3 image: &image git.j-mahler.de/admin/domain-control-webinterface-prod:v1.5.0
restart: unless-stopped restart: unless-stopped
stop_grace_period: 20s stop_grace_period: 20s
ports: ["9090:8080"] ports: ["9090:8080"]
+8 -8
View File
@@ -78,7 +78,7 @@ func TestManagerKeepsUpdateReminderWhenGiteaBecomesUnavailable(t *testing.T) {
return return
} }
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
_, _ = w.Write([]byte(`{"tag_name":"v1.4.4","html_url":"https://example.invalid/releases/v1.4.4","draft":false,"prerelease":false}`)) _, _ = w.Write([]byte(`{"tag_name":"v1.5.1","html_url":"https://example.invalid/releases/v1.5.1","draft":false,"prerelease":false}`))
})) }))
defer api.Close() defer api.Close()
@@ -111,7 +111,7 @@ func TestManagerKeepsUpdateReminderWhenGiteaBecomesUnavailable(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
state := manager.State() state := manager.State()
if !state.UpdateAvailable || state.LatestVersion != "v1.4.4" || state.LastError != "" || state.CredentialUsername != "registry-user" { if !state.UpdateAvailable || state.LatestVersion != "v1.5.1" || state.LastError != "" || state.CredentialUsername != "registry-user" {
t.Fatalf("new release was not detected: %#v", state) t.Fatalf("new release was not detected: %#v", state)
} }
settings, err := database.GetSoftwareUpdateSettings(ctx) settings, err := database.GetSoftwareUpdateSettings(ctx)
@@ -127,7 +127,7 @@ func TestManagerKeepsUpdateReminderWhenGiteaBecomesUnavailable(t *testing.T) {
t.Fatal("unavailable Gitea endpoint was reported as successful") t.Fatal("unavailable Gitea endpoint was reported as successful")
} }
state = manager.State() state = manager.State()
if !state.UpdateAvailable || state.LatestVersion != "v1.4.4" || state.LastError == "" { if !state.UpdateAvailable || state.LatestVersion != "v1.5.1" || state.LastError == "" {
t.Fatalf("temporary outage removed the last known update reminder: %#v", state) t.Fatalf("temporary outage removed the last known update reminder: %#v", state)
} }
} }
@@ -189,7 +189,7 @@ func TestRequestUpdateRefreshesStaleAgentStateBeforeStarting(t *testing.T) {
if manager.State().AgentAvailable { if manager.State().AgentAvailable {
t.Fatal("test precondition failed: cached agent state is already available") t.Fatal("test precondition failed: cached agent state is already available")
} }
if err := manager.RequestUpdate(context.Background(), "v1.4.4"); err != nil { if err := manager.RequestUpdate(context.Background(), "v1.5.1"); err != nil {
t.Fatalf("live agent was rejected because of stale cached state: %v", err) t.Fatalf("live agent was rejected because of stale cached state: %v", err)
} }
statusCalls, startCalls := agent.counts() statusCalls, startCalls := agent.counts()
@@ -200,7 +200,7 @@ func TestRequestUpdateRefreshesStaleAgentStateBeforeStarting(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if settings.DesiredVersion != "v1.4.4" { if settings.DesiredVersion != "v1.5.1" {
t.Fatalf("target version was not persisted: %#v", settings) t.Fatalf("target version was not persisted: %#v", settings)
} }
} }
@@ -222,7 +222,7 @@ func TestRequestUpdateRejectsUnavailableIncompatibleAndBusyAgents(t *testing.T)
t.Parallel() t.Parallel()
agent := &fakeUpdateAgent{status: test.status, statusErr: test.statusErr} agent := &fakeUpdateAgent{status: test.status, statusErr: test.statusErr}
manager, database := updateReadyManager(t, agent) manager, database := updateReadyManager(t, agent)
if err := manager.RequestUpdate(context.Background(), "v1.4.4"); err == nil { if err := manager.RequestUpdate(context.Background(), "v1.5.1"); err == nil {
t.Fatal("unsafe update request was accepted") t.Fatal("unsafe update request was accepted")
} }
_, startCalls := agent.counts() _, startCalls := agent.counts()
@@ -249,7 +249,7 @@ func TestRequestUpdateSerializesParallelClicks(t *testing.T) {
for index := 0; index < 2; index++ { for index := 0; index < 2; index++ {
go func() { go func() {
<-start <-start
results <- manager.RequestUpdate(context.Background(), "v1.4.4") results <- manager.RequestUpdate(context.Background(), "v1.5.1")
}() }()
} }
close(start) close(start)
@@ -363,7 +363,7 @@ func updateReadyManager(t *testing.T, agent updateAgent) (*Manager, *store.Store
if err := manager.SaveCredential(ctx, "registry-user", "registry-password"); err != nil { if err := manager.SaveCredential(ctx, "registry-user", "registry-password"); err != nil {
t.Fatal(err) t.Fatal(err)
} }
if err := database.RecordSoftwareUpdateSuccess(ctx, "v1.4.4", "https://git.example/releases/v1.4.4", time.Now()); err != nil { if err := database.RecordSoftwareUpdateSuccess(ctx, "v1.5.1", "https://git.example/releases/v1.5.1", time.Now()); err != nil {
t.Fatal(err) t.Fatal(err)
} }
settings, err := database.GetSoftwareUpdateSettings(ctx) settings, err := database.GetSoftwareUpdateSettings(ctx)
+1 -1
View File
@@ -18,4 +18,4 @@ const (
// Version is replaced through -ldflags for release images. The source fallback // Version is replaced through -ldflags for release images. The source fallback
// keeps local builds and tests honest about the currently checked-out release. // keeps local builds and tests honest about the currently checked-out release.
var Version = "v1.4.3" var Version = "v1.5.0"