diff --git a/README.md b/README.md index cec68e9..8ecede8 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,17 @@ steps: - run: dotnet build ``` +**Specific architecture:** +```yml +steps: +- uses: actions/checkout@v3 +- uses: actions/setup-dotnet@v2 + with: + dotnet-version: '6.0.x' + architecture: 'x86' +- run: dotnet build +``` + **Multiple version installation**: ```yml steps: diff --git a/__tests__/installer.test.ts b/__tests__/installer.test.ts index 79a90c3..bd56998 100644 --- a/__tests__/installer.test.ts +++ b/__tests__/installer.test.ts @@ -107,6 +107,24 @@ describe('DotnetCoreInstaller tests', () => { expect(process.env.PATH?.startsWith(toolDir)).toBe(true); }, 600000); //This needs some time to download on "slower" internet connections + it('Acquires architecture-specific version of dotnet if no matching version is installed', async () => { + await getDotnet('3.1', '', 'x64'); + var directory = fs + .readdirSync(path.join(toolDir, 'sdk')) + .filter(fn => fn.startsWith('3.1.')); + expect(directory.length > 0).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); //This needs some time to download on "slower" internet connections + it('Returns string with installed SDK version', async () => { const version = '3.1.120'; let installedVersion: string; @@ -279,10 +297,12 @@ function normalizeFileContents(contents: string): string { async function getDotnet( version: string, quality: string = '' + architecture: string = '' ): Promise { const dotnetInstaller = new installer.DotnetCoreInstaller( version, - quality as QualityOptions + quality as QualityOptions, + architecture ); const installedVersion = await dotnetInstaller.installDotnet(); installer.DotnetCoreInstaller.addToPath(); diff --git a/action.yml b/action.yml index dafec86..a5f51f5 100644 --- a/action.yml +++ b/action.yml @@ -17,6 +17,9 @@ inputs: description: 'Optional OWNER for using packages from GitHub Package Registry organizations/users other than the current repository''s owner. Only used if a GPR URL is also provided in source-url' config-file: description: 'Optional NuGet.config location, if your NuGet.config isn''t located in the root of the repo.' + architecture: + description: 'Optional architecture to use. If not provided, will default to the OS architecture.' + required: False outputs: dotnet-version: description: 'Contains the installed by action .NET SDK version for reuse.' diff --git a/src/installer.ts b/src/installer.ts index be0444f..0a3a5f1 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -20,9 +20,11 @@ export interface DotnetVersion { export class DotnetVersionResolver { private inputVersion: string; private resolvedArgument: DotnetVersion; + private architecture: string; - constructor(version: string) { + constructor(version: string, architecture: string = '') { this.inputVersion = version.trim(); + this.architecture = architecture; this.resolvedArgument = {type: '', value: '', qualityFlag: false}; } @@ -230,6 +232,10 @@ export class DotnetCoreInstaller { if (this.quality) { this.setQuality(dotnetVersion, scriptArguments); } + + if (this.architecture != '') { + scriptArguments.push('--architecture', this.architecture); + } } // process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used const getExecOutputOptions = { diff --git a/src/setup-dotnet.ts b/src/setup-dotnet.ts index ba2e419..0bc43d9 100644 --- a/src/setup-dotnet.ts +++ b/src/setup-dotnet.ts @@ -28,6 +28,11 @@ export async function run() { // const versions = core.getMultilineInput('dotnet-version'); const installedDotnetVersions: string[] = []; + let architecture = core.getInput('architecture'); + + if (!architecture) { + architecture = ''; + } const globalJsonFileInput = core.getInput('global-json-file'); if (globalJsonFileInput) { @@ -61,7 +66,7 @@ export async function run() { let dotnetInstaller: DotnetCoreInstaller; const uniqueVersions = new Set(versions); for (const version of uniqueVersions) { - dotnetInstaller = new DotnetCoreInstaller(version, quality); + dotnetInstaller = new DotnetCoreInstaller(version, quality, architecture); const installedVersion = await dotnetInstaller.installDotnet(); installedDotnetVersions.push(installedVersion); }