add support to install multiple python versions

This commit is contained in:
Dmitry Shibanov 2022-12-04 22:51:04 +01:00
parent 13ae5bb136
commit fa589f774a
4 changed files with 131 additions and 49 deletions

View file

@ -124,3 +124,46 @@ jobs:
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version ${EXECUTABLE} --version
shell: bash shell: bash
setup-pypy-multiple-versions:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v3
- name: Setup PyPy and check latest
uses: ./
with:
python-version: |
pypy-3.7-v7.3.x
pypy3.9-nightly
pypy3.8
check-latest: true
- name: PyPy and Python version
run: python --version
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
- name: Assert PyPy is running
run: |
import platform
assert platform.python_implementation().lower() == "pypy"
shell: python
- name: Assert expected binaries (or symlinks) are present
run: |
EXECUTABLE="pypy-3.7-v7.3.x"
EXECUTABLE=${EXECUTABLE/-/} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version
shell: bash
- name: Assert expected binaries (or symlinks) are present
run: |
EXECUTABLE='pypy3.8'
EXECUTABLE=${EXECUTABLE/pypy-/pypy} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version
shell: bash

View file

@ -190,8 +190,30 @@ jobs:
- name: Validate version - name: Validate version
run: | run: |
$pythonVersion = (python --version) $pythonVersion = (python --version)
if ("$pythonVersion" -NotMatch "${{ matrix.python }}"){ if ("$pythonVersion" -NotMatch "${{ matrix.python-version }}"){
Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python }}" Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python-version }}"
exit 1
}
$pythonVersion
shell: pwsh
setup-python-multiple-versions:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v3
- name: Setup Python and check latest
uses: ./
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Validate version
run: |
$pythonVersion = (python --version)
if ("$pythonVersion" -NotMatch "${{ matrix.python-version }}"){
Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python-version }}"
exit 1 exit 1
} }
$pythonVersion $pythonVersion

43
dist/setup/index.js vendored
View file

@ -66797,12 +66797,12 @@ function cacheDependencies(cache, pythonVersion) {
}); });
} }
function resolveVersionInput() { function resolveVersionInput() {
let version = core.getInput('python-version'); let version = core.getMultilineInput('python-version');
let versionFile = core.getInput('python-version-file'); let versionFile = core.getInput('python-version-file');
if (version && versionFile) { if (version.length && versionFile) {
core.warning('Both python-version and python-version-file inputs are specified, only python-version will be used.'); core.warning('Both python-version and python-version-file inputs are specified, only python-version will be used.');
} }
if (version) { if (version.length) {
return version; return version;
} }
if (versionFile) { if (versionFile) {
@ -66834,21 +66834,30 @@ function run() {
} }
core.debug(`Python is expected to be installed into ${process.env['RUNNER_TOOL_CACHE']}`); core.debug(`Python is expected to be installed into ${process.env['RUNNER_TOOL_CACHE']}`);
try { try {
const version = resolveVersionInput(); let versions;
const resolvedVersionInput = resolveVersionInput();
const checkLatest = core.getBooleanInput('check-latest'); const checkLatest = core.getBooleanInput('check-latest');
if (version) { if (Array.isArray(resolvedVersionInput)) {
let pythonVersion; versions = resolvedVersionInput;
const arch = core.getInput('architecture') || os.arch(); }
const updateEnvironment = core.getBooleanInput('update-environment'); else {
if (isPyPyVersion(version)) { versions = [resolvedVersionInput];
const installed = yield finderPyPy.findPyPyVersion(version, arch, updateEnvironment, checkLatest); }
pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; if (versions.length) {
core.info(`Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`); let pythonVersion = '';
} for (const version of versions) {
else { const arch = core.getInput('architecture') || os.arch();
const installed = yield finder.useCpythonVersion(version, arch, updateEnvironment, checkLatest); const updateEnvironment = core.getBooleanInput('update-environment');
pythonVersion = installed.version; if (isPyPyVersion(version)) {
core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); const installed = yield finderPyPy.findPyPyVersion(version, arch, updateEnvironment, checkLatest);
pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`;
core.info(`Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`);
}
else {
const installed = yield finder.useCpythonVersion(version, arch, updateEnvironment, checkLatest);
pythonVersion = installed.version;
core.info(`Successfully set up ${installed.impl} (${pythonVersion})`);
}
} }
const cache = core.getInput('cache'); const cache = core.getInput('cache');
if (cache && utils_1.isCacheFeatureAvailable()) { if (cache && utils_1.isCacheFeatureAvailable()) {

View file

@ -22,17 +22,17 @@ async function cacheDependencies(cache: string, pythonVersion: string) {
await cacheDistributor.restoreCache(); await cacheDistributor.restoreCache();
} }
function resolveVersionInput(): string { function resolveVersionInput(): string | string[] {
let version = core.getInput('python-version'); let version: string | string[] = core.getMultilineInput('python-version');
let versionFile = core.getInput('python-version-file'); let versionFile = core.getInput('python-version-file');
if (version && versionFile) { if (version.length && versionFile) {
core.warning( core.warning(
'Both python-version and python-version-file inputs are specified, only python-version will be used.' 'Both python-version and python-version-file inputs are specified, only python-version will be used.'
); );
} }
if (version) { if (version.length) {
return version; return version;
} }
@ -75,35 +75,43 @@ async function run() {
`Python is expected to be installed into ${process.env['RUNNER_TOOL_CACHE']}` `Python is expected to be installed into ${process.env['RUNNER_TOOL_CACHE']}`
); );
try { try {
const version = resolveVersionInput(); let versions: string[];
const resolvedVersionInput = resolveVersionInput();
const checkLatest = core.getBooleanInput('check-latest'); const checkLatest = core.getBooleanInput('check-latest');
if (version) { if (Array.isArray(resolvedVersionInput)) {
let pythonVersion: string; versions = resolvedVersionInput as string[];
const arch: string = core.getInput('architecture') || os.arch(); } else {
const updateEnvironment = core.getBooleanInput('update-environment'); versions = [resolvedVersionInput as string];
if (isPyPyVersion(version)) { }
const installed = await finderPyPy.findPyPyVersion(
version,
arch,
updateEnvironment,
checkLatest
);
pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`;
core.info(
`Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`
);
} else {
const installed = await finder.useCpythonVersion(
version,
arch,
updateEnvironment,
checkLatest
);
pythonVersion = installed.version;
core.info(`Successfully set up ${installed.impl} (${pythonVersion})`);
}
if (versions.length) {
let pythonVersion = '';
for (const version of versions) {
const arch: string = core.getInput('architecture') || os.arch();
const updateEnvironment = core.getBooleanInput('update-environment');
if (isPyPyVersion(version)) {
const installed = await finderPyPy.findPyPyVersion(
version,
arch,
updateEnvironment,
checkLatest
);
pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`;
core.info(
`Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`
);
} else {
const installed = await finder.useCpythonVersion(
version,
arch,
updateEnvironment,
checkLatest
);
pythonVersion = installed.version;
core.info(`Successfully set up ${installed.impl} (${pythonVersion})`);
}
}
const cache = core.getInput('cache'); const cache = core.getInput('cache');
if (cache && isCacheFeatureAvailable()) { if (cache && isCacheFeatureAvailable()) {
await cacheDependencies(cache, pythonVersion); await cacheDependencies(cache, pythonVersion);