# 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 ```yaml 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. ```yaml 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.