diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index dcdac3a..675c96c 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -10,8 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - name: Install pinned uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: + version: "0.11.12" python-version: "3.13" - name: Install verification browser run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 555667b..0964dd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ Alle betekenisvolle wijzigingen worden hier bijgehouden. Het project volgt voorlopig een pre-1.0 semantische versieaanpak. +## 0.3.17 - 2026-08-12 + +### Hersteld + +- De Gitea-releasebootstrap gebruikt een immutable `setup-uv`-commit en een exacte + uv-versie; downloads lopen via de Astral-mirror en zijn niet langer afhankelijk + van de gelimiteerde GitHub Releases-API op het gedeelde runner-IP. + ## 0.3.16 - 2026-08-12 ### Hersteld diff --git a/README.md b/README.md index 6d9dd49..b77cd54 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ VacatureRadar is een persoonlijke vacature-assistent voor België. De applicatie volgt toegestane werkgeversbronnen, ATS-pagina’s, feeds en vacaturemails, verwijdert dubbels en irrelevante resultaten en rangschikt de overblijvende kansen tegen jouw zoekprofiel. Jij behoudt altijd de controle: VacatureRadar helpt zoeken en opvolgen, maar solliciteert nooit automatisch. -**Actuele release: 0.3.16.** De volledige P0/P1-releasebasis en de publieke +**Actuele release: 0.3.17.** De volledige P0/P1-releasebasis en de publieke demo-hardening zijn afgerond: 327 tests zijn groen, Microsoft 365 verwerkt platformmails via -app-only OAuth/XOAUTH2 en de productie-installatie draait gezond op de lokaal -gebouwde 0.3.16-image. De laatst volledig bewezen immutable private-registryrelease -is 0.3.15; het controleerbare acceptatiebewijs staat in +app-only OAuth/XOAUTH2. Release 0.3.17 herstelt bovendien de reproduceerbare +private-registrypublicatie zonder afhankelijkheid van de GitHub Releases-API. +Het controleerbare acceptatiebewijs staat in [Finale acceptance](docs/audit/FINAL_ACCEPTANCE.md). ![Dagoverzicht van VacatureRadar in licht thema](docs/screenshots/readme/dashboard-light.png) diff --git a/config/settings.py b/config/settings.py index 6158941..afbfcd6 100644 --- a/config/settings.py +++ b/config/settings.py @@ -139,7 +139,7 @@ CSRF_TRUSTED_ORIGINS = merge_unique( ) TIME_ZONE = os.getenv("DJANGO_TIME_ZONE", "Europe/Brussels") VACATURERADAR_OWNER_NAME = os.getenv("VACATURERADAR_OWNER_NAME", "Jens").strip()[:40] or "Jens" -VACATURERADAR_VERSION = os.getenv("VACATURERADAR_VERSION", "0.3.16").strip() or "0.3.16" +VACATURERADAR_VERSION = os.getenv("VACATURERADAR_VERSION", "0.3.17").strip() or "0.3.17" LANGUAGE_CODE = "nl-be" USE_I18N = True USE_TZ = True diff --git a/deployment/production.env.example b/deployment/production.env.example index 60589be..95b8a76 100644 --- a/deployment/production.env.example +++ b/deployment/production.env.example @@ -9,7 +9,7 @@ DJANGO_ALLOWED_HOSTS=vacatureradar.example.be,127.0.0.1,localhost DJANGO_CSRF_TRUSTED_ORIGINS=https://vacatureradar.example.be DJANGO_TIME_ZONE=Europe/Brussels VACATURERADAR_OWNER_NAME=Jens -VACATURERADAR_VERSION=0.3.16 +VACATURERADAR_VERSION=0.3.17 POSTGRES_DB=vacatureradar POSTGRES_USER=vacatureradar diff --git a/docs/ai/BACKLOG.yaml b/docs/ai/BACKLOG.yaml index 162b6a6..6e1546b 100644 --- a/docs/ai/BACKLOG.yaml +++ b/docs/ai/BACKLOG.yaml @@ -2417,3 +2417,26 @@ tasks: opvolging en 9 fictieve mailboxkoppelingen; EMAIL-bronnen en demo-mailboxen zijn uit de verkeerde schedulers en activityfeeds uitgesloten, statuscopy en loginplaceholder zijn gecorrigeerd. Gerichte 51 tests en volledige gate met 327 tests groen, 84,04% dekking. +- id: VR-230 + title: Herstel de immutable Gitea-releasepublicatie + status: ready + priority: P0 + requirement_ids: + - NFR-009 + depends_on: + - VR-229 + summary: Verwijder de externe GitHub-API-rate-limit uit de releasebootstrap en publiceer de actuele productiebuild + opnieuw als aantoonbaar immutable private-registryimage. + acceptance_criteria: + - De uv-bootstrap is op een immutable actioncommit en een exacte uv-versie gepind. + - De releaseworkflow gebruikt voor uv-downloads geen GitHub Releases-API die op een gedeeld runner-IP kan limiteren. + - Gitea Actions publiceert een private registryimage met digest, SBOM, checksums en release notes. + - Unraid is op de gepubliceerde digest gepind en live health/readiness slagen. + verification: + - uv run pytest tests/unit/test_deployment_configuration.py + - ./scripts/codex_verify.sh + - Gitea Actions releasebewijs en live Unraid health/readiness + primary_paths: + - .gitea/workflows/release.yml + - tests/unit/test_deployment_configuration.py + - docs/audit/FINAL_ACCEPTANCE.md diff --git a/tests/unit/test_deployment_configuration.py b/tests/unit/test_deployment_configuration.py index ca77302..4aabea0 100644 --- a/tests/unit/test_deployment_configuration.py +++ b/tests/unit/test_deployment_configuration.py @@ -128,3 +128,11 @@ def test_deploy_uses_selected_environment_file_for_compose() -> None: assert 'export VACATURERADAR_ENV_FILE="$env_file"' in deploy_script assert 'docker compose --env-file "$env_file" -f "$compose_file" up -d --build' in deploy_script assert "waarde uit ${env_file}" in deploy_script + + +def test_release_uv_install_is_immutable_and_does_not_require_github_api() -> None: + workflow = (ROOT / ".gitea" / "workflows" / "release.yml").read_text(encoding="utf-8") + + assert "astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0" in workflow + assert 'version: "0.11.12"' in workflow + assert "astral-sh/setup-uv@v6" not in workflow