Compare commits

...

65 Commits

Author SHA1 Message Date
moilanik 7c93896051 main job ajo tässä haarassa
CI Main / Load example-gitea-env.conf to pipeline env (push) Successful in 17s
CI Main / Check existing artifact (push) Successful in 10s
unit-tests Link to Bats reports
CI Main / Bats tests (push) Successful in 1m38s
acc-tests Link to Cucumber reports
CI Main / Cucumber tests (push) Successful in 1m5s
CI Main / Report Summary (push) Successful in 5s
ci-docker-build-push Docker build & push 0.1.10 OK
CI Main / Build & Push Docker (push) Successful in 36s
2026-06-15 17:01:26 +03:00
moilanik 5859189910 refaktorointia
CI Feature / Load example-gitea-env.conf to pipeline env (push) Successful in 18s
unit-tests Link to Bats reports
CI Feature / Bats tests (push) Successful in 1m39s
acc-tests Link to Cucumber reports
CI Feature / Cucumber tests (push) Successful in 1m5s
CI Feature / Report Summary (push) Successful in 4s
2026-06-15 16:56:22 +03:00
moilanik 607a0f6360 refaktorointia
CI Feature / Load example-gitea-env.conf to pipeline env (push) Successful in 9s
CI Feature / Validate CI config (push) Failing after 16s
ci-bats Bats tests OK
CI Feature / Bats tests (push) Successful in 1m40s
ci-cucumber Cucumber tests OK
CI Feature / Cucumber tests (push) Successful in 1m3s
CI Feature / Report Summary (push) Successful in 5s
2026-06-15 16:49:44 +03:00
moilanik c19f0b79ec refaktorointia
CI Feature / Load example-gitea-env.conf to pipeline env (push) Successful in 12s
ci-bats Bats tests OK
CI Feature / Bats tests (push) Successful in 1m41s
ci-cucumber Cucumber tests OK
CI Feature / Cucumber tests (push) Successful in 1m3s
CI Feature / Report Summary (push) Successful in 4s
CI Feature / Validate CI config (push) Failing after 16s
2026-06-15 16:38:27 +03:00
moilanik 41b1119f21 refaktorointia
CI Feature / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-validate CI config valid
CI Feature / Validate CI config (push) Successful in 16s
ci-bats Bats tests OK
CI Feature / Bats tests (push) Successful in 1m39s
ci-cucumber Cucumber tests OK
CI Feature / Cucumber tests (push) Successful in 1m7s
CI Feature / Report Summary (push) Successful in 5s
2026-06-15 16:10:55 +03:00
moilanik 0b683a7166 refaktorointia
CI Feature / Validate CI config (push) Successful in 20s
ci-cucumber Cucumber tests OK
CI Feature / Cucumber tests (push) Successful in 1m5s
ci-build Build complete
CI Feature / Report Index (push) Successful in 18s
CI Feature / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-validate CI config valid
ci-bats Bats tests OK
CI Feature / Bats tests (push) Successful in 1m42s
2026-06-15 15:59:35 +03:00
moilanik 6988488e04 testiä
CI Feature / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-validate CI validation FAILED
CI Feature / Validate CI config (push) Failing after 17s
ci-bats Bats tests OK
CI Feature / Bats tests (push) Successful in 1m38s
ci-cucumber Running Cucumber tests...
CI Feature / Cucumber tests (push) Failing after 1m14s
CI Feature / Report Index (push) Has been skipped
2026-06-15 15:41:37 +03:00
moilanik 14b8280241 kbkjb
CI Feature / Load gitea-env.conf to pipeline env (push) Successful in 17s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI Feature / Quality Gate (push) Successful in 2m34s
2026-06-15 15:15:08 +03:00
moilanik 30cd407018 refactor: split ci.yml into branch-specific orchestrators, extract version check
CI / Feature (push) Successful in 13s
CI / Main (push) Has been skipped
- ci.yml: pure dispatch (Feature → ci-feature, Main → ci-main), 18 lines
- ci-feature.yml (new):  load-config → quality-gate
- ci-main.yml (new):     load-config → check-version → quality-gate → docker-build-push
- check-version.yml (new): provider workflow for artifact existence check and version calculation
- docker-build-push.yml (renamed from build_publish-artifact.yml):
  - removed check job, quality-gate block, gatekeeper logic, build-context artifact
  - version passed as input, simplified needs chain (build → push → tag-commit)
  - fixed consumer→provider checkout pattern (.ci/scripts/)
2026-06-15 14:29:01 +03:00
moilanik 3de301aa92 retention 1
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.9 required
ci-docker-build Docker build 0.1.9 OK
ci-docker-push Docker push 0.1.9 OK
ci-docker-tag Tag 0.1.9 OK
CI / Build & Push Artifact (push) Successful in 1m20s
2026-06-15 13:54:47 +03:00
moilanik 4dcbb11f20 eg
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.8 required
ci-docker-build Docker build 0.1.8 OK
ci-docker-push Docker push 0.1.8 OK
ci-docker-tag Tag 0.1.8 OK
CI / Build & Push Artifact (push) Successful in 1m27s
2026-06-15 13:51:33 +03:00
moilanik 9da134bdaf 1
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.8 required
CI / Build & Push Artifact (push) Failing after 27s
2026-06-15 13:48:39 +03:00
moilanik 752bbb332f siivous
CI / Load gitea-env.conf to pipeline env (push) Successful in 14s
ci-check Build version 0.1.8 required
CI / Build & Push Artifact (push) Failing after 1m2s
2026-06-15 13:39:36 +03:00
moilanik 45404dc002 retention temp artifakteille
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Check version FAILED
CI / Build & Push Artifact (push) Failing after 51s
2026-06-15 13:35:14 +03:00
moilanik 5a00763d8f asgas
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.7 required
ci-docker-build Docker build 0.1.7 OK
ci-docker-push Docker push 0.1.7 OK
ci-docker-tag Tag 0.1.7 OK
CI / Build & Push Artifact (push) Successful in 1m24s
2026-06-15 13:26:08 +03:00
moilanik 4a79ce9d17 sag
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.7 required
ci-docker-build Docker build 0.1.7 OK
ci-docker-push Docker push 0.1.7 OK
CI / Build & Push Artifact (push) Failing after 1m4s
2026-06-15 13:21:49 +03:00
moilanik 9d402578bd siivous
CI / Load gitea-env.conf to pipeline env (push) Successful in 14s
ci-check Build version 0.1.7 required
ci-docker-build Docker build 0.1.7 OK
CI / Build & Push Artifact (push) Failing after 53s
2026-06-15 13:19:08 +03:00
moilanik 63ce59e604 clean
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.6 required
ci-docker-build Docker build 0.1.6 OK
ci-docker-push Docker push 0.1.6 OK
ci-docker-tag Tag 0.1.6 OK
CI / Build & Push Artifact (push) Successful in 1m21s
2026-06-15 13:13:13 +03:00
moilanik a566998180 siivous
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Build version 0.1.5 required
ci-docker-build Docker build 0.1.5 OK
ci-docker-push Docker push 0.1.5 OK
ci-docker-tag Tag 0.1.5 OK
CI / Build & Push Artifact (push) Successful in 1m24s
2026-06-15 12:43:33 +03:00
moilanik 1239cc5673 siivotaa temp artifactit pois
CI / Load gitea-env.conf to pipeline env (push) Successful in 10s
ci-check Build version 0.1.4 required
ci-docker-build Docker build 0.1.4 OK
ci-docker-push Docker push 0.1.4 OK
ci-docker-tag Tag 0.1.4 OK
CI / Build & Push Artifact (push) Successful in 1m26s
2026-06-15 12:38:44 +03:00
moilanik 20a6099969 kokeillaan meneekö oikeaan paikkaan
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.3 required
ci-docker-build Docker build 0.1.3 OK
ci-docker-push Docker push 0.1.3 OK
ci-docker-tag Tag 0.1.3 OK
CI / Build & Push Artifact (push) Successful in 1m25s
2026-06-15 12:32:04 +03:00
moilanik c7141fc28f koodi repon packageksi
CI / Load gitea-env.conf to pipeline env (push) Successful in 15s
ci-check Build version 0.1.2 required
ci-docker-build Docker build 0.1.2 OK
ci-docker-push Docker push 0.1.2 OK
ci-docker-tag Tag 0.1.2 OK
CI / Build & Push Artifact (push) Successful in 1m34s
2026-06-15 12:05:20 +03:00
moilanik c87e585918 test
CI / Load gitea-env.conf to pipeline env (push) Successful in 14s
ci-check Build version 0.1.1 required
ci-docker-build Docker build 0.1.1 OK
ci-docker-push Docker push 0.1.1 OK
ci-docker-tag Tag 0.1.1 OK
CI / Build & Push Artifact (push) Successful in 1m22s
2026-06-15 11:49:54 +03:00
moilanik 8f4725e23f docker pat to actions secret in gitea side
CI / Load gitea-env.conf to pipeline env (push) Successful in 15s
ci-check Build version 0.1.0 required
ci-docker-build Docker build 0.1.0 OK
ci-docker-push Docker push 0.1.0 OK
ci-docker-tag Tag 0.1.0 OK
CI / Build & Push Artifact (push) Successful in 1m56s
2026-06-15 11:43:16 +03:00
moilanik f35c24857f docker yleiseksi rakenteeltaan
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-docker-build Docker build 0.1.0 OK
ci-docker-push Docker push 0.1.0 FAILED
CI / Build & Push Artifact (push) Failing after 1m6s
2026-06-15 11:31:09 +03:00
moilanik c233ef8975 struj
CI / Load gitea-env.conf to pipeline env (push) Successful in 14s
ci-check Build version 0.1.0 required
ci-docker-build Docker build 0.1.0 OK
ci-docker-push Docker push 0.1.0 FAILED
CI / Build & Push Artifact (push) Failing after 1m10s
2026-06-15 10:46:06 +03:00
moilanik f32b345f58 kokeillaan ilman quality gate
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-docker-push Docker push 0.1.0 FAILED
CI / Build & Push Artifact (push) Failing after 1m4s
2026-06-15 10:28:02 +03:00
moilanik 0740dbf815 adrfhhda
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
ci-docker-push Docker push 0.1.0 FAILED
CI / Build & Push Artifact (push) Failing after 3m28s
2026-06-15 09:53:58 +03:00
moilanik 0efd7db43a asgasr
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Build version 0.1.0 required
CI / Build & Push Artifact (push) Successful in 15s
2026-06-15 09:40:21 +03:00
moilanik 705af709c4 etaerst
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Failing after 4m22s
2026-06-15 09:29:56 +03:00
moilanik 1d396c8278 runner päivityksessä cucumber testi meni pieleen. korjaus
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m30s
2026-06-15 09:20:23 +03:00
moilanik 16b25970ff päivitettu runner image 1.0.4 -> 1.0.8
CI / Load gitea-env.conf to pipeline env (push) Successful in 2m8s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
CI / Build & Push Artifact (push) Failing after 2m13s
2026-06-15 08:50:54 +03:00
moilanik 52601104b0 sdgsf
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Failing after 3m45s
2026-06-15 08:19:41 +03:00
moilanik 8312cff6ec asg
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 3m11s
2026-06-15 08:07:50 +03:00
moilanik 8c11306f2b sadg 2026-06-15 08:07:14 +03:00
moilanik 2ae96a5355 asdgas
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Check version FAILED
CI / Build & Push Artifact (push) Failing after 18s
2026-06-15 08:00:59 +03:00
moilanik fc76234379 fake
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Check version FAILED
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Failing after 2m21s
2026-06-15 06:42:26 +03:00
moilanik 0fa291f103 asgasg
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Check version FAILED
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Failing after 2m28s
2026-06-15 06:32:43 +03:00
moilanik db47775249 build ehto muutos
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m25s
2026-06-15 06:13:47 +03:00
moilanik 1be3b5b434 asgre
CI / Load gitea-env.conf to pipeline env (push) Successful in 14s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Failing after 2m43s
2026-06-15 06:07:35 +03:00
moilanik 544ec4afe4 sadg
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m32s
2026-06-15 06:03:28 +03:00
moilanik 815c39c6a7 fake
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Failing after 2m30s
2026-06-15 05:57:08 +03:00
moilanik ccec73e40a kiristetään ehtoa!
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Failing after 2m30s
2026-06-15 05:49:14 +03:00
moilanik 26394e5a54 build ehto korjattu
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m24s
2026-06-15 05:39:10 +03:00
moilanik 8d9bd42f6c build vaatimus tarkistettu
CI / Load gitea-env.conf to pipeline env (push) Successful in 11s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m31s
2026-06-15 05:29:51 +03:00
moilanik 69d574955c pikkasen muutetaan ehtoja
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m33s
2026-06-15 05:20:20 +03:00
moilanik cbd63b7581 google ai kanssa katstottu pipeline
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m34s
2026-06-15 05:06:20 +03:00
moilanik ae84083eae dsfh
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m35s
2026-06-14 14:20:15 +03:00
moilanik 2d3fd96768 argha
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m29s
2026-06-14 14:07:13 +03:00
moilanik 95f0aca47e aedsvg<sDV
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check-running Checking version...
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
CI / Build & Push Artifact (push) Failing after 1m21s
2026-06-14 14:01:23 +03:00
moilanik b6c4d5ae4f fake
CI / Load gitea-env.conf to pipeline env (push) Successful in 15s
ci-check-running Checking version...
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m31s
2026-06-14 13:49:59 +03:00
moilanik 5e011b3993 äpkjoå¨0j
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-bats Bats tests
ci-build Build complete
ci-check-running Checking version...
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
CI / Build & Push Artifact (push) Has been cancelled
2026-06-14 13:45:12 +03:00
moilanik 5f14554b1f asg
CI / Load gitea-env.conf to pipeline env (push) Successful in 16s
ci-check-running Checking version...
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m30s
2026-06-14 13:39:27 +03:00
moilanik 416939fb82 srghaer
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check-running Checking version...
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m29s
2026-06-14 13:25:04 +03:00
moilanik ccf833d698 öoämj
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-check Build version 0.1.0 required
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m28s
2026-06-14 13:11:50 +03:00
moilanik 5848f47c0e wseg
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-check Check version
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 3m29s
2026-06-14 11:08:18 +03:00
moilanik b32a97ed9b qwen
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m23s
2026-06-14 10:55:18 +03:00
moilanik e853e22d1d trigger CI: test build fix
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m31s
2026-06-14 10:42:11 +03:00
moilanik 83e35f5324 arghr
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m29s
2026-06-14 10:29:10 +03:00
moilanik 95257c17b9 ä',pk'pnå9gv
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m31s
2026-06-14 10:12:57 +03:00
moilanik b51adf3410 adfhadfh
CI / Load gitea-env.conf to pipeline env (push) Successful in 13s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m34s
2026-06-14 09:55:53 +03:00
moilanik daa5dc58ed tuleeko kontti?
CI / Load gitea-env.conf to pipeline env (push) Successful in 10s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Build & Push Artifact (push) Successful in 2m34s
2026-06-14 09:48:39 +03:00
moilanik 5ac7516672 fix(retention): add retry on Gitea API errors
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Quality Gate (push) Successful in 2m17s
CI / Build & Push Artifact (push) Has been skipped
- Retry up to 3 times (2 retries) on non-200/non-404 responses
- 10 second delay between retries
- Fail-safe: keep report if all retries fail
2026-06-14 09:17:09 +03:00
moilanik 622e8acdc5 fix(retention): fail-safe on Gitea API errors
- Keep reports when Gitea API returns non-200/non-404 status
- Only delete on actual 404 (branch truly doesn't exist)
- Log warning for API errors to aid debugging
2026-06-14 09:14:52 +03:00
moilanik 6e26281fea fix: add missing GITEA_TOKEN auth to tags API call in check job
CI / Load gitea-env.conf to pipeline env (push) Successful in 12s
CI / Build & Push Artifact (push) Has been skipped
ci-cucumber Cucumber tests
ci-bats Bats tests
ci-build Build complete
CI / Quality Gate (push) Successful in 2m14s
2026-06-14 08:56:54 +03:00
21 changed files with 812 additions and 351 deletions
-30
View File
@@ -1,30 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
SHA8="${GITHUB_SHA:0:8}"
REPORTS_DIR="reports/${SHA8}"
mkdir -p "${REPORTS_DIR}"
BATS_PASS=$(grep -c 'ok' "${REPORTS_DIR}/bats/results.txt" 2>/dev/null || echo 0)
BATS_FAIL=$(grep -c 'not ok' "${REPORTS_DIR}/bats/results.txt" 2>/dev/null || echo 0)
CUCUMBER_PASS=$(jq '.summary.passed // 0' "${REPORTS_DIR}/cucumber/report.json" 2>/dev/null || echo 0)
CUCUMBER_FAIL=$(jq '.summary.failed // 0' "${REPORTS_DIR}/cucumber/report.json" 2>/dev/null || echo 0)
{
echo "<!DOCTYPE html><html><head><meta charset='utf-8'>"
echo "<title>CI report ${SHA8}</title>"
echo "<style>body{font-family:sans-serif;margin:2em}a{color:#2563eb}table{border-collapse:collapse}"
echo "th,td{border:1px solid #ccc;padding:8px;text-align:left}"
echo ".pass{color:#059669}.fail{color:#dc2626}</style></head><body>"
echo "<h1>CI report <code>${SHA8}</code></h1>"
echo "<p>Commit: ${GITHUB_SHA}<br>Branch: ${GITHUB_REF_NAME}<br>Run: ${GITHUB_RUN_ID}</p>"
echo "<table><tr><th>Suite</th><th>Passed</th><th>Failed</th><th>Report</th></tr>"
echo "<tr><td>Bats</td><td class='pass'>${BATS_PASS}</td><td class='fail'>${BATS_FAIL}</td>"
echo "<td><a href='bats/results.txt'>results.txt</a>"
echo " | <a href='bats/junit.xml'>junit.xml</a></td></tr>"
echo "<tr><td>Cucumber</td><td class='pass'>${CUCUMBER_PASS}</td><td class='fail'>${CUCUMBER_FAIL}</td>"
echo "<td><a href='cucumber/index.html'>report</a>"
echo " | <a href='cucumber/report.json'>json</a></td></tr>"
echo "</table></body></html>"
} > "${REPORTS_DIR}/index.html"
-124
View File
@@ -1,124 +0,0 @@
name: Build & Publish Artifact
on:
workflow_call:
inputs:
env_json:
required: true
type: string
bats-image:
required: true
type: string
cucumber-node-image:
required: true
type: string
secrets:
GITEA_TOKEN:
required: true
GIT_PAGES_PUBLISH_TOKEN:
required: true
env:
GITEA_API_URL: ${{ fromJson(inputs.env_json).GITEA_API_URL }}
GIT_PAGES_URL: ${{ fromJson(inputs.env_json).GIT_PAGES_URL }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GIT_PAGES_PUBLISH_TOKEN: ${{ secrets.GIT_PAGES_PUBLISH_TOKEN }}
jobs:
check:
runs-on: ubuntu-latest
outputs:
artifact_exists: ${{ steps.check.outputs.artifact_exists }}
version: ${{ steps.check.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Check existing artifact
id: check
run: |
VERSION=$(jq -r '.version' package.json)
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
TAG=$(curl -s "$GITEA_API_URL/api/v1/repos/$GITHUB_REPOSITORY/tags" | \
jq -r '.[] | select(.commit.sha == "'"$GITHUB_SHA"'") | .name' | head -1)
if [ -n "$TAG" ]; then
echo "artifact_exists=true" >> "$GITHUB_OUTPUT"
echo "Commit already tagged as $TAG, skipping build"
else
echo "artifact_exists=false" >> "$GITHUB_OUTPUT"
fi
quality-gate:
needs: [check]
if: needs.check.outputs.artifact_exists == 'false'
uses: niko/gitea-ci-library/.gitea/workflows/quality-gate.yml@main
secrets: inherit
with:
env_json: ${{ inputs.env_json }}
bats-image: ${{ inputs.bats-image }}
cucumber-node-image: ${{ inputs.cucumber-node-image }}
build:
needs: [check, quality-gate]
if: needs.check.outputs.artifact_exists == 'false'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build container
run: |
docker build -t "minimal:${{ needs.check.outputs.version }}" .
mkdir -p /tmp/image
docker save "minimal:${{ needs.check.outputs.version }}" -o /tmp/image/artifact.tar
- name: Save Docker image for next job
uses: actions/upload-artifact@v4
with:
name: docker-image
path: /tmp/image/artifact.tar
push:
needs: [check, build]
runs-on: ubuntu-latest
steps:
- name: Load saved Docker image
uses: actions/download-artifact@v4
with:
name: docker-image
path: /tmp/image
- name: Push to Gitea Packages
run: |
VERSION="${{ needs.check.outputs.version }}"
docker load -i /tmp/image/artifact.tar
REGISTRY=$(echo "$GITEA_API_URL" | sed 's|https://||')
IMAGE="$REGISTRY/niko/gitea-ci-library/minimal:$VERSION"
docker tag "minimal:$VERSION" "$IMAGE"
docker login "$REGISTRY" -u niko -p "$GITEA_TOKEN"
docker push "$IMAGE"
docker logout "$REGISTRY"
tag-commit:
needs: [check, push]
runs-on: ubuntu-latest
steps:
- name: Create git tag
run: |
VERSION="${{ needs.check.outputs.version }}"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
"$GITEA_API_URL/api/v1/repos/$GITHUB_REPOSITORY/tags" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"tag_name\": \"$VERSION\",
\"message\": \"Build #$GITHUB_RUN_NUMBER\",
\"target\": \"$GITHUB_SHA\"
}")
if [ "$HTTP_CODE" = "201" ]; then
echo "Tag $VERSION created"
elif [ "$HTTP_CODE" = "409" ]; then
echo "Tag $VERSION already exists (parallel build won), skipping"
else
echo "Failed to create tag: HTTP $HTTP_CODE"
exit 1
fi
+64
View File
@@ -0,0 +1,64 @@
name: Check Existing Artifact
on:
workflow_call:
inputs:
env_json:
required: true
type: string
secrets:
GITEA_TOKEN:
required: true
outputs:
artifact_exists:
value: ${{ jobs.check.outputs.artifact_exists }}
version:
value: ${{ jobs.check.outputs.version }}
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
jobs:
check:
runs-on: ubuntu-latest
outputs:
artifact_exists: ${{ steps.set-outputs.outputs.artifact_exists }}
version: ${{ steps.set-outputs.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Check existing artifact and calculate version
run: |
RAW_VERSION=$(jq -r '.version' package.json)
BASE_VERSION=$(echo "$RAW_VERSION" | cut -d'.' -f1-2)
echo "gitea-ci-library - Tunnistettu Major.Minor versio: $BASE_VERSION"
TAGS_JSON=$(curl -s -f -H "Authorization: token $GITEA_TOKEN" \
"${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/tags")
TAG=$(echo "$TAGS_JSON" | jq -r 'if type == "array" then .[] | select(.commit.sha == "${{ github.sha }}") | .name else empty end' | head -1)
mkdir -p /tmp/build-ctx
if [ -n "$TAG" ]; then
echo "ARTIFACT_EXISTS=true" > /tmp/build-ctx/build.env
echo "NEXT_VERSION=$TAG" >> /tmp/build-ctx/build.env
echo "gitea-ci-library - Artefakti löytyi jo tagilla: $TAG."
else
echo "ARTIFACT_EXISTS=false" > /tmp/build-ctx/build.env
HIGHEST_PATCH=$(echo "$TAGS_JSON" | jq -r --arg bv "$BASE_VERSION." '
if type == "array" then .[] | .name | select(startswith($bv)) | sub($bv; "") | tonumber else empty end' | sort -rn | head -1)
if [ -z "$HIGHEST_PATCH" ]; then NEXT_PATCH=0; else NEXT_PATCH=$((HIGHEST_PATCH + 1)); fi
FULL_VERSION="${BASE_VERSION}.${NEXT_PATCH}"
echo "NEXT_VERSION=$FULL_VERSION" >> /tmp/build-ctx/build.env
echo "gitea-ci-library - Uusi vapaa versio: $FULL_VERSION"
fi
- name: Set job outputs
id: set-outputs
run: |
source /tmp/build-ctx/build.env
echo "artifact_exists=$ARTIFACT_EXISTS" >> "$GITHUB_OUTPUT"
echo "version=$NEXT_VERSION" >> "$GITHUB_OUTPUT"
-34
View File
@@ -1,34 +0,0 @@
name: CI
on:
push:
branches: ["**"]
workflow_dispatch:
jobs:
load-config:
name: Load gitea-env.conf to pipeline env
uses: niko/gitea-ci-library/.gitea/workflows/config-provider.yml@main
with:
config_path: .gitea/workflows/gitea-env.conf
feature:
name: Quality Gate
if: github.ref != 'refs/heads/main'
needs: [load-config]
uses: niko/gitea-ci-library/.gitea/workflows/quality-gate.yml@main
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
bats-image: bats/bats:latest
cucumber-node-image: node:22
main:
name: Build & Push Artifact
if: github.ref == 'refs/heads/main'
needs: [load-config]
uses: niko/gitea-ci-library/.gitea/workflows/build_publish-artifact.yml@main
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
bats-image: bats/bats:latest
cucumber-node-image: node:22
+24 -1
View File
@@ -1,21 +1,41 @@
name: Config Provider Library name: Config Provider
on: on:
workflow_call: workflow_call:
inputs: inputs:
config_path: config_path:
required: true required: true
type: string type: string
secrets:
GITEA_TOKEN:
required: true
GIT_PAGES_PUBLISH_TOKEN:
required: true
outputs: outputs:
env_json: env_json:
value: ${{ jobs.parse-config.outputs.json_data }} value: ${{ jobs.parse-config.outputs.json_data }}
config_path:
value: ${{ jobs.parse-config.outputs.config_path }}
env:
CI_CONF_FILE: ${{ inputs.config_path }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GIT_PAGES_PUBLISH_TOKEN: ${{ secrets.GIT_PAGES_PUBLISH_TOKEN }}
jobs: jobs:
parse-config: parse-config:
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
json_data: ${{ steps.convert.outputs.JSON_OUT }} json_data: ${{ steps.convert.outputs.JSON_OUT }}
config_path: ${{ steps.set-path.outputs.CONFIG_PATH }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Validate CI config
run: bash .ci/scripts/ci-validate.sh
- id: convert - id: convert
run: | run: |
@@ -29,3 +49,6 @@ jobs:
CLEAN_JSON=$(echo "$JSON_STRING" | jq -c .) CLEAN_JSON=$(echo "$JSON_STRING" | jq -c .)
echo "JSON_OUT=$CLEAN_JSON" >> "$GITHUB_OUTPUT" echo "JSON_OUT=$CLEAN_JSON" >> "$GITHUB_OUTPUT"
- id: set-path
run: echo "CONFIG_PATH=${{ inputs.config_path }}" >> "$GITHUB_OUTPUT"
+101
View File
@@ -0,0 +1,101 @@
name: Docker Build & Push
on:
workflow_call:
inputs:
env_json:
required: true
type: string
version:
required: true
type: string
secrets:
GITEA_TOKEN:
required: true
DOCKER_USERNAME:
required: false
DOCKER_PASSWORD:
required: true
env:
GITEA_API_URL: ${{ fromJson(inputs.env_json).GITEA_API_URL }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
DOCKER_REGISTRY: ${{ fromJson(inputs.env_json).DOCKER_REGISTRY || '' }}
DOCKER_IMAGE_NAME: ${{ fromJson(inputs.env_json).DOCKER_IMAGE_NAME || '' }}
DOCKER_UI_URL: ${{ fromJson(inputs.env_json).DOCKER_UI_URL || '' }}
VERSION: ${{ inputs.version }}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Build and push container
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME || github.actor }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
run: |
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
docker build \
--label "git.commit=${{ github.sha }}" \
--label "git.commitBy=${{ github.actor }}" \
--label "build.date=${NOW}" \
-t "${DOCKER_IMAGE_NAME}:${VERSION}" .
REGISTRY="${DOCKER_REGISTRY:?DOCKER_REGISTRY not set in env.conf}"
IMAGE="${DOCKER_IMAGE_NAME:?DOCKER_IMAGE_NAME not set in env.conf}"
REGISTRY_HOST="${REGISTRY%%/*}"
FULL_IMAGE="${REGISTRY}/${IMAGE}:${VERSION}"
echo "Pushing ${FULL_IMAGE} ..."
docker tag "${DOCKER_IMAGE_NAME}:${VERSION}" "$FULL_IMAGE"
echo "$DOCKER_PASSWORD" | docker login "$REGISTRY_HOST" -u "$DOCKER_USERNAME" --password-stdin
docker push "$FULL_IMAGE"
docker logout "$REGISTRY_HOST"
- name: Report status SUCCESS
if: success()
run: |
CONTAINER_URL=""
if [ -n "${DOCKER_UI_URL:-}" ] && [ -n "${VERSION:-}" ]; then
CONTAINER_URL="${DOCKER_UI_URL}/${VERSION}"
fi
bash .ci/scripts/report-status.sh success "Docker build & push ${VERSION} OK" ci-docker-build-push "" "$CONTAINER_URL"
- name: Report status FAILURE
if: failure()
run: bash .ci/scripts/report-status.sh failure "Docker build & push ${VERSION} FAILED" ci-docker-build-push
tag-commit:
runs-on: ubuntu-latest
needs: [build-push]
steps:
- uses: actions/checkout@v4
- name: Create git tag
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
SERVER_URL: ${{ gitea.server_url }}
RUN_NUMBER: ${{ github.run_number }}
SHA: ${{ github.sha }}
run: |
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
"$SERVER_URL/api/v1/repos/${{ github.repository }}/tags" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"tag_name\": \"${VERSION}\", \"message\": \"Build #$RUN_NUMBER\", \"target\": \"$SHA\"}")
if [ "$HTTP_CODE" = "201" ] || [ "$HTTP_CODE" = "409" ]; then
exit 0
else
exit 1
fi
+64
View File
@@ -0,0 +1,64 @@
name: Bats Tests
on:
workflow_call:
inputs:
env_json:
required: true
type: string
bats-image:
required: true
type: string
secrets:
GITEA_TOKEN:
required: true
GIT_PAGES_PUBLISH_TOKEN:
required: true
env:
GITEA_API_URL: ${{ fromJson(inputs.env_json).GITEA_API_URL }}
GIT_PAGES_URL: ${{ fromJson(inputs.env_json).GIT_PAGES_URL }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GIT_PAGES_PUBLISH_TOKEN: ${{ secrets.GIT_PAGES_PUBLISH_TOKEN }}
jobs:
bats:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Run bats tests
id: bats-tests
shell: bash
run: |
docker volume create bats-workspace
tar c . | docker run --rm -i -v bats-workspace:/data alpine tar x -C /data
mkdir -p "reports/${GITHUB_SHA:0:8}/bats"
set +e
docker run --rm \
-v bats-workspace:/data \
--entrypoint bash ${{ inputs.bats-image }} \
-c 'apk add -q lsof python3 jq curl ruby && cd /data && gem install bashcov -v 3.3.0 2>&1 | tail -1 && bashcov -- bats tests/' \
> "reports/${GITHUB_SHA:0:8}/bats/results.txt" 2>&1
BATS_EXIT=$?
bash .ci/.gitea/scripts/bats-coverage.sh bats-workspace "reports/${GITHUB_SHA:0:8}/bats"
docker volume rm bats-workspace > /dev/null 2>&1
bash .ci/.gitea/scripts/bats-report.sh "reports/${GITHUB_SHA:0:8}/bats"
echo "BATS_EXIT=${BATS_EXIT}" >> "${GITHUB_ENV}"
exit ${BATS_EXIT}
- name: Publish bats reports
if: always()
run: bash .ci/scripts/publish-git-pages.sh bats
- name: Report status
if: always()
run: |
if [ "${BATS_EXIT}" = "0" ]; then
bash .ci/scripts/report-status.sh success "Link to Bats reports" unit-tests bats
else
bash .ci/scripts/report-status.sh failure "Link to Bats reports" unit-tests bats
fi
@@ -0,0 +1,70 @@
name: Cucumber Tests
on:
workflow_call:
inputs:
env_json:
required: true
type: string
cucumber-node-image:
required: true
type: string
secrets:
GITEA_TOKEN:
required: true
GIT_PAGES_PUBLISH_TOKEN:
required: true
env:
GITEA_API_URL: ${{ fromJson(inputs.env_json).GITEA_API_URL }}
GIT_PAGES_URL: ${{ fromJson(inputs.env_json).GIT_PAGES_URL }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GIT_PAGES_PUBLISH_TOKEN: ${{ secrets.GIT_PAGES_PUBLISH_TOKEN }}
jobs:
cucumber:
runs-on: ubuntu-latest
container:
image: ${{ inputs.cucumber-node-image }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Run cucumber tests
id: cucumber-tests
shell: bash
run: |
apt-get update -qq && apt-get install -y -qq --no-install-recommends lsof jq
npm install @cucumber/cucumber > /dev/null 2>&1
mkdir -p "reports/${GITHUB_SHA:0:8}/cucumber"
set +e
npx cucumber-js \
--format json:"reports/${GITHUB_SHA:0:8}/cucumber/report.json" \
--format html:"reports/${GITHUB_SHA:0:8}/cucumber/index.html" 2>&1
CUCUMBER_EXIT=$?
echo "CUCUMBER_EXIT=${CUCUMBER_EXIT}" >> "${GITHUB_ENV}"
exit ${CUCUMBER_EXIT}
- name: Publish cucumber reports
if: always()
run: bash .ci/scripts/publish-git-pages.sh cucumber
- name: Report status
if: always()
shell: bash
run: |
if [ "${CUCUMBER_EXIT}" = "0" ]; then
if [ -f "reports/${GITHUB_SHA:0:8}/cucumber/index.html" ]; then
bash .ci/scripts/report-status.sh success "Link to Cucumber reports" acc-tests cucumber
else
bash .ci/scripts/report-status.sh success "Link to Cucumber reports" acc-tests
fi
else
if [ -f "reports/${GITHUB_SHA:0:8}/cucumber/index.html" ]; then
bash .ci/scripts/report-status.sh failure "Link to Cucumber reports" acc-tests cucumber
else
bash .ci/scripts/report-status.sh failure "Link to Cucumber reports" acc-tests
fi
fi
+42
View File
@@ -0,0 +1,42 @@
name: CI Feature
on:
push:
branches-ignore:
- feature/docker-kuntoon
- main
workflow_dispatch:
jobs:
load-config:
name: Load example-gitea-env.conf to pipeline env
uses: niko/gitea-ci-library/.gitea/workflows/config-provider.yml@feature/docker-kuntoon
secrets: inherit
with:
config_path: .gitea/workflows/example-gitea-env.conf
bats:
name: Bats tests
needs: [load-config]
uses: niko/gitea-ci-library/.gitea/workflows/example-bats-tests.yml@feature/docker-kuntoon
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
bats-image: bats/bats:latest
cucumber:
name: Cucumber tests
needs: [load-config]
uses: niko/gitea-ci-library/.gitea/workflows/example-cucumber-tests.yml@feature/docker-kuntoon
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
cucumber-node-image: node:22
report-summary:
name: Report Summary
needs: [load-config, bats, cucumber]
if: always()
uses: niko/gitea-ci-library/.gitea/workflows/example-report-summary.yml@feature/docker-kuntoon
with:
env_json: ${{ needs.load-config.outputs.env_json }}
suites: bats cucumber
+5
View File
@@ -0,0 +1,5 @@
GITEA_API_URL=https://gitea.app.keskikuja.site
GIT_PAGES_URL=https://ci-reports.helm-dev.keskikuja.site
DOCKER_REGISTRY=gitea.app.keskikuja.site/niko
DOCKER_IMAGE_NAME=gitea-ci-library-test-image
DOCKER_UI_URL=https://gitea.app.keskikuja.site/niko/-/packages/container/gitea-ci-library-test-image
+62
View File
@@ -0,0 +1,62 @@
name: CI Main
on:
push:
branches:
- feature/docker-kuntoon
- main
workflow_dispatch:
jobs:
load-config:
name: Load example-gitea-env.conf to pipeline env
uses: niko/gitea-ci-library/.gitea/workflows/config-provider.yml@feature/docker-kuntoon
secrets: inherit
with:
config_path: .gitea/workflows/example-gitea-env.conf
check-version:
name: Check existing artifact
needs: [load-config]
uses: niko/gitea-ci-library/.gitea/workflows/check-version.yml@feature/docker-kuntoon
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
bats:
name: Bats tests
needs: [load-config, check-version]
if: needs.check-version.outputs.artifact_exists != 'true'
uses: niko/gitea-ci-library/.gitea/workflows/example-bats-tests.yml@feature/docker-kuntoon
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
bats-image: bats/bats:latest
cucumber:
name: Cucumber tests
needs: [load-config, check-version]
if: needs.check-version.outputs.artifact_exists != 'true'
uses: niko/gitea-ci-library/.gitea/workflows/example-cucumber-tests.yml@feature/docker-kuntoon
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
cucumber-node-image: node:22
report-summary:
name: Report Summary
needs: [load-config, bats, cucumber]
if: always()
uses: niko/gitea-ci-library/.gitea/workflows/example-report-summary.yml@feature/docker-kuntoon
with:
env_json: ${{ needs.load-config.outputs.env_json }}
suites: bats cucumber
build-push:
name: Build & Push Docker
needs: [load-config, check-version, bats, cucumber]
if: needs.check-version.outputs.artifact_exists != 'true'
uses: niko/gitea-ci-library/.gitea/workflows/docker-build-push.yml@feature/docker-kuntoon
secrets: inherit
with:
env_json: ${{ needs.load-config.outputs.env_json }}
version: ${{ needs.check-version.outputs.version }}
@@ -0,0 +1,34 @@
name: Report Summary
on:
workflow_call:
inputs:
env_json:
required: true
type: string
suites:
required: true
type: string
description: Space-separated suite names published to git-pages
env:
GIT_PAGES_URL: ${{ fromJson(inputs.env_json).GIT_PAGES_URL }}
jobs:
summary:
runs-on: ubuntu-latest
steps:
- name: Generate report links
shell: bash
run: |
SHA8="${GITHUB_SHA:0:8}"
BASE="${GIT_PAGES_URL}/${GITHUB_REPOSITORY}/reports/${SHA8}"
{
echo "## Test Reports"
echo ""
echo "| Suite | Report |"
echo "|-------|--------|"
for suite in ${{ inputs.suites }}; do
echo "| ${suite} | [View report](${BASE}/${suite}/) |"
done
} >> "${GITHUB_STEP_SUMMARY}"
-2
View File
@@ -1,2 +0,0 @@
GITEA_API_URL=https://gitea.app.keskikuja.site
GIT_PAGES_URL=https://ci-reports.helm-dev.keskikuja.site
-133
View File
@@ -1,133 +0,0 @@
name: Quality Gate
on:
workflow_call:
inputs:
env_json:
required: true
type: string
bats-image:
required: true
type: string
cucumber-node-image:
required: true
type: string
secrets:
GITEA_TOKEN:
required: true
GIT_PAGES_PUBLISH_TOKEN:
required: true
env:
GITEA_API_URL: ${{ fromJson(inputs.env_json).GITEA_API_URL }}
GIT_PAGES_URL: ${{ fromJson(inputs.env_json).GIT_PAGES_URL }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GIT_PAGES_PUBLISH_TOKEN: ${{ secrets.GIT_PAGES_PUBLISH_TOKEN }}
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Validate CI config
run: bash .ci/scripts/ci-validate.sh
bats:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Run bats tests
id: bats-tests
shell: bash
run: |
docker volume create bats-workspace
tar c . | docker run --rm -i -v bats-workspace:/data alpine tar x -C /data
mkdir -p "reports/${GITHUB_SHA:0:8}/bats"
set +e
docker run --rm \
-v bats-workspace:/data \
--entrypoint bash ${{ inputs.bats-image }} \
-c 'apk add -q lsof python3 jq curl ruby && cd /data && gem install bashcov -v 3.3.0 2>&1 | tail -1 && bashcov -- bats tests/' \
> "reports/${GITHUB_SHA:0:8}/bats/results.txt" 2>&1
BATS_EXIT=$?
bash .ci/.gitea/scripts/bats-coverage.sh bats-workspace "reports/${GITHUB_SHA:0:8}/bats"
docker volume rm bats-workspace > /dev/null 2>&1
bash .ci/.gitea/scripts/bats-report.sh "reports/${GITHUB_SHA:0:8}/bats"
echo "BATS_EXIT=${BATS_EXIT}" >> "${GITHUB_ENV}"
exit ${BATS_EXIT}
- name: Publish bats reports
if: always()
run: bash .ci/scripts/publish-git-pages.sh bats
- name: Set bats commit status
if: always()
run: |
if [ "${BATS_EXIT}" = "0" ]; then
bash .ci/scripts/report-status.sh success "Bats tests" ci-bats bats
else
bash .ci/scripts/report-status.sh failure "Bats tests FAILED" ci-bats bats
fi
cucumber:
runs-on: ubuntu-latest
container:
image: ${{ inputs.cucumber-node-image }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Run cucumber tests
id: cucumber-tests
shell: bash
run: |
apt-get update -qq && apt-get install -y -qq --no-install-recommends lsof jq
npm install @cucumber/cucumber > /dev/null 2>&1
mkdir -p "reports/${GITHUB_SHA:0:8}/cucumber"
set +e
npx cucumber-js \
--format json:"reports/${GITHUB_SHA:0:8}/cucumber/report.json" \
--format html:"reports/${GITHUB_SHA:0:8}/cucumber/index.html" 2>&1
CUCUMBER_EXIT=$?
STATE="success"
[ "${CUCUMBER_EXIT}" != "0" ] && STATE="failure"
if [ -f "reports/${GITHUB_SHA:0:8}/cucumber/index.html" ]; then
bash .ci/scripts/report-status.sh "${STATE}" "Cucumber tests" ci-cucumber cucumber
else
bash .ci/scripts/report-status.sh "${STATE}" "Cucumber tests" ci-cucumber
fi
exit ${CUCUMBER_EXIT}
- name: Publish cucumber reports
if: always()
run: bash .ci/scripts/publish-git-pages.sh cucumber
build:
runs-on: ubuntu-latest
needs: [bats, cucumber]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: niko/gitea-ci-library
path: .ci
- name: Generate report index
run: bash .ci/.gitea/scripts/generate-report-index.sh
- name: Set build commit status
run: bash .ci/scripts/report-status.sh success "Build complete" ci-build
+29 -7
View File
@@ -29,11 +29,11 @@ Polku löytyy repostasi:
git remote get-url origin git remote get-url origin
# → ssh://git@gitea.app.keskikuja.site:30009/niko/gitea-ci-library.git # → ssh://git@gitea.app.keskikuja.site:30009/niko/gitea-ci-library.git
# owner = niko, repo = gitea-ci-library # owner = niko, repo = gitea-ci-library
``` ```
Consumerin `ci.yml`: Consumerin `ci.yml`:
```yaml ```yaml
jobs: jobs:
call-engine: call-engine:
uses: niko/gitea-ci-library/.gitea/workflows/build-feature.yml@v1 uses: niko/gitea-ci-library/.gitea/workflows/build-feature.yml@v1
@@ -102,34 +102,56 @@ Act runner suorittaa Gitea Actions workflowt. **IaC-lähde:** alla oleva Helm-sn
klusterin totuus — muutokset vain snippetiin, sitten `helm upgrade --install` (ei käsin muokattuja klusterin totuus — muutokset vain snippetiin, sitten `helm upgrade --install` (ei käsin muokattuja
arvoja klusterissa). arvoja klusterissa).
> HUOM! Gitea ei ole vielä kunnolla stabiilissa tilassa, ja chart default dind sekä runner versiot ovat tätä tehdessä olleet bugiset. Niistä on olemassa uudemmat versiot, mutta eivät ole chartissa. Tätyy seurata ja päivittää tarpeen tulle.
Asennus Kubernetes-klusteriin Helm chartilla: Asennus Kubernetes-klusteriin Helm chartilla:
### 1. Rekisteröintitoken ### 1. Rekisteröi token
Hae token Giteasta: Hae token Giteasta:
- **Organization-taso:** Org → Settings → Actions → Runners → Create new runner - **Organization-taso:** Org → Settings → Actions → Runners → Create new runner
- **Globaali (site admin):** Site Admin → Actions → Runners → Create new runner - **Globaali (site admin):** Site Admin → Actions → Runners → Create new runner
### 2. Asenna runner ### 2. variables
```bash ```bash
GITEA_URL="https://<gitea-server-url>" GITEA_URL="https://<gitea-server-url>"
GITEA_ACTIONS_TOKEN="<registration-token>" GITEA_ACTIONS_TOKEN="<registration-token>"
GITEA_ACTIONS_NAMESPACE="gitea-actions" GITEA_ACTIONS_NAMESPACE="gitea-actions"
```
helm repo add gitea https://dl.gitea.com/charts ### 3. Tee secret vain init install yhteydessä
helm repo update
```bash
kubectl create secret generic act-runner-token \ kubectl create secret generic act-runner-token \
--from-literal=token="$GITEA_ACTIONS_TOKEN" \ --from-literal=token="$GITEA_ACTIONS_TOKEN" \
--namespace "$GITEA_ACTIONS_NAMESPACE" \ --namespace "$GITEA_ACTIONS_NAMESPACE" \
--dry-run=client -o yaml | kubectl apply -f - --dry-run=client -o yaml | kubectl apply -f -
```
### 4. Helm install / upgrade
Menee samalla komennolla.
> Muista asettaa variables ennen ajoa.
Päivittää olemassa olevan installaation, käyttää olemassa olevaa secret
ja sitä kautta Gitea ei tarvitse päivityksessä mitään temppuja.
Päivityksen jälkeen muista tappaa pod (käynnistyy automaattisesti uudelleen), että lataa varmasti kaikki uudesta. Sillä ConfigMap tms eivät lataudu
mikäli pod jatkaa ajamista.
```bash
helm repo add gitea https://dl.gitea.com/charts
helm repo update
helm upgrade --install act-runner gitea/actions \ helm upgrade --install act-runner gitea/actions \
--set enabled=true \ --set enabled=true \
--set giteaRootURL="$GITEA_URL" \ --set giteaRootURL="$GITEA_URL" \
--set existingSecret=act-runner-token \ --set existingSecret=act-runner-token \
--set existingSecretKey=token \ --set existingSecretKey=token \
--set statefulset.runner.tag=1.0.8 \
--set statefulset.dind.tag=29.5.2-dind \ --set statefulset.dind.tag=29.5.2-dind \
--set-string 'statefulset.runner.config=log: --set-string 'statefulset.runner.config=log:
level: info level: info
+85
View File
@@ -0,0 +1,85 @@
# 7. Statusraportoinnin pattern
## Päätös
Gitea Actionsin natiivi job-status on ensisijainen. Commit-status API:a
(`report-status.sh`) käytetään **vain** kun työvaihe tuottaa ulkoisen linkin
(testiraportti, Docker registry), jota natiivistaatus ei tue.
### Tool-jobit (validate, check-version, tag-commit)
Ei API-kutsuja. Luotetaan Gitean omaan job-statukseen.
```yaml
- uses: actions/checkout@v4
- name: Do work
run: do-something
```
### Test-jobit (bats, cucumber)
API:a käytetään raporttilinkin upottamiseksi commit-näkymään.
```
testit → publish (always) → status (always, exit-koodin mukaan)
```
```yaml
- name: Run tests
shell: bash
run: |
run-tests
EXIT=$?
echo "EXIT=${EXIT}" >> "${GITHUB_ENV}"
exit ${EXIT}
- name: Publish reports
if: always()
run: bash .ci/scripts/publish-git-pages.sh bats
- name: Report status
if: always()
shell: bash
run: |
if [ "${EXIT}" = "0" ]; then
bash .ci/scripts/report-status.sh success "Link to Bats reports" unit-tests bats
else
bash .ci/scripts/report-status.sh failure "Link to Bats reports" unit-tests bats
fi
```
### Build & push -jobit (docker-build-push)
API:a käytetään Docker registry -linkin upottamiseksi.
```
build → push → SUCCESS (registry-linkillä) / FAILURE
```
## Periaatteet
1. Gitea Actionsin natiivi job-status on ensisijainen — myös PENDING/Running-tila
tulee natiivisti. API:a käytetään vain custom-linkin tarpeeseen (ADR 0004).
2. `run`-komennon on nostettava virhe ylös — oli kyse tool-callista tai
testivirheestä (ADR 0008).
3. Test-jobit käyttävät `if: always()` publish- ja status-stepeissä — raportti
julkaistaan ja status asetetaan aina, riippumatta testin lopputuloksesta.
4. Testiraportit julkaistaan myös virhetilanteessa, mikäli ne ovat syntyneet.
5. Commit-statuksen duplikaatio natiivijob-statuksen kanssa hyväksytään
testijobeille — se on ainoa mekanismi upottaa raporttilinkki commit-näkymään.
6. Tool-jobit eivät käytä API:a lainkaan — ne luottavat Gitean natiiviin
job-statukseen.
## Tausta
Aiemmin commit-status API:a käytettiin jokaisessa työvaiheessa, myös niissä
joilla ei ollut raporttia linkitettäväksi (validate, check-version, tag-commit).
Tämä tuotti duplikaatiota: Gitea näytti sekä natiivin `CI Main / Validate CI config
Successful` että API-statuksen `ci-validate CI config valid`. Kehittäjälle
molemmat kertoivat saman asian.
Käytännön pakko kuitenkin pakottaa API:n käyttöön testijobeissa: ilman
raporttilinkkiä kukaan ei löydä testituloksia. Gitean natiivi job-status
linkittää aina jobin lokiin — ei ulkoiseen raporttiin. Tämä on paras
saatavilla oleva kompromissi.
+73
View File
@@ -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}`.
+30 -13
View File
@@ -16,24 +16,41 @@ curl_with_host() {
declare -A BRANCH_CACHE declare -A BRANCH_CACHE
branch_exists() { branch_exists() {
local owner="$1" repo="$2" branch="$3" key="${owner}/${repo}/${branch}" local owner="$1" repo="$2" branch="$3" key="${owner}/${repo}/${branch}"
local status local status attempt
[ -z "$GITEA_API_URL" ] && return 0 [ -z "$GITEA_API_URL" ] && return 0
[ -z "$GITEA_TOKEN" ] && return 0 [ -z "$GITEA_TOKEN" ] && return 0
if [ "${BRANCH_CACHE[$key]:-}" = "1" ]; then if [ "${BRANCH_CACHE[$key]:-}" = "1" ]; then
return 0 return 0
fi fi
status=$(curl -sS -o /dev/null -w "%{http_code}" \ # Retry up to 2 times on API errors (hardcoded)
-H "Authorization: token ${GITEA_TOKEN}" \ for attempt in 1 2 3; do
"${GITEA_API_URL}/api/v1/repos/${owner}/${repo}/branches/${branch}" 2>/dev/null || echo "000") status=$(curl -sS -o /dev/null -w "%{http_code}" \
-H "Authorization: token ${GITEA_TOKEN}" \
if [ "$status" = "200" ]; then "${GITEA_API_URL}/api/v1/repos/${owner}/${repo}/branches/${branch}" 2>/dev/null || echo "000")
BRANCH_CACHE[$key]=1
return 0 if [ "$status" = "200" ]; then
fi BRANCH_CACHE[$key]=1
return 1 return 0
fi
if [ "$status" = "404" ]; then
return 1
fi
# API error - retry if not last attempt
if [ "$attempt" -lt 3 ]; then
sleep 10
continue
fi
done
# All retries failed - keep report (fail-safe)
echo " WARN: Gitea API error for ${owner}/${repo}/${branch} (status ${status}) after 3 attempts - KEEPING report"
BRANCH_CACHE[$key]=1
return 0
} }
default_max_age=$(jq -r '.branches.default.maxAgeDays // 90' "$CONFIG") default_max_age=$(jq -r '.branches.default.maxAgeDays // 90' "$CONFIG")
+112
View File
@@ -0,0 +1,112 @@
# Docker Registry Setup
Pipeline rakentaa Docker-kontin ja pushee sen haluttuun registryyn.
---
## 1. Konfiguroi `gitea-env.conf`
```
# DOCKER_REGISTRY on muotoa: registry.example.com/org
#
# host+org: registry.example.com/org
#
# Pipeline rakentaa kuvan: ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${VERSION}
DOCKER_REGISTRY=gitea.app.keskikuja.site/niko # PAKOLLINEN — tyhjä ei käy
DOCKER_IMAGE_NAME=gitea-ci-library-test-image # PAKOLLINEN — pelkkä kuvan nimi
DOCKER_UI_URL= # valinnainen — tarkista Giteasta kontin oma UI-osoite ja laita se tähän ilman versiota. Workflow liittää perään /VERSION
```
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
| `DOCKER_REGISTRY` | **kyllä** | Registry + mahdollinen organisaatio. **Tyhjä pysäyttää workflow'n.** |
| `DOCKER_IMAGE_NAME` | **kyllä** | Pelkkä kuvan nimi. |
| `DOCKER_UI_URL` | ei | Base-URL kontin UI-sivulle (ilman versiota). Osoite riippuu onko kontti linkitetty repoon vai ei — tarkista Giteasta. Workflow liittää perään `/VERSION`. |
**Koko image-ref = `${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${VERSION}`**
Esim. `gitea.app.keskikuja.site/niko/gitea-ci-library-test-image:0.1.0`
---
## 2. Luo PAT (Personal Access Token) Giteassa
**Gitea → oma profiili (oikea yläkulma) → Settings → Applications → Manage Access Tokens → Generate New Token**
Valitse scope:
| Scope | Pääsy |
|---|---|
| `package` | **Read and Write** |
> Tämä token toimii salasanana `docker login` -komennossa. Muut scopet (kuten `repository`) eivät riitä — konttirekisteri vaatii nimenomaan `package`-scopen.
Tokenin arvo näytetään **vain kerran** luomisen yhteydessä. Kopioi se talteen.
---
## 3. Tallenna PAT repositoryn Secretsiin
Nämä ovat kaksi eri paikkaa:
- **Access Tokenit** (User Settings) = missä luot tokenin
- **Repository Secrets** (Repository Settings) = minne talletat sen workflow'n käyttöön
**Repository → Settings → Actions → Secrets → Add new secret**
| Secret | Arvo |
|---|---|
| `DOCKER_PASSWORD` | Edellisessä vaiheessa luotu PAT |
`DOCKER_USERNAME`-secretiä **ei tarvita**. Workflow käyttää automaattisesti `${{ github.actor }}` (workflowin käynnistäjä).
Jos registry vaatii eri käyttäjätunnuksen kuin `github.actor` (esim. Artifactory, Docker Hub), lisää myös:
| Secret | Arvo |
|---|---|
| `DOCKER_USERNAME` | Registryn käyttäjätunnus |
---
## 4. Tarkistuslista ennen ajoa
- [ ] `DOCKER_REGISTRY` asetettu `gitea-env.conf`issa
- [ ] `DOCKER_IMAGE_NAME` asetettu `gitea-env.conf`issa
- [ ] PAT luotu Giteassa scopella `package` Read and Write
- [ ] `DOCKER_PASSWORD`-secret tallennettu repositoryn Secretsiin (se PAT)
- [ ] (tarvittaessa) `DOCKER_USERNAME`-secret — oletus `github.actor`
---
## 5. Esimerkkejä eri polkurakenteista
### 5a. Pelkkä hosti — Artifactory
```
DOCKER_REGISTRY=ngdo-docker.artifactorypro.shared.pub.tds.tieto.com
DOCKER_IMAGE_NAME=microservice-temperature-store
DOCKER_UI_URL=https://artifactorypro.shared.pub.tds.tieto.com/ui/repos/tree/General/ngdo-docker.artifactorypro.shared.pub.tds.tieto.com/microservice-temperature-store
```
- Kontti: `ngdo-docker.../microservice-temperature-store:0.1.0`
- Secret `DOCKER_USERNAME` = service account -tunnus
- Secret `DOCKER_PASSWORD` = API-token
### 5b. Hosti + org — Gitea user-taso
```
DOCKER_REGISTRY=gitea.app.keskikuja.site/niko
DOCKER_IMAGE_NAME=gitea-ci-library-test-image
DOCKER_UI_URL= # tarkista Giteasta kontin UI-osoite
```
- Kontti: `gitea.app.keskikuja.site/niko/gitea-ci-library-test-image:0.1.0`
- Paketti käyttäjän `niko` alla. Linkitys repoon tehdään Gitean UI:sta: paketin sivulta (Package → Settings) → linkitä repositoryyn.
```
DOCKER_REGISTRY=docker.io/library
DOCKER_IMAGE_NAME=oma-kuva
DOCKER_UI_URL=https://hub.docker.com/r/library/oma-kuva
```
- Secret `DOCKER_USERNAME` = Docker Hub -käyttäjä
- Secret `DOCKER_PASSWORD` = Access Token (ei salasana)
+10 -5
View File
@@ -1,17 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
# https://docs.gitea.com/api/next/#tag/repository/operation/repoCreateStatus
STATE="${1:-}" STATE="${1:-}"
DESCRIPTION="${2:-}" DESCRIPTION="${2:-}"
KEY="${3:-commit-${GITHUB_SHA:0:8}}" KEY="${3:-commit-${GITHUB_SHA:0:8}}"
SUITE="${4:-}" SUITE="${4:-}"
CUSTOM_URL="${5:-}"
[ -z "$STATE" ] && echo "ERROR: state argument is required" >&2 && exit 1 [ -z "$STATE" ] && echo "ERROR: state argument is required" >&2 && exit 1
[ -z "$DESCRIPTION" ] && echo "ERROR: description argument is required" >&2 && exit 1 [ -z "$DESCRIPTION" ] && echo "ERROR: description argument is required" >&2 && exit 1
[ -z "${GITEA_API_URL:-}" ] && echo "ERROR: GITEA_API_URL is not set" >&2 && exit 1 [ -z "${GITEA_API_URL:-}" ] && echo "ERROR: GITEA_API_URL is not set" >&2 && exit 1
[ -z "${GITEA_TOKEN:-}" ] && echo "ERROR: GITEA_TOKEN is not set" >&2 && exit 1 [ -z "${GITEA_TOKEN:-}" ] && echo "ERROR: GITEA_TOKEN is not set" >&2 && exit 1
if [ -n "$SUITE" ]; then if [ -n "$CUSTOM_URL" ]; then
URL="$CUSTOM_URL"
elif [ -n "$SUITE" ]; then
SUITE="${SUITE%/}/" SUITE="${SUITE%/}/"
URL="${GIT_PAGES_URL}/${GITHUB_REPOSITORY}/reports/${GITHUB_SHA:0:8}/${SUITE}" URL="${GIT_PAGES_URL}/${GITHUB_REPOSITORY}/reports/${GITHUB_SHA:0:8}/${SUITE}"
else else
@@ -28,15 +33,15 @@ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-X POST "$GITEA_API_URL/api/v1/repos/$REPO/statuses/$COMMIT" \ -X POST "$GITEA_API_URL/api/v1/repos/$REPO/statuses/$COMMIT" \
-H "Authorization: token $GITEA_TOKEN" \ -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "{\"state\":\"$STATE\",\"target_url\":\"$URL\",\"description\":\"$DESCRIPTION\",\"context\":\"$KEY\"}") -d "{\"state\":\"$STATE\",\"target_url\":\"$URL\",\"description\":\"$DESCRIPTION\",\"context\":\"$KEY\"}" || true)
if [ "$HTTP_CODE" = "201" ]; then if [ "$HTTP_CODE" = "201" ]; then
exit 0 exit 0
fi fi
if [ -z "$HTTP_CODE" ]; then if [ -z "$HTTP_CODE" ] || [ "$HTTP_CODE" = "000" ]; then
echo "ERROR: Failed to connect to Gitea API at $GITEA_API_URL" >&2 echo "gitea-ci-library - ERROR: Failed to connect to Gitea API at $GITEA_API_URL" >&2
else else
echo "ERROR: API returned HTTP $HTTP_CODE" >&2 echo "gitea-ci-library - ERROR: gitea-ci-library, API returned HTTP $HTTP_CODE" >&2
fi fi
exit 1 exit 1
@@ -6,10 +6,15 @@ const PROJECT_ROOT = path.resolve(__dirname, '..', '..', '..');
const MOCK_SCRIPT = path.join(PROJECT_ROOT, 'tests', 'helpers', 'mock-api.sh'); const MOCK_SCRIPT = path.join(PROJECT_ROOT, 'tests', 'helpers', 'mock-api.sh');
Before({ tags: '@mock' }, function () { Before({ tags: '@mock' }, function () {
execSync(`bash -c 'source "${MOCK_SCRIPT}" && mock_start'`, { const out = execSync(`bash -c 'source "${MOCK_SCRIPT}" && mock_start && sleep 0.3 && curl -s -o /dev/null -w "%{http_code}" --max-time 3 http://localhost:18080/api/v1/repos/health/check'`, {
cwd: PROJECT_ROOT, cwd: PROJECT_ROOT,
stdio: 'ignore', encoding: 'utf-8',
stdio: ['pipe', 'pipe', 'pipe'],
}); });
const trimmed = out.trim();
if (!trimmed.startsWith('2') && !trimmed.startsWith('4')) {
throw new Error(`Mock server failed to start (HTTP ${trimmed})`);
}
}); });
After({ tags: '@mock' }, function () { After({ tags: '@mock' }, function () {