From 5d2a3532c1466078152d8141ff74015003101c2f Mon Sep 17 00:00:00 2001 From: Andrew DiLosa Date: Wed, 9 Feb 2022 19:04:18 -0800 Subject: [PATCH] add support for python-version-file --- .github/workflows/test-python.yml | 34 +++++++++++++++++++++++++++++++ README.md | 12 +++++++++++ action.yml | 2 ++ dist/setup/index.js | 19 ++++++++++++++++- src/setup-python.ts | 24 +++++++++++++++++++++- 5 files changed, 89 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml index 191db1411..7c3a0969b 100644 --- a/.github/workflows/test-python.yml +++ b/.github/workflows/test-python.yml @@ -10,6 +10,7 @@ on: - '**.md' schedule: - cron: 30 3 * * * + workflow_dispatch: jobs: default-version: @@ -62,6 +63,39 @@ jobs: - name: Run simple code run: python -c 'import math; print(math.factorial(5))' + setup-versions-from-file: + name: Setup ${{ matrix.python }} ${{ matrix.os }} version file + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-18.04, ubuntu-20.04] + python: [3.5.4, 3.6.7, 3.7.5, 3.8.1] + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: build-version-file ${{ matrix.python }} + run: echo ${{ matrix.python }} > .python-version + + - name: setup-python ${{ matrix.python }} + uses: ./ + with: + python-version-file: '.python-version' + + - name: Validate version + run: | + $pythonVersion = (python --version) + if ("Python ${{ matrix.python }}" -ne "$pythonVersion"){ + Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python }}" + exit 1 + } + $pythonVersion + shell: pwsh + + - name: Run simple code + run: python -c 'import math; print(math.factorial(5))' + setup-pre-release-version-from-manifest: name: Setup 3.9.0-beta.4 ${{ matrix.os }} runs-on: ${{ matrix.os }} diff --git a/README.md b/README.md index 1099b3a31..9a9840952 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ This action sets up a Python environment for use in actions by: - Support for pre-release versions of Python. - Support for installing any version of PyPy on-flight - Support for built-in caching of pip and pipenv dependencies +- Support for `.python-version` file # Usage @@ -36,6 +37,17 @@ steps: - run: python my_script.py ``` +Read Python version from file: +```yaml +steps: +- uses: actions/checkout@v2 +- uses: actions/setup-python@v2 + with: + python-version-file: '.python-version' # Read python version from a file + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified +- run: python my_script.py +``` + Matrix Testing: ```yaml jobs: diff --git a/action.yml b/action.yml index a1dd5b77f..0315ab699 100644 --- a/action.yml +++ b/action.yml @@ -6,6 +6,8 @@ inputs: python-version: description: "Version range or exact version of a Python version to use, using SemVer's version range syntax." default: '3.x' + python-version-file: + description: "File containing the Python version to use. Examples: .python-version" cache: description: 'Used to specify a package manager for caching in the default directory. Supported values: pip, pipenv.' required: false diff --git a/dist/setup/index.js b/dist/setup/index.js index a742d5880..4ee453b05 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -6622,12 +6622,16 @@ var __importStar = (this && this.__importStar) || function (mod) { result["default"] = mod; return result; }; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); const core = __importStar(__webpack_require__(470)); const finder = __importStar(__webpack_require__(927)); const finderPyPy = __importStar(__webpack_require__(50)); const path = __importStar(__webpack_require__(622)); const os = __importStar(__webpack_require__(87)); +const fs_1 = __importDefault(__webpack_require__(747)); const cache_factory_1 = __webpack_require__(633); const utils_1 = __webpack_require__(163); function isPyPyVersion(versionSpec) { @@ -6643,10 +6647,23 @@ function cacheDependencies(cache, pythonVersion) { yield cacheDistributor.restoreCache(); }); } +function resolveVersionInput() { + let version = core.getInput('python-version'); + const versionFileInput = core.getInput('python-version-file'); + if (versionFileInput) { + const versionFilePath = path.join(process.env.GITHUB_WORKSPACE, versionFileInput); + if (!fs_1.default.existsSync(versionFilePath)) { + throw new Error(`The specified node version file at: ${versionFilePath} does not exist`); + } + version = fs_1.default.readFileSync(versionFilePath, 'utf8'); + core.info(`Resolved ${versionFileInput} as ${version}`); + } + return version; +} function run() { return __awaiter(this, void 0, void 0, function* () { try { - const version = core.getInput('python-version'); + const version = resolveVersionInput(); if (version) { let pythonVersion; const arch = core.getInput('architecture') || os.arch(); diff --git a/src/setup-python.ts b/src/setup-python.ts index 3a19efe13..1e29ab8be 100644 --- a/src/setup-python.ts +++ b/src/setup-python.ts @@ -3,6 +3,7 @@ import * as finder from './find-python'; import * as finderPyPy from './find-pypy'; import * as path from 'path'; import * as os from 'os'; +import fs from 'fs'; import {getCacheDistributor} from './cache-distributions/cache-factory'; import {isGhes} from './utils'; @@ -24,9 +25,30 @@ async function cacheDependencies(cache: string, pythonVersion: string) { await cacheDistributor.restoreCache(); } +function resolveVersionInput(): string { + let version = core.getInput('python-version'); + const versionFileInput = core.getInput('python-version-file'); + + if (versionFileInput) { + const versionFilePath = path.join( + process.env.GITHUB_WORKSPACE!, + versionFileInput + ); + if (!fs.existsSync(versionFilePath)) { + throw new Error( + `The specified node version file at: ${versionFilePath} does not exist` + ); + } + version = fs.readFileSync(versionFilePath, 'utf8'); + core.info(`Resolved ${versionFileInput} as ${version}`); + } + + return version; +} + async function run() { try { - const version = core.getInput('python-version'); + const version = resolveVersionInput(); if (version) { let pythonVersion: string; const arch: string = core.getInput('architecture') || os.arch();