Docker soll nicht exiten bei fehlgeschlagenem Script

[ChAoZ]

Rear Admiral
Registriert
Jan. 2010
Beiträge
5.242
Hallo,

ich bin gerade dabei phpstan in die Build Pipeline zu integrieren und es läuft auch soweit.
Nach dem die Unittests mit Coverage durchgelaufen sind und Artefakte erzeugt haben, lasse ich phpstan laufen und möchte ebenfalls ein Artefakt erzeugen, welches dann an SonarQube geschickt wird.

Klappt auch soweit....
Nur... wenn phpstan Fehler findet, bricht der gesamte Prozess (Build) ab und es werden keine Metriken an SonarQube übermittelt, weil es keine Artefakte gibt. Das ist dämlich, da so die Metriken verloren gehen. Ich würde gern phpstan durchlaufen lassen, unabhängig vom Ergebnis. SonarQube als QualityGate würde dann selbst entscheiden ob der Build durchfällt oder gebaut wird.

Wie erreiche ich das? Also RUN phpstan Kommando ohne exit code 1.

Script zum Starten
Code:
docker build \
    --force-rm=true \
    --progress plain \
    --ssh default \
    --target metric-export \
    --output ${SOURCE_TMP_DIR} \
    --file Dockerfile \
    ${SOURCE_DIR}

Diff:
#Dockerfile

FROM composer:latest as build

...

# run phpunit
RUN ./vendor/bin/phpunit \
    --coverage-clover tmp/clover.xml \
    --log-junit tmp/junit.xml \
    --do-not-cache-result

# run phpstan
RUN ./vendor/bin/phpstan analyse \
    --configuration phpstan.neon \
    --error-format=json > tmp/phpstan.json

# export metric files
FROM scratch as metric-export

# export metric files to host
COPY --from=build /app/tmp/*.xml .
COPY --from=build /app/tmp/*.json .
 
Hm, schaut mir irgendwie falsch aus was du da versuchst zu machen. Man benutzt doch kein docker build um Metriken zu generieren und hochzuladen. Warum startest du den Container nicht detached, führst dann Kommandos in dem Container aus via docker exec und mountest die entsprechenden Ordner? Das gleiche dann mit dem Metrik Upload Container.
Ergänzung ()

Aber um deine eigentliche Frage zu beantworten: || echo "ok" an das Run hängen zb
 
  • Gefällt mir
Reaktionen: madmax2010 und FranzvonAssisi
Um einen Container zu starten, muss ein Image gebaut werden, ein Dev Image. Genau das mache ich, composer reicht da nicht aus, habe Großteil des Dockerfiles hier nicht erwähnt... , nur führe ich alles während des Builds aus und schmeiße hinterher alles wieder weg bis auf die Artefakte, die ich ja als letzten Schritt, exportiere. Hochladen tut ein eigner Script mit Sonnar Scanner Image.

Mit Docker Stages bietet sich solch ein Prozess an. Es macht exakt dasselbe wie von dir beschrieben, nur löscht es sich nach der Ausführung (Build) wieder von alleine.

Danke, werde deinen Tipp morgen mal testen
 
Bitopium schrieb:
Aber um deine eigentliche Frage zu beantworten: || echo "ok" an das Run hängen zb
|| true
geht auch.
 
  • Gefällt mir
Reaktionen: madmax2010 und [ChAoZ]
Naja, es schaut sehr nach einem Missbrauch des docker builds und des Multistage builds aus. Also konzeptmäßig ist das schon fragwürdig.
 
Ich finde diese Methode ehrlich gesagt genial. Ja sieht nach verkehrter Welt aus, ist es aber nicht.

Habe früher immer nach von dir beschriebenem Schema gearbeitet und hier im neuen Unternehmen diese Variante gesehen.

Wie gesagt, ein Image muss eh gebaut werden um alle Metriken zu ermitteln. Ob ich DANN ein Container starte oder während des Builds alles nötige erzeuge, ist Jacke wie Hose. Spare mir so den rmi Befehl um das nicht mehr benötigte Dev Image zu löschen und ein 2. Script zum starten des Containers. Win Win in meinen Augen^^
Ergänzung ()

Danke Leute, hat funktioniert.
Nun tauchen die Phpstan Fehler als Issues in SonarQube auf und das QualityGate entscheidet dann selbst.
Perfekt 🍻
 
Zuletzt bearbeitet:
Zurück
Oben