Tests von 55 auf 12 Sekunden, Abhängigkeiten nur noch einmal installieren
Docker-Image bauen / build (push) Successful in 1m7s
Docker-Image bauen / build (push) Successful in 1m7s
Der Testlauf war zu langsam. Gemessen statt geraten: 0,68 s Vorbereitung pro Test, bei 81 Tests praktisch die ganze Laufzeit. Ursache war bcrypt. Pro Test wird ein Hash gebildet und geprüft, und das ist absichtlich langsam - genau das soll es im Betrieb sein. Der Aufwand ist jetzt über BCRYPT_ROUNDS einstellbar (Standard bleibt 12) und in den Tests auf 4 gesetzt: dort geht es um die Ablauflogik, nicht um die Stärke des Hashes. Der Dekompressionsbomben-Test erzeugte ein Bild mit 400 Megapixeln, allein dafür 4,8 s. Jetzt wird stattdessen die Grenze heruntergesetzt und ein kleines Bild verwendet - dieselbe Codestelle, ohne die Wartezeit. Ausserdem installierten Test- und Anwendungs-Image dieselben Abhängigkeiten zweimal. Dockerfile.test setzt nun auf dem gebauten Anwendungs-Image auf, der Testschritt kommt entsprechend danach. Dabei zwei Fallen, die beide auffielen, weil die Tests plötzlich wieder langsam waren: - Das Basis-Image bringt seinen eigenen Stand von app/ mit. Ohne erneutes Kopieren prüfen die Tests den Code des Basis-Images - ist es veraltet, läuft alles gegen alten Code und meldet Erfolg. - Der ENTRYPOINT des Anwendungs-Images startet eine Datenbank-Migration. Für Tests weder nötig noch erwünscht, darum geleert. Ganze Kette lokal durchgespielt: bauen, testen, Image prüfen - 22 s. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GR4bNaj9GtRu57J4Niii8o
This commit is contained in:
@@ -25,16 +25,6 @@ jobs:
|
||||
- name: Quellcode auschecken
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Tests
|
||||
run: |
|
||||
set -eu
|
||||
# Über den Build-Kontext statt per Bind-Mount: läuft der Runner
|
||||
# selbst in einem Container, zeigt $PWD auf einen Pfad, den der
|
||||
# Docker-Daemon des Hosts nicht kennt - der Mount wäre leer und
|
||||
# die Tests liefen ohne Fehlermeldung ins Leere.
|
||||
docker build -f Dockerfile.test -t kleiderboerse-tests .
|
||||
docker run --rm kleiderboerse-tests
|
||||
|
||||
- name: Version bestimmen
|
||||
id: meta
|
||||
env:
|
||||
@@ -79,6 +69,18 @@ jobs:
|
||||
--label "org.opencontainers.image.version=${{ steps.meta.outputs.version }}" \
|
||||
.
|
||||
|
||||
# Nach dem Bauen: das Test-Image setzt auf dem eben gebauten auf und
|
||||
# spart sich damit ein zweites Mal Abhängigkeiten installieren. Den
|
||||
# Quellcode kopiert es trotzdem frisch hinein, sonst prüfte es den
|
||||
# Stand des Basis-Images.
|
||||
- name: Tests
|
||||
run: |
|
||||
set -eu
|
||||
docker build -f Dockerfile.test \
|
||||
--build-arg "BASIS=$REGISTRY/$IMAGE_NAME:${{ steps.meta.outputs.version }}" \
|
||||
-t kleiderboerse-tests .
|
||||
docker run --rm kleiderboerse-tests
|
||||
|
||||
# Prüft das fertige Image, bevor irgendetwas veröffentlicht wird.
|
||||
# Geprüft wird im Container selbst (kein Port-Mapping nötig, damit der
|
||||
# Test unabhängig vom Netzwerk-Setup des Runners funktioniert).
|
||||
|
||||
Reference in New Issue
Block a user