2019-07-17 21:45:43 +07:00
# setup-dotnet
2019-06-20 03:22:22 +07:00
2023-01-31 15:29:16 +07:00
[![Basic validation ](https://github.com/actions/setup-dotnet/actions/workflows/basic-validation.yml/badge.svg?branch=main )](https://github.com/actions/setup-dotnet/actions/workflows/basic-validation.yml)
[![e2e tests ](https://github.com/actions/setup-dotnet/actions/workflows/e2e-tests.yml/badge.svg?branch=main )](https://github.com/actions/setup-dotnet/actions/workflows/e2e-tests.yml)
2019-08-13 02:11:11 +07:00
2021-10-05 22:05:48 +07:00
This action sets up a [.NET CLI ](https://github.com/dotnet/sdk ) environment for use in actions by:
2019-06-20 03:22:22 +07:00
2021-11-23 17:03:56 +07:00
- optionally downloading and caching a version(s) of dotnet by SDK version(s) and adding to PATH
2019-07-17 21:45:43 +07:00
- registering problem matchers for error output
2019-12-14 03:52:24 +07:00
- setting up authentication to private package sources like GitHub Packages
2019-07-17 21:45:43 +07:00
2022-09-27 19:47:12 +07:00
> **Note**: GitHub hosted runners have some versions of the .NET SDK
2020-06-29 19:03:16 +07:00
preinstalled. Installed versions are subject to change. Please refer to the
2022-12-20 17:45:22 +07:00
documentation:
[Software installed on github hosted runners ](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software )
2020-06-29 19:03:16 +07:00
for .NET SDK versions that are currently available.
2022-09-27 19:47:12 +07:00
## Usage
2019-07-17 21:45:43 +07:00
See [action.yml ](action.yml )
2022-09-27 19:47:12 +07:00
**Basic**:
2019-07-17 21:45:43 +07:00
```yaml
2019-07-26 08:27:45 +07:00
steps:
2022-04-01 20:48:47 +07:00
- uses: actions/checkout@v3
2022-09-27 19:47:12 +07:00
- uses: actions/setup-dotnet@v3
2019-07-17 21:45:43 +07:00
with:
2022-09-27 19:47:12 +07:00
dotnet-version: '3.1.x'
2019-07-17 21:45:43 +07:00
- run: dotnet build < my project >
```
2022-12-20 21:03:30 +07:00
> **Warning**: Unless a concrete version is specified in the [`global.json`](https://learn.microsoft.com/en-us/dotnet/core/tools/global-json) file, **_the latest .NET version installed on the runner (including preinstalled versions) will be used [by default](https://learn.microsoft.com/en-us/dotnet/core/versions/selection#the-sdk-uses-the-latest-installed-version)_**. Please refer to the [documentation](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software) for the currently preinstalled .NET SDK versions.
2019-07-17 21:45:43 +07:00
2022-09-27 19:47:12 +07:00
**Multiple version installation**:
2021-11-23 17:03:56 +07:00
```yml
steps:
2022-04-01 20:48:47 +07:00
- uses: actions/checkout@v3
2021-12-28 19:37:44 +07:00
- name: Setup dotnet
2022-09-27 19:47:12 +07:00
uses: actions/setup-dotnet@v3
2021-11-23 17:03:56 +07:00
with:
dotnet-version: |
3.1.x
5.0.x
- run: dotnet build < my project >
```
2022-09-27 19:47:12 +07:00
## Supported version syntax
The `dotnet-version` input supports following syntax:
- **A.B.C** (e.g 6.0.400, 7.0.100-preview.7.22377.5) - installs exact version of .NET SDK
- **A.B** or **A.B.x** (e.g. 3.1, 3.1.x) - installs the latest patch version of .NET SDK on the channel `3.1` , including prerelease versions (preview, rc)
- **A** or **A.x** (e.g. 3, 3.x) - installs the latest minor version of the specified major tag, including prerelease versions (preview, rc)
2023-05-05 15:43:09 +07:00
- **A.B.Cxx** (e.g. 6.0.4xx) - available since `.NET 5.0` release. Installs the latest version of the specific SDK release, including prerelease versions (preview, rc).
2022-09-27 19:47:12 +07:00
## Using the `dotnet-quality` input
This input sets up the action to install the latest build of the specified quality in the channel. The possible values of `dotnet-quality` are: **daily** , **signed** , **validated** , **preview** , **ga** .
2023-05-05 15:43:09 +07:00
> **Note**: `dotnet-quality` input can be used only with .NET SDK version in 'A.B', 'A.B.x', 'A', 'A.x' and 'A.B.Cxx' formats where the major version is higher than 5. In other cases, `dotnet-quality` input will be ignored.
2022-09-27 19:47:12 +07:00
2021-05-05 20:45:32 +07:00
```yml
steps:
2022-04-01 20:48:47 +07:00
- uses: actions/checkout@v3
2022-09-27 19:47:12 +07:00
- uses: actions/setup-dotnet@v3
2021-05-05 20:45:32 +07:00
with:
dotnet-version: '6.0.x'
2022-09-27 19:47:12 +07:00
dotnet-quality: 'preview'
2021-05-05 20:45:32 +07:00
- run: dotnet build < my project >
```
2022-09-27 19:47:12 +07:00
## Using the `global-json-file` input
`setup-dotnet` action can read .NET SDK version from a `global.json` file. Input `global-json-file` is used for specifying the path to the `global.json` . If the file that was supplied to `global-json-file` input doesn't exist, the action will fail with error.
>**Note**: In case both `dotnet-version` and `global-json-file` inputs are used, versions from both inputs will be installed.
2022-04-18 19:25:56 +07:00
```yml
steps:
- uses: actions/checkout@v3
2022-09-27 19:47:12 +07:00
- uses: actions/setup-dotnet@v3
2022-04-18 19:25:56 +07:00
with:
global-json-file: csharp/global.json
- run: dotnet build < my project >
working-directory: csharp
```
2021-05-05 20:45:32 +07:00
2022-09-27 19:47:12 +07:00
## Matrix Testing
Using `setup-dotnet` it's possible to use [matrix syntax ](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix ) to install several versions of .NET SDK:
```yml
2019-07-17 21:45:43 +07:00
jobs:
build:
2020-09-18 02:49:59 +07:00
runs-on: ubuntu-latest
2019-07-17 21:45:43 +07:00
strategy:
matrix:
2021-03-26 06:07:28 +07:00
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
2019-07-17 21:45:43 +07:00
name: Dotnet ${{ matrix.dotnet }} sample
2019-07-26 08:27:45 +07:00
steps:
2022-04-01 20:48:47 +07:00
- uses: actions/checkout@v3
2019-07-17 21:45:43 +07:00
- name: Setup dotnet
2022-09-27 19:47:12 +07:00
uses: actions/setup-dotnet@v3
2019-07-17 21:45:43 +07:00
with:
2019-08-14 03:05:52 +07:00
dotnet-version: ${{ matrix.dotnet }}
2022-12-20 18:30:05 +07:00
- name: Execute dotnet
run: dotnet build < my project >
```
>**Note**: Unless a concrete version is specified in the [`global.json` ](https://learn.microsoft.com/en-us/dotnet/core/tools/global-json ) file, the latest .NET version installed on the runner (including preinstalled versions) will be used [by default ](https://learn.microsoft.com/en-us/dotnet/core/versions/selection#the-sdk-uses-the-latest-installed-version ). To control this behavior you may want to use temporary `global.json` files:
**Matrix testing with temporary global.json creation**
```yml
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
name: Dotnet ${{ matrix.dotnet }} sample
steps:
- uses: actions/checkout@v3
- name: Setup dotnet
uses: actions/setup-dotnet@v3
2022-12-20 21:31:56 +07:00
id: stepid
2022-12-20 18:30:05 +07:00
with:
dotnet-version: ${{ matrix.dotnet }}
- name: Create temporary global.json
2022-12-20 21:31:56 +07:00
run: echo '{"sdk":{"version": "${{ steps.stepid.outputs.dotnet-version }}"}}' > ./global.json
2022-12-20 18:30:05 +07:00
- name: Execute dotnet
run: dotnet build < my project >
2019-07-17 21:45:43 +07:00
```
2022-09-27 19:47:12 +07:00
## Setting up authentication for nuget feeds
2019-06-20 03:22:22 +07:00
2022-09-27 19:47:12 +07:00
### Github Package Registry (GPR)
```yml
2019-09-10 00:27:23 +07:00
steps:
2022-04-01 20:48:47 +07:00
- uses: actions/checkout@v3
2022-09-27 19:47:12 +07:00
- uses: actions/setup-dotnet@v3
2019-09-10 00:27:23 +07:00
with:
2022-09-27 19:47:12 +07:00
dotnet-version: '3.1.x'
2019-11-26 06:16:52 +07:00
source-url: https://nuget.pkg.github.com/< owner > /index.json
2019-09-10 00:27:23 +07:00
env:
NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
- run: dotnet build < my project >
- name: Create the package
run: dotnet pack --configuration Release < my project >
2021-05-06 02:55:59 +07:00
- name: Publish the package to GPR
2019-09-10 00:27:23 +07:00
run: dotnet nuget push < my project > /bin/Release/*.nupkg
2022-09-27 19:47:12 +07:00
```
2019-09-10 00:27:23 +07:00
2022-09-27 19:47:12 +07:00
### Azure Artifacts
```yml
- uses: actions/setup-dotnet@v3
2019-10-04 08:00:43 +07:00
with:
source-url: https://pkgs.dev.azure.com/< your-organization > /_packaging/< your-feed-name > /nuget/v3/index.json
env:
NUGET_AUTH_TOKEN: ${{secrets.AZURE_DEVOPS_PAT}} # Note, create a secret with this name in Settings
2019-11-26 06:16:52 +07:00
- name: Publish the package to Azure Artifacts
2019-10-04 08:00:43 +07:00
run: dotnet nuget push < my project > /bin/Release/*.nupkg
2022-09-27 19:47:12 +07:00
```
2021-05-06 02:55:59 +07:00
2022-09-27 19:47:12 +07:00
### nuget.org
```yml
- uses: actions/setup-dotnet@v3
2021-05-06 02:55:59 +07:00
with:
dotnet-version: 3.1.x
2021-05-06 15:10:43 +07:00
- name: Publish the package to nuget.org
2021-05-06 02:55:59 +07:00
run: dotnet nuget push */bin/Release/* .nupkg -k $NUGET_AUTH_TOKEN -s https://api.nuget.org/v3/index.json
env:
NUGET_AUTH_TOKEN: ${{ secrets.NUGET_TOKEN }}
2019-10-04 08:00:43 +07:00
```
2022-09-27 19:47:12 +07:00
> **Note**: It's the only way to push a package to nuget.org feed for macOS/Linux machines due to API key config store limitations.
2019-10-04 08:00:43 +07:00
2022-09-29 22:45:25 +07:00
# Outputs and environment variables
## Outputs
### `dotnet-version`
Using the **dotnet-version** output it's possible to get the installed by the action .NET SDK version.
**Single version installation**
In case of a single version installation, the `dotnet-version` output contains the version that is installed by the action.
```yaml
- uses: actions/setup-dotnet@v3
2022-12-20 21:31:56 +07:00
id: stepid
2022-09-29 22:45:25 +07:00
with:
dotnet-version: 3.1.422
2022-12-20 21:31:56 +07:00
- run: echo '${{ steps.stepid.outputs.dotnet-version }}' # outputs 3.1.422
2022-09-29 22:45:25 +07:00
```
**Multiple version installation**
In case of a multiple version installation, the `dotnet-version` output contains the latest version that is installed by the action.
```yaml
- uses: actions/setup-dotnet@v3
2022-12-20 21:31:56 +07:00
id: stepid
2022-09-29 22:45:25 +07:00
with:
dotnet-version: |
3.1.422
5.0.408
2022-12-20 21:31:56 +07:00
- run: echo '${{ steps.stepid.outputs.dotnet-version }}' # outputs 5.0.408
2022-09-29 22:45:25 +07:00
```
**Installation from global.json**
When the `dotnet-version` input is used along with the `global-json-file` input, the `dotnet-version` output contains the version resolved from the `global.json` .
```yaml
- uses: actions/setup-dotnet@v3
2022-12-20 21:31:56 +07:00
id: stepid
2022-09-29 22:45:25 +07:00
with:
dotnet-version: |
3.1.422
5.0.408
global-json-file: "./global.json" # contains version 2.2.207
2022-12-20 21:31:56 +07:00
- run: echo '${{ steps.stepid.outputs.dotnet-version }}' # outputs 2.2.207
2022-09-29 22:45:25 +07:00
```
2022-09-27 19:47:12 +07:00
## Environment variables
2020-05-30 03:39:14 +07:00
2021-07-28 17:48:24 +07:00
Some environment variables may be necessary for your particular case or to improve logging. Some examples are listed below, but the full list with complete details can be found here: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables
2020-05-30 03:39:14 +07:00
2022-09-27 19:47:12 +07:00
| **Env.variable** | **Description** | **Default value** |
| ----------- | ----------- | ----------- |
2022-10-10 19:27:29 +07:00
| DOTNET_INSTALL_DIR |Specifies a directory where .NET SDKs should be installed by the action.|*default value for each OS* |
2022-09-27 19:47:12 +07:00
| DOTNET_NOLOGO |Removes logo and telemetry message from first run of dotnet cli|*false*|
| DOTNET_CLI_TELEMETRY_OPTOUT |Opt-out of telemetry being sent to Microsoft|*false*|
| DOTNET_MULTILEVEL_LOOKUP |Configures whether the global install location is used as a fall-back|*true*|
2020-05-30 03:39:14 +07:00
2022-10-10 19:27:29 +07:00
The default value of the `DOTNET_INSTALL_DIR` environment variable depends on the operation system which is used on a runner:
| **Operation system** | **Default value** |
| ----------- | ----------- |
| **Windows** | `C:\Program Files\dotnet` |
| **Ubuntu** | `/usr/share/dotnet` |
| **macOS** | `/Users/runner/.dotnet` |
2022-09-27 19:47:12 +07:00
**Example usage**:
```yml
2020-06-01 22:53:23 +07:00
build:
runs-on: ubuntu-latest
2020-05-30 03:39:14 +07:00
env:
2022-10-04 15:22:05 +07:00
DOTNET_INSTALL_DIR: "path/to/directory"
2020-06-01 22:53:23 +07:00
steps:
2020-07-16 00:00:26 +07:00
- uses: actions/checkout@main
2022-09-27 19:47:12 +07:00
- uses: actions/setup-dotnet@v3
2020-06-01 22:53:23 +07:00
with:
2022-09-27 19:47:12 +07:00
dotnet-version: '3.1.x'
2020-05-30 03:39:14 +07:00
```
2022-09-27 19:47:12 +07:00
## License
2019-06-20 03:22:22 +07:00
The scripts and documentation in this project are released under the [MIT License ](LICENSE )
2022-09-27 19:47:12 +07:00
## Contributions
2019-06-20 03:22:22 +07:00
2022-09-27 19:47:12 +07:00
Contributions are welcome! See [Contributor's Guide ](docs/contributors.md )