Skip to main content Skills Marketplace Descubre y explora habilidades de IA creadas por la comunidad.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Copiar promptMostrar detalles del prompt Un comando directo omite el prompt de revisión. Revisa el origen antes de ejecutarlo.
npx skills add https://github.com/rudironsoni/dotnet-agent-harness --skill dotnet-gha-build-testEl comando permanece en una sola línea. Desplázate horizontalmente para revisarlo antes de copiarlo.
¿Prefieres una copia local? Descarga los archivos que SkillsMP tiene disponibles ahora.
Descargar Zip Descargando... Explorador de archivos
2 archivos Ocupaciones relacionadas SOC
Basado en la clasificación ocupacional SOC
name dotnet-gha-build-test description Configures GitHub Actions .NET build/test -- setup-dotnet, NuGet cache, reporting. license MIT targets ["*"] category operations subcategory ci-cd tags ["devops","dotnet","skill","github-actions","ci-cd"] version 1.0.0 author dotnet-agent-harness invocable true related_skills ["dotnet-gha-patterns","dotnet-gha-deploy","dotnet-gha-publish"] claudecode {"allowed-tools":["Read","Grep","Glob","Bash","Write","Edit"]} codexcli {"short-description":".NET skill guidance for github actions"} opencode {"allowed-tools":["Read","Grep","Glob","Bash","Write","Edit"]} copilot {} geminicli {} antigravity {}
dotnet-gha-build-test
.NET build and test workflow patterns for GitHub Actions: actions/setup-dotnet@v4 configuration with multi-version
installs and NuGet authentication, NuGet restore caching for fast CI, dotnet test with result publishing via
dorny/test-reporter, code coverage upload to Codecov and Coveralls, multi-TFM matrix testing across net8.0 and net9.0,
and test sharding strategies for large projects.
Version assumptions: actions/setup-dotnet@v4 for .NET 8/9/10 support. dorny/test-reporter@v1 for test result
visualization. Codecov and Coveralls GitHub Apps for coverage reporting.
Scope
setup-dotnet action configuration with multi-version installs
NuGet restore caching for fast CI
dotnet test with result publishing and coverage upload
Multi-TFM matrix testing and test sharding
NuGet authentication for private feeds in GitHub Actions
Out of scope
Starter CI templates -- see [skill:dotnet-add-ci]
Test architecture and strategy -- see [skill:dotnet-testing-strategy]
Benchmark regression detection in CI -- see [skill:dotnet-ci-benchmarking]
Publishing and deployment -- see [skill:dotnet-gha-publish] and [skill:dotnet-gha-deploy]
Azure DevOps build/test pipelines -- see [skill:dotnet-ado-build-test]
Reusable workflow and composite action patterns -- see [skill:dotnet-gha-patterns]
Cross-references: [skill:dotnet-add-ci] for starter build/test templates, [skill:dotnet-testing-strategy] for test
architecture guidance, [skill:dotnet-ci-benchmarking] for benchmark CI integration, [skill:dotnet-artifacts-output] for
artifact upload path adjustments when using centralized build output layout.
actions/setup-dotnet@v4 Configuration
Basic Setup
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
```text
[ , ]
[ , ]
[ ]
Install multiple SDK versions for multi-TFM builds within a single job:
```yaml
-
name:
Setup
.NET
SDKs
uses:
actions/setup-dotnet@v4
with:
dotnet-version:
|
8.0.x
9.0.x
```text
The
first
listed
version
becomes
the
default
`dotnet`
on
PATH.
All
installed
versions
are
available
via
`--framework`
targeting.
Configure
NuGet
source
authentication
via
`actions/setup-dotnet@v4`:
```yaml
-
name:
Setup
.NET
with
NuGet
auth
uses:
actions/setup-dotnet@v4
with:
dotnet-version:
'8.0.x'
source-url:
https://nuget.pkg.github.com/${{
github.repository_owner
}}/index.json
env:
NUGET_AUTH_TOKEN:
${{
secrets.GITHUB_TOKEN
}}
```json
For
multiple
private
feeds,
configure additional sources after setup:
```yaml
-
name:
Setup
.NET
uses:
actions/setup-dotnet@v4
with:
dotnet-version:
'8.0.x'
-
name:
Add
private
NuGet
feed
run:
|
set -euo pipefail
dotnet nuget add source https://pkgs.dev.azure.com/myorg/_packaging/myfeed/nuget/v3/index.json \
--name AzureArtifacts \
--username az \
--password ${{ secrets.AZURE_ARTIFACTS_PAT }} \
--store-password-in-clear-text
```text
The
`--store-password-in-clear-text`
flag
is
required
on
Linux
runners
where
DPAPI
encryption
is
unavailable.
When
`global.json`
exists
in
the
repository
root,
`actions/setup-dotnet@v4`
can read it automatically:
```yaml
-
name:
Setup
.NET
from
global.json
uses:
actions/setup-dotnet@v4
with:
global-json-file:
global.json
```json
This
ensures
CI
uses
the
same
SDK
version
as
local
development.
---
```yaml
-
name:
Cache
NuGet
packages
uses:
actions/cache@v4
with:
path:
~/.nuget/packages
key:
nuget-${{
runner.os
}}-${{
hashFiles('**/*.csproj',
'**/Directory.Packages.props'
)
}}
restore-keys:
|
nuget-${{ runner.os }}-
-
name:
Restore
dependencies
run:
dotnet
restore
MySolution.sln
```text
`actions/setup-dotnet@v4`
has
built-in
caching
support
using
`packages.lock.json`:
```yaml
-
name:
Setup
.NET
with
caching
uses:
actions/setup-dotnet@v4
with:
dotnet-version:
'8.0.x'
cache:
true
cache-dependency-path:
'**/packages.lock.json'
```json
Generate lock files locally first:
`dotnet
restore
--use-lock-file`.
Commit
`packages.lock.json`
files
for
deterministic
restore.
|
Key
Component
|
Purpose
|
|
------------------------------------------
|
-------------------------------------------------
|
|
`runner.os`
|
Prevent
cross-OS
cache
collisions
|
|
`hashFiles('**/*.csproj')`
|
Invalidate
when
package
references
change
|
|
`hashFiles('**/Directory.Packages.props')`
|
Invalidate
when
centrally
managed
versions
change
|
|
`restore-keys`
prefix
|
Partial
match
for
incremental
cache
reuse
|
---
Publish
`dotnet
test`
results as GitHub Actions check annotations with inline failure details:
```yaml
-
name:
Test
run:
|
set -euo pipefail
dotnet test MySolution.sln \
--configuration Release \
--logger "trx;LogFileName=test-results.trx" \
--results-directory ./test-results
continue-on-error:
true
id:
test
-
name:
Publish
test
results
uses:
dorny/test-reporter@v1
if:
always()
with:
name:
'.NET Test Results'
path:
'test-results/**/*.trx'
reporter:
dotnet-trx
fail-on-error:
true
```text
**Key
decisions:**
-
`continue-on-error:
true
`
on
the
test
step
ensures
the
reporter
step
always
runs,
even
on
failures
-
`if:
always()`
on
the
reporter
step
publishes
results
regardless
of
test
outcome
-
`fail-on-error:
true
`
on
the
reporter
marks
the
check
as
failed
when
tests
fail
For richer PR comment integration with test counts:
```yaml
-
name:
Publish
test
results
uses:
EnricoMi/publish-unit-test-result-action@v2
if:
always()
with:
files:
'test-results/**/*.trx'
check_name:
'Test Results'
```text
---
```yaml
-
name:
Test
with
coverage
run:
|
set -euo pipefail
dotnet test MySolution.sln \
--configuration Release \
--collect:"XPlat Code Coverage" \
--results-directory ./coverage
-
name:
Upload
coverage
to
Codecov
uses:
codecov/codecov-action@v4
with:
directory:
./coverage
fail_ci_if_error:
false
token:
${{
secrets.CODECOV_TOKEN
}}
```text
```yaml
-
name:
Test
with
coverage
run:
|
set -euo pipefail
dotnet test MySolution.sln \
--configuration Release \
--collect:"XPlat Code Coverage" \
--results-directory ./coverage
-
name:
Upload
coverage
to
Coveralls
uses:
coverallsapp/github-action@v2
with:
file:
coverage/**/coverage.cobertura.xml
format:
cobertura
github-token:
${{
secrets.GITHUB_TOKEN
}}
```xml
Generate human-readable HTML coverage reports alongside CI upload:
```yaml
-
name:
Generate
coverage
report
run:
|
set -euo pipefail
dotnet tool install -g dotnet-reportgenerator-globaltool
reportgenerator \
-reports:coverage/**/coverage.cobertura.xml \
-targetdir:coverage-report \
-reporttypes:HtmlInline_AzurePipelines\;Cobertura
-
name:
Upload
coverage
report
uses:
actions/upload-artifact@v4
with:
name:
coverage-report
path:
coverage-report/
retention-days:
30
```text
---
```yaml
jobs:
test:
strategy:
fail-fast:
false
matrix:
tfm:
net8.0
net9.0
os:
ubuntu-latest
windows-latest
runs-on:
${{
matrix.os
}}
steps:
-
uses:
actions/checkout@v4
-
name:
Setup
.NET
uses:
actions/setup-dotnet@v4
with:
dotnet-version:
|
8.0.x
9.0.x
-
name:
Cache
NuGet
uses:
actions/cache@v4
with:
path:
~/.nuget/packages
key:
nuget-${{
runner.os
}}-${{
hashFiles('**/*.csproj',
'**/Directory.Packages.props'
)
}}
restore-keys:
|
nuget-${{ runner.os }}-
-
name:
Test
${{
matrix.tfm
}}
run:
|
set -euo pipefail
dotnet test MySolution.sln \
--framework ${{ matrix.tfm }} \
--configuration Release \
--logger "trx;LogFileName=${{ matrix.tfm }}-results.trx" \
--results-directory ./test-results
-
name:
Publish
test
results
uses:
dorny/test-reporter@v1
if:
always()
with:
name:
'Tests (${{ matrix.os }} / ${{ matrix.tfm }})'
path:
'test-results/**/*.trx'
reporter:
dotnet-trx
```text
When
running
multi-TFM
tests
in
a
single
job
instead
of
a
matrix,
install all required SDKs upfront:
```yaml
-
name:
Setup
.NET
SDKs
uses:
actions/setup-dotnet@v4
with:
dotnet-version:
|
8.0.x
9.0.x
-
name:
Test
all
TFMs
run:
dotnet
test
MySolution.sln
--configuration
Release
```text
Without
the
matching
SDK
installed,
`dotnet
test`
cannot
build
for
that
TFM
and
fails
with
`NETSDK1045`.
---
See
references/detailed-examples.md
(references/detailed-examples.md)
for
complete
code
samples
and
advanced
patterns.