From ad4c2cd5707d75d7a57dcafa925ea51643cea8a7 Mon Sep 17 00:00:00 2001 From: niko Date: Thu, 18 Jun 2026 16:19:45 +0300 Subject: [PATCH] Fix/ci reports fail param (#24) Co-authored-by: moilanik Reviewed-on: https://gitea.app.keskikuja.site/niko/gitea-ci-library/pulls/24 --- .gitea/workflows/example-bats-tests.yml | 2 +- .gitea/workflows/example-build-ci-bats.yml | 36 ++++++++++--- Dockerfile.ci-bats | 2 +- scripts/ci-report.sh | 5 +- skills/consumer-pipelines/SKILL.md | 61 +++++++++++++++++++--- 5 files changed, 87 insertions(+), 19 deletions(-) diff --git a/.gitea/workflows/example-bats-tests.yml b/.gitea/workflows/example-bats-tests.yml index b3f8443..12d5e92 100644 --- a/.gitea/workflows/example-bats-tests.yml +++ b/.gitea/workflows/example-bats-tests.yml @@ -8,7 +8,7 @@ on: bats-image: required: false type: string - default: gitea.app.keskikuja.site/niko/ci-bats:latest + default: gitea.app.keskikuja.site/niko/ci-bats:git secrets: GITEA_TOKEN: required: true diff --git a/.gitea/workflows/example-build-ci-bats.yml b/.gitea/workflows/example-build-ci-bats.yml index ead2697..047a2aa 100644 --- a/.gitea/workflows/example-build-ci-bats.yml +++ b/.gitea/workflows/example-build-ci-bats.yml @@ -1,21 +1,41 @@ -name: Build CI Bats Container (Manual) -on: workflow_dispatch +name: CI Container Build Bats +on: + workflow_dispatch: + inputs: + config_path: + required: true + type: string + default: '.gitea/workflows/example-gitea-env.conf' + description: 'Polku .gitea-env.conf-tiedostoon' + dockerfile_path: + required: true + type: string + default: 'Dockerfile.ci-bats' + description: 'Polku Dockerfileen' + image_name: + required: true + type: string + default: 'ci-bats' + description: 'Kontin nimi ilman registry-polkua' + tag: + required: true + type: string + default: 'latest' + description: 'Image-tägi' jobs: load-config: - name: Load config uses: niko/gitea-ci-library/.gitea/workflows/config-provider.yml@main secrets: inherit with: - config_path: .gitea/workflows/example-gitea-env.conf + config_path: ${{ inputs.config_path }} build-push: - name: Build & Push needs: [load-config] uses: niko/gitea-ci-library/.gitea/workflows/ci-container-build-push.yml@main secrets: inherit with: env_json: ${{ needs.load-config.outputs.env_json }} - dockerfile_path: Dockerfile.ci-bats - image_name: ci-bats - tag: latest + dockerfile_path: ${{ inputs.dockerfile_path }} + image_name: ${{ inputs.image_name }} + tag: ${{ inputs.tag }} diff --git a/Dockerfile.ci-bats b/Dockerfile.ci-bats index ef0f894..09c0879 100644 --- a/Dockerfile.ci-bats +++ b/Dockerfile.ci-bats @@ -1,3 +1,3 @@ FROM bats/bats:1.11.0 -RUN apk add --no-cache lsof python3 jq curl ruby nodejs && \ +RUN apk add --no-cache lsof python3 jq curl ruby nodejs git && \ gem install bashcov -v 3.3.0 diff --git a/scripts/ci-report.sh b/scripts/ci-report.sh index 9cc1dd7..e509ba6 100644 --- a/scripts/ci-report.sh +++ b/scripts/ci-report.sh @@ -4,6 +4,7 @@ set -euo pipefail DESCRIPTION="${1:-}" CONTEXT="${2:-}" SUITE="${3:-}" +STATUS="${4:-success}" [ -n "$DESCRIPTION" ] || { echo "ERROR: description argument required" >&2; exit 1; } [ -n "$CONTEXT" ] || { echo "ERROR: context argument required" >&2; exit 1; } @@ -75,12 +76,12 @@ if [ "$TOTAL" -eq 1 ]; then ENTRY="${SUBDIRS[0]}/index.html" fi URL="${GIT_PAGES_URL}/${GITHUB_REPOSITORY}/reports/${SHA8}/${SUITE}/${ENTRY}" - bash .ci/scripts/report-status.sh success "$DESCRIPTION" "$CONTEXT" "" "$URL" + bash .ci/scripts/report-status.sh "$STATUS" "$DESCRIPTION" "$CONTEXT" "" "$URL" else generate_index cp -a "$REPORT_DIR/." "$STAGED/" bash .ci/scripts/publish-git-pages.sh "$SUITE" - bash .ci/scripts/report-status.sh success "$DESCRIPTION" "$CONTEXT" "$SUITE" + bash .ci/scripts/report-status.sh "$STATUS" "$DESCRIPTION" "$CONTEXT" "$SUITE" fi rm -rf "$STAGED" diff --git a/skills/consumer-pipelines/SKILL.md b/skills/consumer-pipelines/SKILL.md index c3b881b..d4f2c12 100644 --- a/skills/consumer-pipelines/SKILL.md +++ b/skills/consumer-pipelines/SKILL.md @@ -102,9 +102,35 @@ ja exit-koodi välittyy natiivisti. Ylimääräistä `EXIT=$?` + `echo >> GITHUB `set -e` ei pelasta pipe-tilanteessa — `|` syö exit-koodin kuten ennenkin. Redirectillä exit-koodi välittyy luonnollisesti. -**Yksi asia per step:** Älä koskaan niputa useaa post-process-komentoa samaan `run:`-blockiin. -`bash -e` pysäyttää koko stepin jos yksi komento epäonnistuu — seuraavat jäävät ajamatta. -Käytä erillisiä steppejä `if: always()`:lla, jotta jokainen vaihe ajetaan itsenäisesti: +**Yksi asia per step:** Älä koskaan niputa useaa komentoa samaan `run:`-blockiin — oli kyse +sitten post-processista tai testi- / tarkistusvaiheista. `bash -e` pysäyttää koko stepin +ensimmäisellä failaavalla komennolla, ja loput jäävät ajamatta. + +```yaml +# VÄÄRIN — helm template fail → kubeconform jää ajamatta, report jää tekemättä +- name: Run tests + run: | + helm template ... > /tmp/manifests.yaml + kubeconform ... > results.txt 2>&1 + +# OIKEIN — erilliset stepit +- name: Helm template + run: helm template platform-helm/ -f values.yaml > /tmp/manifests.yaml 2>&1 + +- name: Kubeconform + if: success() + run: | + mkdir -p reports/kubeconform + kubeconform ... > reports/kubeconform/results.txt 2>&1 + +- name: Report + if: always() + run: bash .ci/scripts/ci-report.sh "Helm kubeconform" helm-test kubeconform ${{ job.status }} +``` + +Sama pätee post-process-steppeihin. Älä koskaan niputa useaa post-process-komentoa +samaan `run:`-blockiin. Käytä erillisiä steppejä `if: always()`:lla, jotta jokainen +vaihe ajetaan itsenäisesti: ```yaml # VÄÄRIN — jos coverage epäonnistuu, report jää generoimatta @@ -180,9 +206,30 @@ jobs: - name: Report if: always() - run: bash .ci/scripts/ci-report.sh "" + run: bash .ci/scripts/ci-report.sh "" ${{ job.status }} ``` +**Huomio `actions/checkout@v4`:stä:** `container:`-direktiivillä kaikki stepit +ajetaan kontin *sisällä* — myös `actions/checkout@v4`. Se on JavaScript-action +joka vaatii sekä `nodejs` että `git`. Ilman kumpaa tahansa checkout feilaa +`exit 127`. + +```dockerfile +# Varmista että kontissa on nodejs + git +RUN apk add --no-cache nodejs git +``` + +**Tarkista siis aina** että CI-kontin Dockerfilessä on sekä `nodejs` että `git` +asennettuna. Sama pätee mihin tahansa konttiin jota käytetään `container:`-direktiivillä. + +**Usean runnerin cache-ongelma:** Jos eri kerroilla käynnistyy eri runnereita, +niillä voi olla eri versio `latest`-imagen digesteistä. Tämä on `latest`-tagin +tunnettu ongelma. Ratkaisuja: +- Rebuildaa kontti ja aja `docker pull ` manuaalisesti kaikilla + runnereilla +- Käytä versioitua tagia (`v2`, `v3`, ...) ja päivitä workflow'n default + buildauksen jälkeen + Jos testi tuottaa raportteja suoraan ilman jälkikäsittelyä, Post-process-steppiä ei tarvita. Jos jälkikäsittely on tarpeen (coverage-siirto, HTML-generointi raa'asta outputista), se tehdään omassa stepissä `if: always()` — katso tarkemmin [Raporttitasot](#5-raporttitasot). @@ -209,7 +256,7 @@ Kun testi tuottaa raportit suoraan (kuten `pytest --html` tai `cucumber-js --for - name: Report if: always() - run: bash .ci/scripts/ci-report.sh "" + run: bash .ci/scripts/ci-report.sh "" ${{ job.status }} ``` ### Taso 2: Jälkikäsittely tarvitaan @@ -235,7 +282,7 @@ omassa stepissään** — älä koskaan niputa useaa post-process-komentoa samaa - name: Report if: always() - run: bash .ci/scripts/ci-report.sh "" + run: bash .ci/scripts/ci-report.sh "" ${{ job.status }} ``` **Huomio subdir-sisällöstä:** Jos testi tuottaa dataa alihakemistoon (esim. @@ -557,7 +604,7 @@ Gitean Settings → Branches → Add Rule: | Skripti | Käyttötarkoitus | |---|---| -| `ci-report.sh` | Yhdistetty raportointi: julkaisee git-pagesiin ja asettaa commit-statuksen. Korvaa erilliset `publish-git-pages.sh` + `report-status.sh` -kutsut. Käyttö: `bash .ci/scripts/ci-report.sh "" ` | +| `ci-report.sh` | Yhdistetty raportointi: julkaisee git-pagesiin ja asettaa commit-statuksen. Korvaa erilliset `publish-git-pages.sh` + `report-status.sh` -kutsut. Käyttö: `bash .ci/scripts/ci-report.sh "" ${{ job.status }}` | | `report-status.sh` | POSTaa commit-statuksen linkillä (kutsutaan `ci-report.sh`:n sisältä) | | `publish-git-pages.sh` | Julkaisee raporttihakemiston git-pagesiin (kutsutaan `ci-report.sh`:n sisältä) | | `ci-validate.sh` | Validoi `.conf`-tiedoston (kutsutaan `config-provider.yml`:stä) |