Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_011AgnQS6MHAGGoLNQDvv52d
dotnet-build-test
Reusable Gitea Actions workflow: dotnet restore → build → test, with no Docker. Meant as a PR gate, for example so Renovate can automerge.
Usage
on:
pull_request:
jobs:
build-test:
uses: templates/dotnet-build-test/.gitea/workflows/dotnet-build-test.yaml@v1
with:
solution: MyApp.slnx
# dotnet-version: 10.0.x
# configuration: Release
# warnaserror: true
# working-directory: .
# test-filter: "Category!=Integration"
Inputs
| Name | Default | Description |
|---|---|---|
solution |
"" |
Solution/project file, relative to working-directory. If empty, dotnet uses the single sln/proj in that directory. |
dotnet-version |
10.0.x |
.NET SDK version |
configuration |
Release |
Build configuration |
warnaserror |
"true" |
Pass -warnaserror to dotnet build unless the value contains false |
working-directory |
. |
Where dotnet commands run |
test-filter |
"" |
Optional dotnet test --filter expression |
No secrets.
Variant with PostgreSQL
dotnet-build-test-postgres.yaml runs the same steps as above, plus a PostgreSQL service container for integration tests. It has its own file because Gitea can't make services: conditional.
jobs:
build-test:
uses: templates/dotnet-build-test/.gitea/workflows/dotnet-build-test-postgres.yaml@v1
with:
solution: MyApp.slnx
postgres-user: myapp
postgres-password: myapp
# postgres-image: postgres:17-alpine
# postgres-db: "" # empty = same as postgres-user
It takes all inputs of dotnet-build-test.yaml, plus these:
| Name | Default | Description |
|---|---|---|
postgres-image |
postgres:17-alpine |
Service image |
postgres-user |
postgres |
Superuser, so it can create and drop databases |
postgres-password |
postgres |
Throwaway CI password, not a secret |
postgres-db |
"" |
Database created at start. Empty means the same as postgres-user |
The test step gets POSTGRES_HOST=postgres, POSTGRES_PORT=5432, POSTGRES_USER, POSTGRES_PASSWORD and POSTGRES_DB as environment variables. The job reaches the service by its name on the job network, which requires a container-mode runner. No host port is mapped. A step before the tests waits up to 60 s for the port to open.
No secrets.
Versioning
Only major tags (v1, v2, …). Fixes and new optional inputs move the existing tag. Changing or removing inputs, or changing behavior, needs a new major tag.
Entscheidungen
Decisions by the owner of the templates org:
- 2026-10-15: Only major tags (
v1,v2, …), novX.Y.Ztags (see Versioning). - 2026-10-17: All repos in the
templatesorg are public, so consumers' runners can fetch them without credentials. They never contain secrets or internal addresses: secrets come in assecrets:, hosts as inputs.