setup-dotnet/README.md

255 lines
9.8 KiB
Markdown
Raw Permalink Normal View History

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
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
- 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
- setting up authentication to private package sources like GitHub Packages
2019-07-17 21:45:43 +07:00
> **Note**: GitHub hosted runners have some versions of the .NET SDK
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)
for .NET SDK versions that are currently available.
## Usage
2019-07-17 21:45:43 +07:00
See [action.yml](action.yml)
**Basic**:
2019-07-17 21:45:43 +07:00
```yaml
2019-07-26 08:27:45 +07:00
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
2019-07-17 21:45:43 +07:00
with:
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
**Multiple version installation**:
```yml
steps:
- uses: actions/checkout@v3
- name: Setup dotnet
uses: actions/setup-dotnet@v3
with:
dotnet-version: |
3.1.x
5.0.x
- run: dotnet build <my project>
```
## 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).
## 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.
2021-05-05 20:45:32 +07:00
```yml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
2021-05-05 20:45:32 +07:00
with:
dotnet-version: '6.0.x'
dotnet-quality: 'preview'
2021-05-05 20:45:32 +07:00
- run: dotnet build <my project>
```
## 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.
```yml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
with:
global-json-file: csharp/global.json
- run: dotnet build <my project>
working-directory: csharp
```
2021-05-05 20:45:32 +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:
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:
- uses: actions/checkout@v3
2019-07-17 21:45:43 +07:00
- name: Setup dotnet
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 }}
- 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
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
- name: Execute dotnet
run: dotnet build <my project>
2019-07-17 21:45:43 +07:00
```
## Setting up authentication for nuget feeds
2019-06-20 03:22:22 +07:00
### Github Package Registry (GPR)
```yml
2019-09-10 00:27:23 +07:00
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
2019-09-10 00:27:23 +07:00
with:
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
```
2019-09-10 00:27:23 +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
```
2021-05-06 02:55:59 +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
```
> **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
# 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
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
```
**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
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
```
**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
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
```
## Environment variables
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
| **Env.variable** | **Description** | **Default value** |
| ----------- | ----------- | ----------- |
| DOTNET_INSTALL_DIR |Specifies a directory where .NET SDKs should be installed by the action.|*default value for each OS* |
| 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*|
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` |
**Example usage**:
```yml
2020-06-01 22:53:23 +07:00
build:
runs-on: ubuntu-latest
env:
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
- uses: actions/setup-dotnet@v3
2020-06-01 22:53:23 +07:00
with:
dotnet-version: '3.1.x'
```
## License
2019-06-20 03:22:22 +07:00
The scripts and documentation in this project are released under the [MIT License](LICENSE)
## Contributions
2019-06-20 03:22:22 +07:00
Contributions are welcome! See [Contributor's Guide](docs/contributors.md)