mirror of
				https://gitea.com/actions/setup-python.git
				synced 2025-10-31 03:38:56 +08:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			v4.3.1
			...
			update-cod
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 67fd444281 | ||
|   | 5ccb29d877 | ||
|   | c3e033939c | ||
|   | 206e984b94 | 
							
								
								
									
										1
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1,2 @@ | |||||||
| * @actions/actions-service | * @actions/actions-service | ||||||
|  | * @actions/runner-images-team | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								.github/workflows/basic-validation.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.github/workflows/basic-validation.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | name: Basic validation | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - main | ||||||
|  |     paths-ignore: | ||||||
|  |       - '**.md' | ||||||
|  |   pull_request: | ||||||
|  |     paths-ignore: | ||||||
|  |       - '**.md' | ||||||
|  | jobs: | ||||||
|  |   call-basic-validation: | ||||||
|  |     name: Basic validation | ||||||
|  |     uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main | ||||||
							
								
								
									
										41
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,3 @@ | |||||||
| # `dist/index.js` is a special file in Actions. |  | ||||||
| # When you reference an action with `uses:` in a workflow, |  | ||||||
| # `index.js` is the code that will run. |  | ||||||
| # For our project, we generate this file through a build process from other source files. |  | ||||||
| # We need to make sure the checked-in `index.js` actually matches what we expect it to be. |  | ||||||
| name: Check dist/ | name: Check dist/ | ||||||
|  |  | ||||||
| on: | on: | ||||||
| @@ -17,36 +12,6 @@ on: | |||||||
|   workflow_dispatch: |   workflow_dispatch: | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   check-dist: |   call-check-dist: | ||||||
|     runs-on: ubuntu-latest |     name: Check dist/ | ||||||
|  |     uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v3 |  | ||||||
|  |  | ||||||
|       - name: Set Node.js 16.x |  | ||||||
|         uses: actions/setup-node@v3 |  | ||||||
|         with: |  | ||||||
|           node-version: 16.x |  | ||||||
|           cache: npm |  | ||||||
|  |  | ||||||
|       - name: Install dependencies |  | ||||||
|         run: npm ci |  | ||||||
|  |  | ||||||
|       - name: Rebuild the dist/ directory |  | ||||||
|         run: npm run build |  | ||||||
|  |  | ||||||
|       - name: Compare the expected and actual dist/ directories |  | ||||||
|         run: | |  | ||||||
|           if [ "$(git diff --ignore-space-at-eol dist/ | wc -l)" -gt "0" ]; then |  | ||||||
|             echo "Detected uncommitted changes after build.  See status below:" |  | ||||||
|             git diff |  | ||||||
|             exit 1 |  | ||||||
|           fi |  | ||||||
|         id: diff |  | ||||||
|  |  | ||||||
|       # If index.js was different than expected, upload the expected version as an artifact |  | ||||||
|       - uses: actions/upload-artifact@v3 |  | ||||||
|         if: ${{ failure() && steps.diff.conclusion == 'failure' }} |  | ||||||
|         with: |  | ||||||
|           name: dist |  | ||||||
|           path: dist/ |  | ||||||
							
								
								
									
										44
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,47 +1,13 @@ | |||||||
| name: "Code scanning - action" | name: CodeQL analysis | ||||||
|  |  | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: [ 'main' ] |     branches: [ 'main' ] | ||||||
|   pull_request: |   pull_request: | ||||||
|   schedule: |   schedule: | ||||||
|     - cron: '25 3 * * 5' |     - cron: '0 3 * * 0' | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   CodeQL-Build: |   call-codeQL-analysis: | ||||||
|  |     name: CodeQL analysis  | ||||||
|     strategy: |     uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main | ||||||
|       fail-fast: false |  | ||||||
|  |  | ||||||
|     # CodeQL runs on ubuntu-latest and windows-latest |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|  |  | ||||||
|     steps: |  | ||||||
|     - name: Checkout repository |  | ||||||
|       uses: actions/checkout@v3 |  | ||||||
|  |  | ||||||
|     # Initializes the CodeQL tools for scanning. |  | ||||||
|     - name: Initialize CodeQL |  | ||||||
|       uses: github/codeql-action/init@v2 |  | ||||||
|       # Override language selection by uncommenting this and choosing your languages |  | ||||||
|       # with: |  | ||||||
|       #   languages: go, javascript, csharp, python, cpp, java |  | ||||||
|  |  | ||||||
|     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java). |  | ||||||
|     # If this step fails, then you should remove it and run the build manually (see below) |  | ||||||
|     - name: Autobuild |  | ||||||
|       uses: github/codeql-action/autobuild@v2 |  | ||||||
|  |  | ||||||
|     # ℹ️ Command-line programs to run using the OS shell. |  | ||||||
|     # 📚 https://git.io/JvXDl |  | ||||||
|  |  | ||||||
|     # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines |  | ||||||
|     #    and modify them (or add more) to build your code if your project |  | ||||||
|     #    uses a compiled language |  | ||||||
|  |  | ||||||
|     #- run: | |  | ||||||
|     #   make bootstrap |  | ||||||
|     #   make release |  | ||||||
|  |  | ||||||
|     - name: Perform CodeQL Analysis |  | ||||||
|       uses: github/codeql-action/analyze@v2 |  | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| name: Main workflow | name: e2e tests | ||||||
|  | 
 | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
| @@ -8,9 +9,10 @@ on: | |||||||
|   pull_request: |   pull_request: | ||||||
|     paths-ignore: |     paths-ignore: | ||||||
|       - '**.md' |       - '**.md' | ||||||
|  |        | ||||||
| jobs: | jobs: | ||||||
|   run: |   test-setup-python: | ||||||
|     name: Run |     name: Test setup-python | ||||||
|     runs-on: ${{ matrix.operating-system }} |     runs-on: ${{ matrix.operating-system }} | ||||||
|     strategy: |     strategy: | ||||||
|       matrix: |       matrix: | ||||||
| @@ -19,21 +21,6 @@ jobs: | |||||||
|     - name: Checkout |     - name: Checkout | ||||||
|       uses: actions/checkout@v3 |       uses: actions/checkout@v3 | ||||||
| 
 | 
 | ||||||
|     - name: Set Node.js 16.x |  | ||||||
|       uses: actions/setup-node@v3 |  | ||||||
|       with: |  | ||||||
|         node-version: 16.x |  | ||||||
|         cache: npm |  | ||||||
| 
 |  | ||||||
|     - name: npm ci |  | ||||||
|       run: npm ci |  | ||||||
| 
 |  | ||||||
|     - name: Lint |  | ||||||
|       run: npm run format-check |  | ||||||
| 
 |  | ||||||
|     - name: npm test |  | ||||||
|       run: npm test |  | ||||||
| 
 |  | ||||||
|     - name: Run with setup-python 2.7 |     - name: Run with setup-python 2.7 | ||||||
|       uses: ./ |       uses: ./ | ||||||
|       with: |       with: | ||||||
							
								
								
									
										21
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,21 +9,6 @@ on: | |||||||
|       - main |       - main | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   test: |   call-licensed: | ||||||
|     runs-on: ubuntu-latest |     name: Licensed | ||||||
|     name: Check licenses |     uses: actions/reusable-workflows/.github/workflows/licensed.yml@main | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v3 |  | ||||||
|       - name: Set Node.js 16.x |  | ||||||
|         uses: actions/setup-node@v3 |  | ||||||
|         with: |  | ||||||
|           node-version: 16.x |  | ||||||
|           cache: npm |  | ||||||
|       - run: npm ci |  | ||||||
|       - name: Install licensed |  | ||||||
|         run: | |  | ||||||
|           cd $RUNNER_TEMP |  | ||||||
|           curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.4.4/licensed-3.4.4-linux-x64.tar.gz |  | ||||||
|           sudo tar -xzf licensed.tar.gz |  | ||||||
|           sudo mv licensed /usr/local/bin/licensed |  | ||||||
|       - run: licensed status |  | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| name: Release new action version | name: Release new action version | ||||||
|  |  | ||||||
| on: | on: | ||||||
|   release: |   release: | ||||||
|     types: [released] |     types: [released] | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,5 @@ | |||||||
| name: Validate PyPy e2e | name: Validate PyPy e2e | ||||||
|  |  | ||||||
| on:  | on:  | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
| @@ -124,3 +125,45 @@ 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.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 | ||||||
							
								
								
									
										32
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,5 @@ | |||||||
| name: Validate Python e2e | name: Validate Python e2e | ||||||
|  |  | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
| @@ -190,8 +191,35 @@ 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-python-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: | | ||||||
|  |               3.7 | ||||||
|  |               3.8 | ||||||
|  |               3.9 | ||||||
|  |               3.10 | ||||||
|  |           check-latest: true | ||||||
|  |       - name: Validate version | ||||||
|  |         run: | | ||||||
|  |           $pythonVersion = (python --version) | ||||||
|  |           if ("$pythonVersion" -NotMatch "3.10"){ | ||||||
|  |             Write-Host "The current version is $pythonVersion; expected version is 3.10" | ||||||
|             exit 1 |             exit 1 | ||||||
|           } |           } | ||||||
|           $pythonVersion |           $pythonVersion | ||||||
|   | |||||||
| @@ -42,14 +42,13 @@ describe('validateVersion', () => { | |||||||
| describe('isCacheFeatureAvailable', () => { | describe('isCacheFeatureAvailable', () => { | ||||||
|   it('isCacheFeatureAvailable disabled on GHES', () => { |   it('isCacheFeatureAvailable disabled on GHES', () => { | ||||||
|     jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => false); |     jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => false); | ||||||
|  |     const infoMock = jest.spyOn(core, 'warning'); | ||||||
|  |     const message = | ||||||
|  |       'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.'; | ||||||
|     try { |     try { | ||||||
|       process.env['GITHUB_SERVER_URL'] = 'http://example.com'; |       process.env['GITHUB_SERVER_URL'] = 'http://example.com'; | ||||||
|       isCacheFeatureAvailable(); |       expect(isCacheFeatureAvailable()).toBeFalsy(); | ||||||
|     } catch (error) { |       expect(infoMock).toHaveBeenCalledWith(message); | ||||||
|       expect(error).toHaveProperty( |  | ||||||
|         'message', |  | ||||||
|         'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.' |  | ||||||
|       ); |  | ||||||
|     } finally { |     } finally { | ||||||
|       delete process.env['GITHUB_SERVER_URL']; |       delete process.env['GITHUB_SERVER_URL']; | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										61
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										61
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -66867,31 +66867,31 @@ function cacheDependencies(cache, pythonVersion) { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
| function resolveVersionInput() { | function resolveVersionInput() { | ||||||
|     let version = core.getInput('python-version'); |     let versions = core.getMultilineInput('python-version'); | ||||||
|     let versionFile = core.getInput('python-version-file'); |     let versionFile = core.getInput('python-version-file'); | ||||||
|     if (version && versionFile) { |     if (versions.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 (versions.length) { | ||||||
|         return version; |         return versions; | ||||||
|     } |     } | ||||||
|     if (versionFile) { |     if (versionFile) { | ||||||
|         if (!fs_1.default.existsSync(versionFile)) { |         if (!fs_1.default.existsSync(versionFile)) { | ||||||
|             throw new Error(`The specified python version file at: ${versionFile} doesn't exist.`); |             throw new Error(`The specified python version file at: ${versionFile} doesn't exist.`); | ||||||
|         } |         } | ||||||
|         version = fs_1.default.readFileSync(versionFile, 'utf8'); |         const version = fs_1.default.readFileSync(versionFile, 'utf8'); | ||||||
|         core.info(`Resolved ${versionFile} as ${version}`); |         core.info(`Resolved ${versionFile} as ${version}`); | ||||||
|         return version; |         return [version]; | ||||||
|     } |     } | ||||||
|     utils_1.logWarning("Neither 'python-version' nor 'python-version-file' inputs were supplied. Attempting to find '.python-version' file."); |     utils_1.logWarning("Neither 'python-version' nor 'python-version-file' inputs were supplied. Attempting to find '.python-version' file."); | ||||||
|     versionFile = '.python-version'; |     versionFile = '.python-version'; | ||||||
|     if (fs_1.default.existsSync(versionFile)) { |     if (fs_1.default.existsSync(versionFile)) { | ||||||
|         version = fs_1.default.readFileSync(versionFile, 'utf8'); |         const version = fs_1.default.readFileSync(versionFile, 'utf8'); | ||||||
|         core.info(`Resolved ${versionFile} as ${version}`); |         core.info(`Resolved ${versionFile} as ${version}`); | ||||||
|         return version; |         return [version]; | ||||||
|     } |     } | ||||||
|     utils_1.logWarning(`${versionFile} doesn't exist.`); |     utils_1.logWarning(`${versionFile} doesn't exist.`); | ||||||
|     return version; |     return versions; | ||||||
| } | } | ||||||
| function run() { | function run() { | ||||||
|     var _a; |     var _a; | ||||||
| @@ -66904,22 +66904,26 @@ 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(); |             const versions = resolveVersionInput(); | ||||||
|             const checkLatest = core.getBooleanInput('check-latest'); |             const checkLatest = core.getBooleanInput('check-latest'); | ||||||
|             if (version) { |             if (versions.length) { | ||||||
|                 let pythonVersion; |                 let pythonVersion = ''; | ||||||
|                 const arch = core.getInput('architecture') || os.arch(); |                 const arch = core.getInput('architecture') || os.arch(); | ||||||
|                 const updateEnvironment = core.getBooleanInput('update-environment'); |                 const updateEnvironment = core.getBooleanInput('update-environment'); | ||||||
|                 if (isPyPyVersion(version)) { |                 core.startGroup('Installed versions'); | ||||||
|                     const installed = yield finderPyPy.findPyPyVersion(version, arch, updateEnvironment, checkLatest); |                 for (const version of versions) { | ||||||
|                     pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; |                     if (isPyPyVersion(version)) { | ||||||
|                     core.info(`Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`); |                         const installed = yield finderPyPy.findPyPyVersion(version, arch, updateEnvironment, checkLatest); | ||||||
|                 } |                         pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; | ||||||
|                 else { |                         core.info(`Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`); | ||||||
|                     const installed = yield finder.useCpythonVersion(version, arch, updateEnvironment, checkLatest); |                     } | ||||||
|                     pythonVersion = installed.version; |                     else { | ||||||
|                     core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); |                         const installed = yield finder.useCpythonVersion(version, arch, updateEnvironment, checkLatest); | ||||||
|  |                         pythonVersion = installed.version; | ||||||
|  |                         core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|  |                 core.endGroup(); | ||||||
|                 const cache = core.getInput('cache'); |                 const cache = core.getInput('cache'); | ||||||
|                 if (cache && utils_1.isCacheFeatureAvailable()) { |                 if (cache && utils_1.isCacheFeatureAvailable()) { | ||||||
|                     yield cacheDependencies(cache, pythonVersion); |                     yield cacheDependencies(cache, pythonVersion); | ||||||
| @@ -67057,16 +67061,15 @@ function isGhes() { | |||||||
| } | } | ||||||
| exports.isGhes = isGhes; | exports.isGhes = isGhes; | ||||||
| function isCacheFeatureAvailable() { | function isCacheFeatureAvailable() { | ||||||
|     if (!cache.isFeatureAvailable()) { |     if (cache.isFeatureAvailable()) { | ||||||
|         if (isGhes()) { |         return true; | ||||||
|             throw new Error('Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.'); |     } | ||||||
|         } |     if (isGhes()) { | ||||||
|         else { |         core.warning('Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.'); | ||||||
|             core.warning('The runner was not able to contact the cache service. Caching will be skipped'); |  | ||||||
|         } |  | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     return true; |     core.warning('The runner was not able to contact the cache service. Caching will be skipped'); | ||||||
|  |     return false; | ||||||
| } | } | ||||||
| exports.isCacheFeatureAvailable = isCacheFeatureAvailable; | exports.isCacheFeatureAvailable = isCacheFeatureAvailable; | ||||||
| function logWarning(message) { | function logWarning(message) { | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
| - [Using the python-version input](advanced-usage.md#using-the-python-version-input) | - [Using the python-version input](advanced-usage.md#using-the-python-version-input) | ||||||
|     - [Specifying a Python version](advanced-usage.md#specifying-a-python-version) |     - [Specifying a Python version](advanced-usage.md#specifying-a-python-version) | ||||||
|     - [Specifying a PyPy version](advanced-usage.md#specifying-a-pypy-version) |     - [Specifying a PyPy version](advanced-usage.md#specifying-a-pypy-version) | ||||||
|  |     - [Specifying multiple Python and PyPy versions](advanced-usage.md#specifying-multiple-python/pypy-version) | ||||||
|     - [Matrix Testing](advanced-usage.md#matrix-testing) |     - [Matrix Testing](advanced-usage.md#matrix-testing) | ||||||
| - [Using the python-version-file input](advanced-usage.md#using-the-python-version-file-input) | - [Using the python-version-file input](advanced-usage.md#using-the-python-version-file-input) | ||||||
| - [Check latest version](advanced-usage.md#check-latest-version) | - [Check latest version](advanced-usage.md#check-latest-version) | ||||||
| @@ -132,6 +133,62 @@ jobs: | |||||||
| ``` | ``` | ||||||
| More details on PyPy syntax can be found in the [Available versions of PyPy](#pypy) section. | More details on PyPy syntax can be found in the [Available versions of PyPy](#pypy) section. | ||||||
|  |  | ||||||
|  | ### Specifying multiple Python/PyPy version | ||||||
|  | The python-version input can get multiple python/pypy versions. The last specified version will be used as a default one.  | ||||||
|  |  | ||||||
|  | Download and set up multiple Python versions: | ||||||
|  |  | ||||||
|  | ```yaml | ||||||
|  | jobs: | ||||||
|  |   build: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v3 | ||||||
|  |     - uses: actions/setup-python@v4 | ||||||
|  |       with: | ||||||
|  |         python-version: | | ||||||
|  |             3.8 | ||||||
|  |             3.9 | ||||||
|  |             3.10 | ||||||
|  |     - run: python my_script.py | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Download and set up multiple PyPy versions: | ||||||
|  |  | ||||||
|  | ```yaml | ||||||
|  | jobs: | ||||||
|  |   build: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v3 | ||||||
|  |     - uses: actions/setup-python@v4 | ||||||
|  |       with: | ||||||
|  |         python-version: | | ||||||
|  |             pypy-3.7-v7.3.x | ||||||
|  |             pypy3.9-nightly | ||||||
|  |             pypy3.8 | ||||||
|  |     - run: python my_script.py | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Download and set up multiple Python/PyPy versions: | ||||||
|  |  | ||||||
|  | ```yaml | ||||||
|  | jobs: | ||||||
|  |   build: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v3 | ||||||
|  |     - uses: actions/setup-python@v4 | ||||||
|  |       with: | ||||||
|  |         python-version: | | ||||||
|  |             3.8 | ||||||
|  |             3.9 | ||||||
|  |             pypy3.9-nightly | ||||||
|  |             pypy3.8 | ||||||
|  |             3.10 | ||||||
|  |     - run: python my_script.py | ||||||
|  | ``` | ||||||
|  |  | ||||||
| ### Matrix Testing | ### Matrix Testing | ||||||
|  |  | ||||||
| Using `setup-python` it's possible to use [matrix syntax](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix) to install several versions of Python or PyPy: | Using `setup-python` it's possible to use [matrix syntax](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix) to install several versions of Python or PyPy: | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ | |||||||
|     "build": "ncc build -o dist/setup src/setup-python.ts && ncc build -o dist/cache-save src/cache-save.ts", |     "build": "ncc build -o dist/setup src/setup-python.ts && ncc build -o dist/cache-save src/cache-save.ts", | ||||||
|     "format": "prettier --write \"{,!(node_modules)/**/}*.ts\"", |     "format": "prettier --write \"{,!(node_modules)/**/}*.ts\"", | ||||||
|     "format-check": "prettier --check \"{,!(node_modules)/**/}*.ts\"", |     "format-check": "prettier --check \"{,!(node_modules)/**/}*.ts\"", | ||||||
|  |     "lint": "echo \"Fake command that does nothing. It is used in reusable workflows\"", | ||||||
|     "release": "ncc build -o dist/setup src/setup-python.ts && ncc build -o dist/cache-save src/cache-save.ts && git add -f dist/", |     "release": "ncc build -o dist/setup src/setup-python.ts && ncc build -o dist/cache-save src/cache-save.ts && git add -f dist/", | ||||||
|     "test": "jest --coverage" |     "test": "jest --coverage" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -22,18 +22,18 @@ async function cacheDependencies(cache: string, pythonVersion: string) { | |||||||
|   await cacheDistributor.restoreCache(); |   await cacheDistributor.restoreCache(); | ||||||
| } | } | ||||||
|  |  | ||||||
| function resolveVersionInput(): string { | function resolveVersionInput() { | ||||||
|   let version = core.getInput('python-version'); |   let versions = core.getMultilineInput('python-version'); | ||||||
|   let versionFile = core.getInput('python-version-file'); |   let versionFile = core.getInput('python-version-file'); | ||||||
|  |  | ||||||
|   if (version && versionFile) { |   if (versions.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 (versions.length) { | ||||||
|     return version; |     return versions; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (versionFile) { |   if (versionFile) { | ||||||
| @@ -42,9 +42,9 @@ function resolveVersionInput(): string { | |||||||
|         `The specified python version file at: ${versionFile} doesn't exist.` |         `The specified python version file at: ${versionFile} doesn't exist.` | ||||||
|       ); |       ); | ||||||
|     } |     } | ||||||
|     version = fs.readFileSync(versionFile, 'utf8'); |     const version = fs.readFileSync(versionFile, 'utf8'); | ||||||
|     core.info(`Resolved ${versionFile} as ${version}`); |     core.info(`Resolved ${versionFile} as ${version}`); | ||||||
|     return version; |     return [version]; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   logWarning( |   logWarning( | ||||||
| @@ -52,14 +52,14 @@ function resolveVersionInput(): string { | |||||||
|   ); |   ); | ||||||
|   versionFile = '.python-version'; |   versionFile = '.python-version'; | ||||||
|   if (fs.existsSync(versionFile)) { |   if (fs.existsSync(versionFile)) { | ||||||
|     version = fs.readFileSync(versionFile, 'utf8'); |     const version = fs.readFileSync(versionFile, 'utf8'); | ||||||
|     core.info(`Resolved ${versionFile} as ${version}`); |     core.info(`Resolved ${versionFile} as ${version}`); | ||||||
|     return version; |     return [version]; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   logWarning(`${versionFile} doesn't exist.`); |   logWarning(`${versionFile} doesn't exist.`); | ||||||
|  |  | ||||||
|   return version; |   return versions; | ||||||
| } | } | ||||||
|  |  | ||||||
| async function run() { | async function run() { | ||||||
| @@ -75,35 +75,38 @@ 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(); |     const versions = resolveVersionInput(); | ||||||
|     const checkLatest = core.getBooleanInput('check-latest'); |     const checkLatest = core.getBooleanInput('check-latest'); | ||||||
|  |  | ||||||
|     if (version) { |     if (versions.length) { | ||||||
|       let pythonVersion: string; |       let pythonVersion = ''; | ||||||
|       const arch: string = core.getInput('architecture') || os.arch(); |       const arch: string = core.getInput('architecture') || os.arch(); | ||||||
|       const updateEnvironment = core.getBooleanInput('update-environment'); |       const updateEnvironment = core.getBooleanInput('update-environment'); | ||||||
|       if (isPyPyVersion(version)) { |       core.startGroup('Installed versions'); | ||||||
|         const installed = await finderPyPy.findPyPyVersion( |       for (const version of versions) { | ||||||
|           version, |         if (isPyPyVersion(version)) { | ||||||
|           arch, |           const installed = await finderPyPy.findPyPyVersion( | ||||||
|           updateEnvironment, |             version, | ||||||
|           checkLatest |             arch, | ||||||
|         ); |             updateEnvironment, | ||||||
|         pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; |             checkLatest | ||||||
|         core.info( |           ); | ||||||
|           `Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})` |           pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; | ||||||
|         ); |           core.info( | ||||||
|       } else { |             `Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})` | ||||||
|         const installed = await finder.useCpythonVersion( |           ); | ||||||
|           version, |         } else { | ||||||
|           arch, |           const installed = await finder.useCpythonVersion( | ||||||
|           updateEnvironment, |             version, | ||||||
|           checkLatest |             arch, | ||||||
|         ); |             updateEnvironment, | ||||||
|         pythonVersion = installed.version; |             checkLatest | ||||||
|         core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); |           ); | ||||||
|  |           pythonVersion = installed.version; | ||||||
|  |           core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|  |       core.endGroup(); | ||||||
|       const cache = core.getInput('cache'); |       const cache = core.getInput('cache'); | ||||||
|       if (cache && isCacheFeatureAvailable()) { |       if (cache && isCacheFeatureAvailable()) { | ||||||
|         await cacheDependencies(cache, pythonVersion); |         await cacheDependencies(cache, pythonVersion); | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/utils.ts
									
									
									
									
									
								
							| @@ -105,21 +105,21 @@ export function isGhes(): boolean { | |||||||
| } | } | ||||||
|  |  | ||||||
| export function isCacheFeatureAvailable(): boolean { | export function isCacheFeatureAvailable(): boolean { | ||||||
|   if (!cache.isFeatureAvailable()) { |   if (cache.isFeatureAvailable()) { | ||||||
|     if (isGhes()) { |     return true; | ||||||
|       throw new Error( |   } | ||||||
|         'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.' |  | ||||||
|       ); |  | ||||||
|     } else { |  | ||||||
|       core.warning( |  | ||||||
|         'The runner was not able to contact the cache service. Caching will be skipped' |  | ||||||
|       ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |   if (isGhes()) { | ||||||
|  |     core.warning( | ||||||
|  |       'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.' | ||||||
|  |     ); | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   return true; |   core.warning( | ||||||
|  |     'The runner was not able to contact the cache service. Caching will be skipped' | ||||||
|  |   ); | ||||||
|  |   return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| export function logWarning(message: string): void { | export function logWarning(message: string): void { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user