name: Build Python package run-name: Generate Python ${{ inputs.VERSION || '3.12.3' }} on: workflow_dispatch: inputs: VERSION: description: 'Python version to build and upload' default: '3.12.3' required: true PUBLISH_RELEASES: description: 'Whether to publish releases' required: true type: boolean default: false THREADING_BUILD_MODES: description: 'CPython threading build modes' required: true type: string default: 'default,freethreaded' PLATFORMS: description: 'Platforms for execution in "os" or "os_arch" format (arch is "x64" by default)' required: true default: 'ubuntu-22.04,ubuntu-22.04_arm64,ubuntu-24.04,ubuntu-24.04_arm64,macos-13_x64,macos-14_arm64,windows-2022_x64,windows-2022_x86,windows-11_arm64' pull_request: paths-ignore: - 'versions-manifest.json' - 'LICENSE' - '**.md' branches: - 'main' # ... all previous jobs remain unchanged test_python: needs: [generate_matrix, build_python] strategy: fail-fast: false matrix: include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }} runs-on: ${{ matrix.os }} env: ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }} steps: - name: Check out repository code uses: actions/checkout@v4 with: submodules: true - name: Fully cleanup the toolcache directory before testing run: ./helpers/clean-toolcache.ps1 -ToolName "Python" - name: Delete macOS /Library/Frameworks/Python.framework if: matrix.platform == 'darwin' shell: bash run: if [ -d /Library/Frameworks/Python.framework ]; then sudo rm -rf /Library/Frameworks/Python.framework; fi - name: Download artifact uses: actions/download-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} path: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} - name: Debug: Check OS Architecture and Python Binary shell: pwsh run: | Write-Host "OS Architecture:" [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture $pythonPath = "C:\\hostedtoolcache\\windows\\Python\\${{ env.VERSION }}\\${{ matrix.arch }}\\python.exe" Write-Host "Checking python.exe path: $pythonPath" if (Test-Path $pythonPath) { $file = Get-Item $pythonPath Write-Host "python.exe exists. Size: $($file.Length) bytes" } else { Write-Host "python.exe is missing at $pythonPath" } Write-Host "Listing Toolcache directory:" Get-ChildItem "C:\\hostedtoolcache\\windows\\Python\\${{ env.VERSION }}\\${{ matrix.arch }}" -Recurse -Force Write-Host "Listing extracted artifact contents:" Get-ChildItem -Recurse "${{ runner.temp }}\\${{ env.ARTIFACT_NAME }}" - name: Extract files run: | if ('${{ matrix.platform }}' -eq 'win32') { $artifactName = "${{ env.ARTIFACT_NAME }}.zip" 7z.exe x "$artifactName" -y | Out-Null } else { $artifactName = "${{ env.ARTIFACT_NAME }}.tar.gz" tar -xzf $artifactName } working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} - name: Apply build artifact to the local machine run: | $PSNativeCommandUseErrorActionPreference = $true if ('${{ matrix.platform }}' -eq 'win32') { powershell ./setup.ps1 } else { sh ./setup.sh cp ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}/build_output.txt ${{ runner.temp }} } working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} - name: Setup Python ${{ env.VERSION }} uses: actions/setup-python@v5 with: python-version: ${{ env.VERSION }} architecture: ${{ matrix.arch }} - name: Python version run: python -VVV - name: Verbose sysconfig dump if: runner.os == 'Linux' || runner.os == 'macOS' run: python ./sources/python-config-output.py working-directory: ${{ github.workspace }}/tests - name: Verbose python binary links if: runner.os == 'Linux' || runner.os == 'macOS' run: | $pythonLocation = which python if ('${{ matrix.platform }}' -eq 'darwin') { otool -L $pythonLocation } else { ldd $pythonLocation } - name: Run tests run: | Install-Module Pester -Force -Scope CurrentUser -SkipPublisherCheck Import-Module Pester $pesterContainer = New-PesterContainer -Path './python-tests.ps1' -Data @{ Version="${{ env.VERSION }}"; Platform="${{ matrix.platform }}"; Architecture="${{ matrix.arch }}"; } $Result = Invoke-Pester -Container $pesterContainer -PassThru if ($Result.FailedCount -gt 0) { $host.SetShouldExit($Result.FailedCount) exit $Result.FailedCount } working-directory: ${{ github.workspace }}/tests