mirror of
				https://github.com/actions/setup-dotnet.git
				synced 2025-10-31 22:53:47 +00:00 
			
		
		
		
	Support multiple versions in single invocation (#240)
This commit is contained in:
		
							parent
							
								
									e3ce4164b3
								
							
						
					
					
						commit
						550702114f
					
				
							
								
								
									
										23
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @ -32,6 +32,29 @@ jobs: | |||||||
|     - name: Verify no unstaged changes |     - name: Verify no unstaged changes | ||||||
|       if: runner.os != 'windows' |       if: runner.os != 'windows' | ||||||
|       run: __tests__/verify-no-unstaged-changes.sh |       run: __tests__/verify-no-unstaged-changes.sh | ||||||
|  |    | ||||||
|  |   test-setup-multiple-versions: | ||||||
|  |     runs-on: ${{ matrix.operating-system }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout | ||||||
|  |         uses: actions/checkout@v2 | ||||||
|  |       - name: Clear toolcache | ||||||
|  |         shell: pwsh | ||||||
|  |         run: __tests__/clear-toolcache.ps1 ${{ runner.os }} | ||||||
|  |       - name: Setup dotnet 2.2.402 and 3.1.404 | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           dotnet-version: | | ||||||
|  |              2.2.402 | ||||||
|  |              3.1.404 | ||||||
|  |              3.0.x | ||||||
|  |       - name: Verify dotnet | ||||||
|  |         shell: pwsh | ||||||
|  |         run: __tests__/verify-dotnet.ps1 2.2.402 3.1.404 '3.0' | ||||||
| 
 | 
 | ||||||
|   test-setup-full-version: |   test-setup-full-version: | ||||||
|     runs-on: ${{ matrix.operating-system }} |     runs-on: ${{ matrix.operating-system }} | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								.licenses/npm/@actions/core.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.licenses/npm/@actions/core.dep.yml
									
									
									
										generated
									
									
									
								
							| @ -1,6 +1,6 @@ | |||||||
| --- | --- | ||||||
| name: "@actions/core" | name: "@actions/core" | ||||||
| version: 1.2.6 | version: 1.6.0 | ||||||
| type: npm | type: npm | ||||||
| summary: Actions core lib | summary: Actions core lib | ||||||
| homepage: https://github.com/actions/toolkit/tree/main/packages/core | homepage: https://github.com/actions/toolkit/tree/main/packages/core | ||||||
|  | |||||||
							
								
								
									
										32
									
								
								.licenses/npm/@actions/http-client-1.0.11.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.licenses/npm/@actions/http-client-1.0.11.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | --- | ||||||
|  | name: "@actions/http-client" | ||||||
|  | version: 1.0.11 | ||||||
|  | type: npm | ||||||
|  | summary: Actions Http Client | ||||||
|  | homepage: https://github.com/actions/http-client#readme | ||||||
|  | license: mit | ||||||
|  | licenses: | ||||||
|  | - sources: LICENSE | ||||||
|  |   text: | | ||||||
|  |     Actions Http Client for Node.js | ||||||
|  | 
 | ||||||
|  |     Copyright (c) GitHub, Inc. | ||||||
|  | 
 | ||||||
|  |     All rights reserved. | ||||||
|  | 
 | ||||||
|  |     MIT License | ||||||
|  | 
 | ||||||
|  |     Permission is hereby granted, free of charge, to any person obtaining a copy of this software and | ||||||
|  |     associated documentation files (the "Software"), to deal in the Software without restriction, | ||||||
|  |     including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||||
|  |     and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, | ||||||
|  |     subject to the following conditions: | ||||||
|  | 
 | ||||||
|  |     The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | ||||||
|  | 
 | ||||||
|  |     THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT | ||||||
|  |     LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | ||||||
|  |     NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||||||
|  |     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||||
|  |     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||||
|  | notices: [] | ||||||
							
								
								
									
										15
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								README.md
									
									
									
									
									
								
							| @ -6,7 +6,7 @@ | |||||||
| 
 | 
 | ||||||
| This action sets up a [.NET CLI](https://github.com/dotnet/sdk) environment for use in actions by: | This action sets up a [.NET CLI](https://github.com/dotnet/sdk) environment for use in actions by: | ||||||
| 
 | 
 | ||||||
| - optionally downloading and caching a version of dotnet by SDK version and adding to PATH | - optionally downloading and caching a version(s) of dotnet by SDK version(s) and adding to PATH | ||||||
| - registering problem matchers for error output | - registering problem matchers for error output | ||||||
| - setting up authentication to private package sources like GitHub Packages | - setting up authentication to private package sources like GitHub Packages | ||||||
| 
 | 
 | ||||||
| @ -29,7 +29,20 @@ steps: | |||||||
|     dotnet-version: '3.1.x' # SDK Version to use; x will use the latest version of the 3.1 channel |     dotnet-version: '3.1.x' # SDK Version to use; x will use the latest version of the 3.1 channel | ||||||
| - run: dotnet build <my project> | - run: dotnet build <my project> | ||||||
| ``` | ``` | ||||||
|  | Multiple versions: | ||||||
|  | > Note: In case multiple versions are installed, the latest .NET version will be used by default unless another version is specified in the `global.json` file. | ||||||
| 
 | 
 | ||||||
|  | ```yml | ||||||
|  | steps: | ||||||
|  | - name: Setup dotnet | ||||||
|  | - uses: actions/checkout@v2 | ||||||
|  | -  uses: actions/setup-dotnet@v1 | ||||||
|  |   with: | ||||||
|  |     dotnet-version: |  | ||||||
|  |       3.1.x | ||||||
|  |       5.0.x | ||||||
|  | - run: dotnet build <my project> | ||||||
|  | ``` | ||||||
| Preview version: | Preview version: | ||||||
| ```yml | ```yml | ||||||
| steps: | steps: | ||||||
|  | |||||||
| @ -32,6 +32,27 @@ describe('installer tests', () => { | |||||||
|     } |     } | ||||||
|   }, 30000); |   }, 30000); | ||||||
| 
 | 
 | ||||||
|  |   it('Aquires multiple versions of dotnet', async () => { | ||||||
|  |     const versions = ['2.2.207', '3.1.120']; | ||||||
|  | 
 | ||||||
|  |     for (const version of versions) { | ||||||
|  |       await getDotnet(version); | ||||||
|  |     } | ||||||
|  |     expect(fs.existsSync(path.join(toolDir, 'sdk', '2.2.207'))).toBe(true); | ||||||
|  |     expect(fs.existsSync(path.join(toolDir, 'sdk', '3.1.120'))).toBe(true); | ||||||
|  | 
 | ||||||
|  |     if (IS_WINDOWS) { | ||||||
|  |       expect(fs.existsSync(path.join(toolDir, 'dotnet.exe'))).toBe(true); | ||||||
|  |     } else { | ||||||
|  |       expect(fs.existsSync(path.join(toolDir, 'dotnet'))).toBe(true); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     expect(process.env.DOTNET_ROOT).toBeDefined; | ||||||
|  |     expect(process.env.PATH).toBeDefined; | ||||||
|  |     expect(process.env.DOTNET_ROOT).toBe(toolDir); | ||||||
|  |     expect(process.env.PATH?.startsWith(toolDir)).toBe(true); | ||||||
|  |   }, 600000); | ||||||
|  | 
 | ||||||
|   it('Acquires version of dotnet if no matching version is installed', async () => { |   it('Acquires version of dotnet if no matching version is installed', async () => { | ||||||
|     await getDotnet('3.1.201'); |     await getDotnet('3.1.201'); | ||||||
|     expect(fs.existsSync(path.join(toolDir, 'sdk', '3.1.201'))).toBe(true); |     expect(fs.existsSync(path.join(toolDir, 'sdk', '3.1.201'))).toBe(true); | ||||||
| @ -126,4 +147,5 @@ function normalizeFileContents(contents: string): string { | |||||||
| async function getDotnet(version: string): Promise<void> { | async function getDotnet(version: string): Promise<void> { | ||||||
|   const dotnetInstaller = new installer.DotnetCoreInstaller(version); |   const dotnetInstaller = new installer.DotnetCoreInstaller(version); | ||||||
|   await dotnetInstaller.installDotnet(); |   await dotnetInstaller.installDotnet(); | ||||||
|  |   installer.DotnetCoreInstaller.addToPath(); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| <Project Sdk="Microsoft.NET.Sdk"> | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
| 
 | 
 | ||||||
|   <PropertyGroup> |   <PropertyGroup> | ||||||
|     <TargetFrameworks>netcoreapp3.1;netcoreapp2.2</TargetFrameworks> |     <TargetFrameworks>netcoreapp3.1;netcoreapp3.0;netcoreapp2.2</TargetFrameworks> | ||||||
|     <RootNamespace>sample_csproj</RootNamespace> |     <RootNamespace>sample_csproj</RootNamespace> | ||||||
| 
 | 
 | ||||||
|     <IsPackable>false</IsPackable> |     <IsPackable>false</IsPackable> | ||||||
|  | |||||||
| @ -6,12 +6,15 @@ if (!$args[0]) | |||||||
| $dotnet = Get-Command dotnet | Select-Object -First 1 | ForEach-Object { $_.Path } | $dotnet = Get-Command dotnet | Select-Object -First 1 | ForEach-Object { $_.Path } | ||||||
| Write-Host "Found '$dotnet'" | Write-Host "Found '$dotnet'" | ||||||
| 
 | 
 | ||||||
| $version = & $dotnet --version | Out-String | ForEach-Object { $_.Trim() } | if($args.count -eq 1) | ||||||
| Write-Host "Version $version" |  | ||||||
| if (-not ($version.StartsWith($args[0].ToString()))) |  | ||||||
| { | { | ||||||
|   Write-Host "PATH='$env:PATH'" |   $version = & $dotnet --version | Out-String | ForEach-Object { $_.Trim() } | ||||||
|   throw "Unexpected version" |   Write-Host "Version $version" | ||||||
|  |   if (-not ($version.StartsWith($args[0].ToString()))) | ||||||
|  |   { | ||||||
|  |     Write-Host "PATH='$env:PATH'" | ||||||
|  |     throw "Unexpected version" | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if ($args[1]) | if ($args[1]) | ||||||
| @ -19,16 +22,17 @@ if ($args[1]) | |||||||
|   # SDKs are listed on multiple lines with the path afterwards in square brackets |   # SDKs are listed on multiple lines with the path afterwards in square brackets | ||||||
|   $versions = & $dotnet --list-sdks | ForEach-Object { $_.SubString(0, $_.IndexOf('[')).Trim() } |   $versions = & $dotnet --list-sdks | ForEach-Object { $_.SubString(0, $_.IndexOf('[')).Trim() } | ||||||
|   Write-Host "Installed versions: $versions" |   Write-Host "Installed versions: $versions" | ||||||
|   $isInstalledVersion = $false |   $InstalledVersionCount = 0 | ||||||
|   foreach ($version in $versions) |   foreach($arg in $args){ | ||||||
|   { |     foreach ($version in $versions) | ||||||
|     if ($version.StartsWith($args[1].ToString()))  |  | ||||||
|     { |     { | ||||||
|       $isInstalledVersion = $true |       if ($version.StartsWith($arg.ToString()))  | ||||||
|       break |       { | ||||||
|  |         $InstalledVersionCount++ | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } |    } | ||||||
|   if (-not $isInstalledVersion) |   if ( $InstalledVersionCount -ne $args.Count) | ||||||
|   { |   { | ||||||
|     Write-Host "PATH='$env:PATH'" |     Write-Host "PATH='$env:PATH'" | ||||||
|     throw "Unexpected version" |     throw "Unexpected version" | ||||||
| @ -53,6 +57,13 @@ if ($args[1]) | |||||||
|     throw "Unexpected output" |     throw "Unexpected output" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | if ($args[2]) | ||||||
|  | { | ||||||
|  |   if ($sample_output -notlike "*Test Run Successful.*Test Run Successful.*Test Run Successful.*") | ||||||
|  |   { | ||||||
|  |     throw "Unexpected output" | ||||||
|  |   } | ||||||
|  | } | ||||||
| else | else | ||||||
| { | { | ||||||
|   if ($sample_output -notlike "*Test Run Successful.*") |   if ($sample_output -notlike "*Test Run Successful.*") | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ branding: | |||||||
|   color: green |   color: green | ||||||
| inputs: | inputs: | ||||||
|   dotnet-version: |   dotnet-version: | ||||||
|     description: 'Optional SDK version to use. If not provided, will install global.json version when available. Examples: 2.2.104, 3.1, 3.1.x' |     description: 'Optional SDK version(s) to use. If not provided, will install global.json version when available. Examples: 2.2.104, 3.1, 3.1.x' | ||||||
|   source-url: |   source-url: | ||||||
|     description: 'Optional package source for which to set up authentication. Will consult any existing NuGet.config in the root of the repo and provide a temporary NuGet.config using the NUGET_AUTH_TOKEN environment variable as a ClearTextPassword' |     description: 'Optional package source for which to set up authentication. Will consult any existing NuGet.config in the root of the repo and provide a temporary NuGet.config using the NUGET_AUTH_TOKEN environment variable as a ClearTextPassword' | ||||||
|   owner: |   owner: | ||||||
|  | |||||||
							
								
								
									
										1363
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1363
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										22
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										22
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -5,9 +5,22 @@ | |||||||
|   "requires": true, |   "requires": true, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@actions/core": { |     "@actions/core": { | ||||||
|       "version": "1.2.6", |       "version": "1.6.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", |       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz", | ||||||
|       "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" |       "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==", | ||||||
|  |       "requires": { | ||||||
|  |         "@actions/http-client": "^1.0.11" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "@actions/http-client": { | ||||||
|  |           "version": "1.0.11", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", | ||||||
|  |           "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", | ||||||
|  |           "requires": { | ||||||
|  |             "tunnel": "0.0.6" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|     }, |     }, | ||||||
|     "@actions/exec": { |     "@actions/exec": { | ||||||
|       "version": "1.0.4", |       "version": "1.0.4", | ||||||
| @ -3432,8 +3445,7 @@ | |||||||
|     "tunnel": { |     "tunnel": { | ||||||
|       "version": "0.0.6", |       "version": "0.0.6", | ||||||
|       "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", |       "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", | ||||||
|       "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", |       "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" | ||||||
|       "dev": true |  | ||||||
|     }, |     }, | ||||||
|     "type-check": { |     "type-check": { | ||||||
|       "version": "0.3.2", |       "version": "0.3.2", | ||||||
|  | |||||||
| @ -30,7 +30,7 @@ | |||||||
|   "author": "GitHub", |   "author": "GitHub", | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@actions/core": "^1.2.6", |     "@actions/core": "^1.6.0", | ||||||
|     "@actions/exec": "^1.0.4", |     "@actions/exec": "^1.0.4", | ||||||
|     "@actions/github": "^1.1.0", |     "@actions/github": "^1.1.0", | ||||||
|     "@actions/http-client": "^1.0.8", |     "@actions/http-client": "^1.0.8", | ||||||
|  | |||||||
| @ -165,6 +165,12 @@ export class DotnetCoreInstaller { | |||||||
|       }); |       }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (resultCode != 0) { | ||||||
|  |       throw new Error(`Failed to install dotnet ${resultCode}. ${output}`); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static addToPath() { | ||||||
|     if (process.env['DOTNET_INSTALL_DIR']) { |     if (process.env['DOTNET_INSTALL_DIR']) { | ||||||
|       core.addPath(process.env['DOTNET_INSTALL_DIR']); |       core.addPath(process.env['DOTNET_INSTALL_DIR']); | ||||||
|       core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']); |       core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']); | ||||||
| @ -189,10 +195,6 @@ export class DotnetCoreInstaller { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     console.log(process.env['PATH']); |     console.log(process.env['PATH']); | ||||||
| 
 |  | ||||||
|     if (resultCode != 0) { |  | ||||||
|       throw new Error(`Failed to install dotnet ${resultCode}. ${output}`); |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // versionInfo - versionInfo of the SDK/Runtime
 |   // versionInfo - versionInfo of the SDK/Runtime
 | ||||||
|  | |||||||
| @ -13,26 +13,29 @@ export async function run() { | |||||||
|     // If a valid version still can't be identified, nothing will be installed.
 |     // If a valid version still can't be identified, nothing will be installed.
 | ||||||
|     // Proxy, auth, (etc) are still set up, even if no version is identified
 |     // Proxy, auth, (etc) are still set up, even if no version is identified
 | ||||||
|     //
 |     //
 | ||||||
|     let version = core.getInput('dotnet-version'); |     let versions = core.getMultilineInput('dotnet-version'); | ||||||
|     if (!version) { |     if (!versions.length) { | ||||||
|       // Try to fall back to global.json
 |       // Try to fall back to global.json
 | ||||||
|       core.debug('No version found, trying to find version from global.json'); |       core.debug('No version found, trying to find version from global.json'); | ||||||
|       const globalJsonPath = path.join(process.cwd(), 'global.json'); |       const globalJsonPath = path.join(process.cwd(), 'global.json'); | ||||||
|       if (fs.existsSync(globalJsonPath)) { |       if (fs.existsSync(globalJsonPath)) { | ||||||
|         version = getVersionFromGlobalJson(globalJsonPath); |         versions.push(getVersionFromGlobalJson(globalJsonPath)); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (version) { |     if (versions.length) { | ||||||
|       const includePrerelease: boolean = |       const includePrerelease: boolean = | ||||||
|         (core.getInput('include-prerelease') || 'false').toLowerCase() === |         (core.getInput('include-prerelease') || 'false').toLowerCase() === | ||||||
|         'true'; |         'true'; | ||||||
| 
 |       let dotnetInstaller!: installer.DotnetCoreInstaller; | ||||||
|       const dotnetInstaller = new installer.DotnetCoreInstaller( |       for (const version of versions) { | ||||||
|         version, |         dotnetInstaller = new installer.DotnetCoreInstaller( | ||||||
|         includePrerelease |           version, | ||||||
|       ); |           includePrerelease | ||||||
|       await dotnetInstaller.installDotnet(); |         ); | ||||||
|  |         await dotnetInstaller.installDotnet(); | ||||||
|  |       } | ||||||
|  |       installer.DotnetCoreInstaller.addToPath(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const sourceUrl: string = core.getInput('source-url'); |     const sourceUrl: string = core.getInput('source-url'); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user