Replaces unsupported failure()/cancelled() with explicit needs.<job>.result checks in publish gates
Continuous Integration / config (pull_request) Successful in 10s
Continuous Integration / changes (pull_request) Successful in 20s
Continuous Integration / backend-build (pull_request) Successful in 5m23s
Continuous Integration / vulnerability-scan (pull_request) Successful in 4m28s
Continuous Integration / frontend-prepare (pull_request) Successful in 1m47s
Continuous Integration / backend-test (pull_request) Successful in 5m56s
Continuous Integration / frontend-build (pull_request) Successful in 2m11s
Continuous Integration / frontend-test (pull_request) Successful in 4m43s
Continuous Integration / frontend-lint (pull_request) Successful in 1m54s
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
Continuous Integration / publish-test (pull_request) Successful in 6m49s
Continuous Integration / deploy-test (pull_request) Skipped

Gitea Actions only implements always() from GitHub Actions' status-check functions; success(), failure(), and cancelled() aren't supported. publish-test/publish-production relied on !failure() && !cancelled() to let a run through when an unaffected gate job was skipped by the path filter while still blocking on an actual failure — rewritten to check needs.<job>.result explicitly instead, which Gitea does support.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VhySVFARKAP89WqQ3Kff8M
This commit is contained in:
2026-07-31 16:53:46 +02:00
co-authored by Claude Sonnet 5
parent 5a44d76ccc
commit 12b1df6ede
+24 -7
View File
@@ -280,12 +280,21 @@ jobs:
publish-test: publish-test:
needs: [changes, backend-build, backend-test, vulnerability-scan, frontend-build, frontend-test, frontend-lint] needs: [changes, backend-build, backend-test, vulnerability-scan, frontend-build, frontend-test, frontend-lint]
# always() bypasses the automatic skip-cascade from a gate job that was itself skipped (because # always() bypasses the automatic skip-cascade from a gate job that was itself skipped (because
# its side of the repo didn't change) — !failure() && !cancelled() still blocks a run where a # its side of the repo didn't change). Gitea Actions only implements always() from the GitHub
# gate that DID run actually failed. The remaining changes.outputs check makes sure there's # Actions status-check functions — success()/failure()/cancelled() are not supported — so each
# something to publish at all: a run that touched neither backend nor frontend has nothing new # gate's outcome is checked explicitly via needs.<job>.result instead: a skipped gate is fine,
# to deploy. # but a gate that actually ran and failed or was cancelled still blocks the publish. The final
# changes.outputs check makes sure there's something to publish at all: a run that touched
# neither backend nor frontend has nothing new to deploy.
if: | if: |
always() && !failure() && !cancelled() && always() &&
needs.changes.result == 'success' &&
needs.backend-build.result != 'failure' && needs.backend-build.result != 'cancelled' &&
needs.backend-test.result != 'failure' && needs.backend-test.result != 'cancelled' &&
needs.vulnerability-scan.result != 'failure' && needs.vulnerability-scan.result != 'cancelled' &&
needs.frontend-build.result != 'failure' && needs.frontend-build.result != 'cancelled' &&
needs.frontend-test.result != 'failure' && needs.frontend-test.result != 'cancelled' &&
needs.frontend-lint.result != 'failure' && needs.frontend-lint.result != 'cancelled' &&
(needs.changes.outputs.backend == 'true' || needs.changes.outputs.frontend == 'true') (needs.changes.outputs.backend == 'true' || needs.changes.outputs.frontend == 'true')
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -349,9 +358,17 @@ jobs:
# Vite build-time value: one dist/ bundle cannot be tagged as both 'test' and 'production' (FR-05). # Vite build-time value: one dist/ bundle cannot be tagged as both 'test' and 'production' (FR-05).
publish-production: publish-production:
needs: [changes, backend-build, backend-test, vulnerability-scan, frontend-build, frontend-test, frontend-lint] needs: [changes, backend-build, backend-test, vulnerability-scan, frontend-build, frontend-test, frontend-lint]
# See publish-test's comment on the always()/!failure()/!cancelled() combination above. # See publish-test's comment above on why this checks needs.<job>.result explicitly instead of
# failure()/cancelled(), which Gitea Actions doesn't support.
if: | if: |
always() && !failure() && !cancelled() && always() &&
needs.changes.result == 'success' &&
needs.backend-build.result != 'failure' && needs.backend-build.result != 'cancelled' &&
needs.backend-test.result != 'failure' && needs.backend-test.result != 'cancelled' &&
needs.vulnerability-scan.result != 'failure' && needs.vulnerability-scan.result != 'cancelled' &&
needs.frontend-build.result != 'failure' && needs.frontend-build.result != 'cancelled' &&
needs.frontend-test.result != 'failure' && needs.frontend-test.result != 'cancelled' &&
needs.frontend-lint.result != 'failure' && needs.frontend-lint.result != 'cancelled' &&
github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_production == 'true' && github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_production == 'true' &&
(needs.changes.outputs.backend == 'true' || needs.changes.outputs.frontend == 'true') (needs.changes.outputs.backend == 'true' || needs.changes.outputs.frontend == 'true')
runs-on: ubuntu-latest runs-on: ubuntu-latest