Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 4s
- Update-kanalen stable/beta in plaats van het vinkje "pre-releases meenemen".
Stable ziet alleen releases, beta ook pre-releases; een release telt hoger
dan zijn eigen beta (0.5.10-beta1 < 0.5.10). UPDATE_INCLUDE_PRERELEASE
migreert automatisch naar het beta-kanaal.
- Nieuw core/selfupdate.py: image uit de registry ophalen, SU_TAG wegschrijven
en de eigen container laten hercreeren door een korte helper-container die op
het nieuwe image draait (bevat de docker- en compose-CLI al). Een container
kan zichzelf niet hercreeren, vandaar de helper.
- Deploy-map wordt uitgelezen uit de compose-labels van de eigen container.
Ontbreken die, draait de container niet vanaf een registry-image of is de
docker-socket er niet, dan meldt de UI waarom bijwerken niet kan.
- Vorige tag wordt onthouden; terugrolknop in de instellingen.
- Update-check een uur gecached, met geforceerde check via de knop; eerder deed
elke paginalading een netwerkverzoek. Laatst-gecontroleerd zichtbaar.
- Registry-inloggegevens instelbaar; het token komt net als de git-tokens nooit
terug via de API en leeg laten betekent ongewijzigd.
- docker-compose.yml gebruikt ${SU_IMAGE:-server-up}:${SU_TAG:-latest}; zonder
SU_IMAGE blijft lokaal bouwen werken zoals voorheen.
- deploy-prod.yml bouwt en pusht het image in dezelfde job wanneer SU_IMAGE
ingesteld is; build.yml is nu alleen handmatig. Bewust geen aparte
build-workflow op dezelfde tag: bij een runner met een job tegelijk zou de
deploy wachten op een build die zelf nog in de wachtrij staat.
- docs/updates.md: werking, complete Forgejo-instelling (registry, tokens,
variables, secrets, runners), release-procedure voor stable en beta,
terugrollen en probleemoplossing.
- Tests uitgebreid naar 148 (kanaallogica, cache, image-afleiding incl.
registry-poortnummers, tag-validatie, .env-schrijven, tokenlek).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
115 lines
3.6 KiB
Python
115 lines
3.6 KiB
Python
"""Update-kanalen: stable ziet alleen releases, beta ook pre-releases."""
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "server-up"))
|
|
|
|
RELEASES = [
|
|
{"tag_name": "v0.5.00", "prerelease": False, "html_url": "u/0.5.00", "body": "stabiel"},
|
|
{"tag_name": "v0.5.10-beta1", "prerelease": True, "html_url": "u/beta1", "body": "beta"},
|
|
{"tag_name": "v0.4.60", "prerelease": False, "html_url": "u/0.4.60", "body": "oud"},
|
|
{"tag_name": "v9.9.9", "prerelease": False, "draft": True, "html_url": "u/draft"},
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def upd(env, monkeypatch):
|
|
from core import updater
|
|
updater.invalidate()
|
|
monkeypatch.setattr(updater, "_releases", lambda url: RELEASES)
|
|
env["core"].patch({"UPDATE_API_URL": "http://forgejo.test/api/releases"})
|
|
return updater
|
|
|
|
|
|
def test_stable_negeert_prereleases(upd):
|
|
res = upd.check("0.4.60", force=True)
|
|
assert res["channel"] == "stable"
|
|
assert res["latest"] == "0.5.00"
|
|
assert res["update_available"] is True
|
|
|
|
|
|
def test_beta_ziet_de_prerelease(upd, env):
|
|
env["core"].patch({"UPDATE_CHANNEL": "beta"})
|
|
res = upd.check("0.5.00", force=True)
|
|
assert res["channel"] == "beta"
|
|
assert res["latest"] == "0.5.10-beta1"
|
|
assert res["update_available"] is True
|
|
assert res["prerelease"] is True
|
|
|
|
|
|
def test_stable_biedt_geen_update_vanaf_nieuwere_beta(upd, env):
|
|
"""Draai je 0.5.10-beta1 op stable, dan is 0.5.00 géén update."""
|
|
env["core"].patch({"UPDATE_CHANNEL": "stable"})
|
|
res = upd.check("0.5.10-beta1", force=True)
|
|
assert res["latest"] == "0.5.00"
|
|
assert res["update_available"] is False
|
|
|
|
|
|
def test_stabiele_release_wint_van_gelijke_beta(upd, env):
|
|
"""v0.5.10 hoort hoger te zijn dan v0.5.10-beta1."""
|
|
env["core"].patch({"UPDATE_CHANNEL": "beta"})
|
|
import core.updater as u
|
|
assert u._parse("0.5.10") > u._parse("0.5.10-beta1")
|
|
|
|
|
|
def test_draft_wordt_overgeslagen(upd):
|
|
assert upd.check("0.1.0", force=True)["latest"] != "9.9.9"
|
|
|
|
|
|
def test_oude_bool_migreert_naar_beta(upd, env):
|
|
env["core"].patch({"UPDATE_INCLUDE_PRERELEASE": True})
|
|
env["core"].patch({"UPDATE_CHANNEL": ""})
|
|
assert upd.channel() == "beta"
|
|
|
|
|
|
def test_expliciet_kanaal_wint_van_oude_bool(upd, env):
|
|
env["core"].patch({"UPDATE_INCLUDE_PRERELEASE": True, "UPDATE_CHANNEL": "stable"})
|
|
assert upd.channel() == "stable"
|
|
|
|
|
|
def test_cache_voorkomt_herhaalde_netwerkverzoeken(upd, monkeypatch):
|
|
tellers = {"n": 0}
|
|
|
|
def _tel(url):
|
|
tellers["n"] += 1
|
|
return RELEASES
|
|
|
|
monkeypatch.setattr(upd, "_releases", _tel)
|
|
upd.check("0.4.60", force=True)
|
|
upd.check("0.4.60")
|
|
upd.check("0.4.60")
|
|
assert tellers["n"] == 1
|
|
upd.check("0.4.60", force=True)
|
|
assert tellers["n"] == 2
|
|
|
|
|
|
def test_zonder_url_uitgeschakeld(upd, env):
|
|
env["core"].patch({"UPDATE_API_URL": ""})
|
|
res = upd.check("0.4.60", force=True)
|
|
assert res["enabled"] is False
|
|
assert res["update_available"] is False
|
|
|
|
|
|
def test_netwerkfout_wordt_gemeld(upd, monkeypatch):
|
|
def _stuk(url):
|
|
raise TimeoutError("te traag")
|
|
monkeypatch.setattr(upd, "_releases", _stuk)
|
|
res = upd.check("0.4.60", force=True)
|
|
assert "TimeoutError" in res["error"]
|
|
assert res["update_available"] is False
|
|
|
|
|
|
def test_is_prerelease():
|
|
from core import updater
|
|
assert updater.is_prerelease("0.5.00-beta") is True
|
|
assert updater.is_prerelease("0.5.00") is False
|
|
|
|
|
|
def test_ongeldig_kanaal_wordt_geweigerd(client):
|
|
from conftest import login
|
|
csrf = login(client)
|
|
r = client.put("/api/settings", json={"UPDATE_CHANNEL": "onzin"},
|
|
headers={"X-CSRF-Token": csrf})
|
|
assert r.status_code == 400
|