If the user provides default as the value of the arch input, use the runner machine's architecture (#263)

* If the user provides `default` as the value of the `arch` input, use the runner machine's architecture

* `npm run build`

* Convert the key `processedArchInput` to lower case before indexing into the `archSynonyms` dict

* `npm run build`

---------

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
This commit is contained in:
Dilum Aluthge
2024-07-21 06:58:40 -04:00
committed by GitHub
parent a9e17d5c78
commit 5956f5ed17
3 changed files with 53 additions and 22 deletions

View File

@@ -12,7 +12,7 @@ inputs:
arch: arch:
description: 'Architecture of the Julia binaries. Defaults to the architecture of the runner executing the job.' description: 'Architecture of the Julia binaries. Defaults to the architecture of the runner executing the job.'
required: false required: false
default: '${{ runner.arch }}' default: 'default'
show-versioninfo: show-versioninfo:
description: 'Display InteractiveUtils.versioninfo() after installing' description: 'Display InteractiveUtils.versioninfo() after installing'
required: false required: false

36
lib/setup-julia.js generated
View File

@@ -36,15 +36,17 @@ const core = __importStar(require("@actions/core"));
const tc = __importStar(require("@actions/tool-cache")); const tc = __importStar(require("@actions/tool-cache"));
const fs = __importStar(require("fs")); const fs = __importStar(require("fs"));
const https = __importStar(require("https")); const https = __importStar(require("https"));
const os = __importStar(require("os"));
const path = __importStar(require("path")); const path = __importStar(require("path"));
const installer = __importStar(require("./installer")); const installer = __importStar(require("./installer"));
// Note: before we index into this dict, we always first do `.toLowerCase()` on
// the key.
//
// Therefore, this dict does not need to account for differences in case.
const archSynonyms = { const archSynonyms = {
'x86': 'x86', 'x86': 'x86',
'X86': 'x86',
'x64': 'x64', 'x64': 'x64',
'X64': 'x64',
'aarch64': 'aarch64', 'aarch64': 'aarch64',
'ARM64': 'aarch64',
'arm64': 'aarch64' 'arm64': 'aarch64'
}; };
function run() { function run() {
@@ -65,22 +67,36 @@ function run() {
core.debug(`ERROR: Could not retrieve runner IP: ${err}`); core.debug(`ERROR: Could not retrieve runner IP: ${err}`);
}); });
} }
// Inputs // Inputs.
const versionInput = core.getInput('version'); // Note that we intentionally strip leading and lagging whitespace by using `.trim()`
const includePrereleases = core.getInput('include-all-prereleases') == 'true'; const versionInput = core.getInput('version').trim();
const originalArchInput = core.getInput('arch'); const includePrereleases = core.getInput('include-all-prereleases').trim() == 'true';
const originalArchInput = core.getInput('arch').trim();
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}` // It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
// while the strategy matrix only contains a key `${{ matrix.version }}`. // while the strategy matrix only contains a key `${{ matrix.version }}`.
// In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing. // In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing.
// We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which // We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which
// is worse than failing the build. // is worse than failing the build.
if (!versionInput) { if (!versionInput) { // if `versionInput` is an empty string
throw new Error('Version input must not be null'); throw new Error('Version input must not be null');
} }
if (!originalArchInput) { if (!originalArchInput) { // if `originalArchInput` is an empty string
throw new Error(`Arch input must not be null`); throw new Error(`Arch input must not be null`);
} }
const arch = archSynonyms[originalArchInput]; let processedArchInput;
if (originalArchInput == "default") {
// If the user sets the `arch` input to `default`, then we use the
// architecture of the machine that we are running on.
processedArchInput = os.arch();
core.debug(`The "arch" input is "default", so we will use the machine arch: ${processedArchInput}`);
}
else {
processedArchInput = originalArchInput;
}
// Note: we convert the key `processedArchInput` to lower case
// before we index into the `archSynonyms` dict.
const arch = archSynonyms[processedArchInput.toLowerCase()];
core.debug(`Mapped the "arch" from ${processedArchInput} to ${arch}`);
const versionInfo = yield installer.getJuliaVersionInfo(); const versionInfo = yield installer.getJuliaVersionInfo();
const availableReleases = yield installer.getJuliaVersions(versionInfo); const availableReleases = yield installer.getJuliaVersions(versionInfo);
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases); const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases);

View File

@@ -3,17 +3,19 @@ import * as tc from '@actions/tool-cache'
import * as fs from 'fs' import * as fs from 'fs'
import * as https from 'https' import * as https from 'https'
import * as os from 'os'
import * as path from 'path' import * as path from 'path'
import * as installer from './installer' import * as installer from './installer'
// Note: before we index into this dict, we always first do `.toLowerCase()` on
// the key.
//
// Therefore, this dict does not need to account for differences in case.
const archSynonyms = { const archSynonyms = {
'x86': 'x86', 'x86': 'x86',
'X86': 'x86',
'x64': 'x64', 'x64': 'x64',
'X64': 'x64',
'aarch64': 'aarch64', 'aarch64': 'aarch64',
'ARM64': 'aarch64',
'arm64': 'aarch64' 'arm64': 'aarch64'
} }
@@ -37,24 +39,37 @@ async function run() {
}) })
} }
// Inputs // Inputs.
const versionInput = core.getInput('version') // Note that we intentionally strip leading and lagging whitespace by using `.trim()`
const includePrereleases = core.getInput('include-all-prereleases') == 'true' const versionInput = core.getInput('version').trim()
const originalArchInput = core.getInput('arch') const includePrereleases = core.getInput('include-all-prereleases').trim() == 'true'
const originalArchInput = core.getInput('arch').trim()
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}` // It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
// while the strategy matrix only contains a key `${{ matrix.version }}`. // while the strategy matrix only contains a key `${{ matrix.version }}`.
// In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing. // In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing.
// We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which // We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which
// is worse than failing the build. // is worse than failing the build.
if (!versionInput) { if (!versionInput) { // if `versionInput` is an empty string
throw new Error('Version input must not be null') throw new Error('Version input must not be null')
} }
if (!originalArchInput) { if (!originalArchInput) { // if `originalArchInput` is an empty string
throw new Error(`Arch input must not be null`) throw new Error(`Arch input must not be null`)
} }
const arch = archSynonyms[originalArchInput] let processedArchInput: string;
if (originalArchInput == "default") {
// If the user sets the `arch` input to `default`, then we use the
// architecture of the machine that we are running on.
processedArchInput = os.arch();
core.debug(`The "arch" input is "default", so we will use the machine arch: ${processedArchInput}`)
} else {
processedArchInput = originalArchInput;
}
// Note: we convert the key `processedArchInput` to lower case
// before we index into the `archSynonyms` dict.
const arch = archSynonyms[processedArchInput.toLowerCase()]
core.debug(`Mapped the "arch" from ${processedArchInput} to ${arch}`)
const versionInfo = await installer.getJuliaVersionInfo() const versionInfo = await installer.getJuliaVersionInfo()
const availableReleases = await installer.getJuliaVersions(versionInfo) const availableReleases = await installer.getJuliaVersions(versionInfo)