mirror of
https://github.com/actions/setup-python.git
synced 2025-04-24 07:22:14 +00:00
add support to install multiple python versions
This commit is contained in:
parent
13ae5bb136
commit
fa589f774a
4 changed files with 131 additions and 49 deletions
43
.github/workflows/test-pypy.yml
vendored
43
.github/workflows/test-pypy.yml
vendored
|
@ -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
|
26
.github/workflows/test-python.yml
vendored
26
.github/workflows/test-python.yml
vendored
|
@ -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
43
dist/setup/index.js
vendored
|
@ -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()) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue