Feature/docker kuntoon (#11)
CI Main / Load example-gitea-env.conf to pipeline env (push) Successful in 25s
CI Main / Check existing artifact (push) Successful in 22s
unit-tests Link to Bats reports
CI Main / Bats tests (push) Successful in 1m47s
acc-tests Link to Cucumber reports
CI Main / Cucumber tests (push) Successful in 1m4s
ci-docker-build-push Docker build & push 0.2.0 OK
CI Main / Build & Push Docker (push) Successful in 35s
CI Main / Report Summary (push) Successful in 4s
CI Main / Load example-gitea-env.conf to pipeline env (push) Successful in 25s
CI Main / Check existing artifact (push) Successful in 22s
unit-tests Link to Bats reports
CI Main / Bats tests (push) Successful in 1m47s
acc-tests Link to Cucumber reports
CI Main / Cucumber tests (push) Successful in 1m4s
ci-docker-build-push Docker build & push 0.2.0 OK
CI Main / Build & Push Docker (push) Successful in 35s
CI Main / Report Summary (push) Successful in 4s
Co-authored-by: moilanik <niko.moilanen@tietoevry.com> Reviewed-on: #11
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
# 8. Exit code — ainoa onnistumisen mittari
|
||||
|
||||
## Päätös
|
||||
|
||||
Jokaisen `run`-stepin on nostettava virheellinen exit-koodi ylös sellaisenaan.
|
||||
Exit-koodia ei saa "syödä" missään tilanteessa. Onnistumisen ja epäonnistumisen
|
||||
päättely tapahtuu **ainoastaan** exit-koodin perusteella — ei tiedostojen
|
||||
olemassaolon, stdout-tulosteen tai minkään muun heuristiikan perusteella.
|
||||
|
||||
## Periaatteet
|
||||
|
||||
1. Exit-koodi on ainoa totuus. `0` = onnistui, kaikki muut = epäonnistui.
|
||||
2. Exit-koodia ei saa syödä. Pipe (`|`) viimeisenä komentona `tee`:hen syö
|
||||
exit-koodin — `docker run … | tee file` palauttaa aina 0.
|
||||
3. Data transfer -pipet ovat sallittuja (`tar c . | docker run … tar x`),
|
||||
koska niiden exit-koodilla ei ole semanttista merkitystä.
|
||||
4. Testien tai työkalujen ajaminen ei saa päättyä pipeen.
|
||||
5. `set -o pipefail` ei ole riittävä suojaus — PIPESTATUS resetoituu herkästi.
|
||||
|
||||
## Sallitut patternit
|
||||
|
||||
```yaml
|
||||
# Oikein: suora ajo, exit koodi $?:iin
|
||||
- name: Do work
|
||||
run: |
|
||||
some-command
|
||||
EXIT=$?
|
||||
echo "EXIT=${EXIT}" >> "${GITHUB_ENV}"
|
||||
exit ${EXIT}
|
||||
|
||||
# Oikein: stdout talteen ilman pipeä
|
||||
- name: Do work
|
||||
run: |
|
||||
some-command > results.txt 2>&1
|
||||
EXIT=$?
|
||||
echo "EXIT=${EXIT}" >> "${GITHUB_ENV}"
|
||||
exit ${EXIT}
|
||||
|
||||
# Oikein: docker run ilman pipeä
|
||||
- name: Run in container
|
||||
run: |
|
||||
docker run --rm image command > output.txt 2>&1
|
||||
EXIT=$?
|
||||
exit ${EXIT}
|
||||
```
|
||||
|
||||
## Kielletyt patternit
|
||||
|
||||
```yaml
|
||||
# Väärin: pipe syö exit-koodin
|
||||
- run: docker run … | tee results.txt
|
||||
|
||||
# Väärin: pipe syö exit-koodin
|
||||
- run: tar … | docker … | tee file
|
||||
|
||||
# Väärin: onnistumisen päättely tiedoston olemassaolosta
|
||||
- run: |
|
||||
some-command || true
|
||||
[ -f success.txt ] && exit 0 || exit 1
|
||||
```
|
||||
|
||||
## Tausta
|
||||
|
||||
Gitea Actionsissa `run`-stepin tila määräytyy viimeisen komennon exit-koodista.
|
||||
Pipe (`|`) asettaa `$?`:ksi viimeisen komennon tuloksen — jos viimeinen komento
|
||||
on `tee`, tulos on aina 0 riippumatta siitä mitä aiemmat komennot palauttivat.
|
||||
|
||||
Tämä on aiheuttanut tuotannossa tilanteita, joissa testit feilasivat mutta jobi
|
||||
näytti vihreää, koska `tee` söi exit-koodin. Virhe havaittiin vasta kun raportteja
|
||||
alettiin lukea manuaalisesti — commit-status valehteli.
|
||||
|
||||
Ratkaisu on yksiselitteinen: exit-koodi talteen `$?`-muuttujaan ennen kuin mikään
|
||||
muu komento ehtii muuttaa sitä, ja stepin viimeinen komento on aina `exit ${EXIT}`.
|
||||
Reference in New Issue
Block a user