mirror of
https://github.com/actions/python-versions.git
synced 2025-12-15 23:36:44 +00:00
Compare commits
36 Commits
3.12.0-638
...
windows-ar
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d80ea3a25f | ||
|
|
7a302f1496 | ||
|
|
e18dd16151 | ||
|
|
606312b02e | ||
|
|
cb2aecd6d9 | ||
|
|
1c85886f9c | ||
|
|
f14b797a5d | ||
|
|
cc396a6be6 | ||
|
|
1693c7defb | ||
|
|
8108f421b7 | ||
|
|
8bbb5413e0 | ||
|
|
c990e6da95 | ||
|
|
521be20d1e | ||
|
|
064829bd03 | ||
|
|
b77a7dee85 | ||
|
|
37e7166250 | ||
|
|
eb9433f569 | ||
|
|
7c3d29faf2 | ||
|
|
c03f98f186 | ||
|
|
2573fc9af9 | ||
|
|
b643f0d07f | ||
|
|
29394d0042 | ||
|
|
3545308dfe | ||
|
|
fa96e2aca9 | ||
|
|
1dbece3419 | ||
|
|
627cd1691f | ||
|
|
c685daccab | ||
|
|
eaf1258a7f | ||
|
|
9903e2d963 | ||
|
|
310d6e4aea | ||
|
|
af22c2b8e4 | ||
|
|
e605eda13a | ||
|
|
96dae786ca | ||
|
|
e642abaef8 | ||
|
|
381057ce36 | ||
|
|
5da3a44cc2 |
110
.github/workflows/build-python-packages.yml
vendored
110
.github/workflows/build-python-packages.yml
vendored
@@ -1,11 +1,11 @@
|
|||||||
name: Build Python package
|
name: Build Python package
|
||||||
run-name: Generate Python ${{ inputs.VERSION || '3.11.0' }}
|
run-name: Generate Python ${{ inputs.VERSION || '3.12.3' }}
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
VERSION:
|
VERSION:
|
||||||
description: 'Python version to build and upload'
|
description: 'Python version to build and upload'
|
||||||
default: '3.11.0'
|
default: '3.12.3'
|
||||||
required: true
|
required: true
|
||||||
PUBLISH_RELEASES:
|
PUBLISH_RELEASES:
|
||||||
description: 'Whether to publish releases'
|
description: 'Whether to publish releases'
|
||||||
@@ -15,7 +15,7 @@ on:
|
|||||||
PLATFORMS:
|
PLATFORMS:
|
||||||
description: 'Platforms for execution in "os" or "os_arch" format (arch is "x64" by default)'
|
description: 'Platforms for execution in "os" or "os_arch" format (arch is "x64" by default)'
|
||||||
required: true
|
required: true
|
||||||
default: 'ubuntu-20.04,ubuntu-22.04,macos-11_x64,macos-11_arm64,windows-2019_x64,windows-2019_x86'
|
default: 'ubuntu-20.04,ubuntu-22.04,ubuntu-22.04_arm64,ubuntu-24.04,macos-11_x64,macos-14_arm64,windows-2019_x64,windows-2019_x86,windows-2019_arm64'
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- 'versions-manifest.json'
|
- 'versions-manifest.json'
|
||||||
@@ -25,7 +25,7 @@ on:
|
|||||||
- 'main'
|
- 'main'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
VERSION: ${{ inputs.VERSION || '3.11.0' }}
|
VERSION: ${{ inputs.VERSION || '3.12.3' }}
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
@@ -39,26 +39,35 @@ jobs:
|
|||||||
- name: Generate execution matrix
|
- name: Generate execution matrix
|
||||||
id: generate-matrix
|
id: generate-matrix
|
||||||
run: |
|
run: |
|
||||||
[String[]]$configurations = "${{ inputs.platforms || 'ubuntu-20.04,ubuntu-22.04,macos-11,macos-11_arm64,windows-2019_x64,windows-2019_x86' }}".Split(",").Trim()
|
[String[]]$configurations = "${{ inputs.platforms || 'ubuntu-20.04,ubuntu-22.04,ubuntu-22.04_arm64,ubuntu-24.04,macos-11,macos-14_arm64,windows-2019_x64,windows-2019_x86,windows-2019_arm64' }}".Split(",").Trim()
|
||||||
$matrix = @()
|
$matrix = @()
|
||||||
|
|
||||||
foreach ($configuration in $configurations) {
|
foreach ($configuration in $configurations) {
|
||||||
$parts = $configuration.Split("_")
|
$parts = $configuration.Split("_")
|
||||||
$os = $parts[0]
|
$os = $parts[0]
|
||||||
$arch = if ($parts[1]) {$parts[1]} else {"x64"}
|
$arch = if ($parts[1]) {$parts[1]} else {"x64"}
|
||||||
|
|
||||||
switch -wildcard ($os) {
|
switch -wildcard ($os) {
|
||||||
"*ubuntu*" { $platform = $os.Replace("ubuntu","linux")}
|
"*ubuntu*" { $platform = $os.Replace("ubuntu","linux")}
|
||||||
"*macos*" { $platform = 'darwin' }
|
"*macos*" { $platform = 'darwin' }
|
||||||
"*windows*" { $platform = 'win32' }
|
"*windows*" { $platform = 'win32' }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($configuration -eq "ubuntu-22.04_arm64") {
|
||||||
|
$os = "setup-actions-ubuntu-arm64-2-core"
|
||||||
|
}elseif ($configuration -eq "windows-2019_arm64") {
|
||||||
|
$os = "setup-actions-windows-arm64-4-core"
|
||||||
|
}
|
||||||
$matrix += @{
|
$matrix += @{
|
||||||
'platform' = $platform
|
'platform' = $platform
|
||||||
'os' = $os
|
'os' = $os
|
||||||
'arch' = $arch
|
'arch' = $arch
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
echo "matrix=$($matrix | ConvertTo-Json -Compress -AsArray)" >> $env:GITHUB_OUTPUT
|
echo "matrix=$($matrix | ConvertTo-Json -Compress -AsArray)" >> $env:GITHUB_OUTPUT
|
||||||
|
|
||||||
build_python:
|
build_python:
|
||||||
needs: generate_matrix
|
needs: generate_matrix
|
||||||
strategy:
|
strategy:
|
||||||
@@ -67,24 +76,47 @@ jobs:
|
|||||||
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.11.0' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
|
- name: Setup Environment on Windows ARM64 Runner
|
||||||
|
if: matrix.os == 'setup-actions-windows-arm64-4-core'
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
# Install Chocolatey
|
||||||
|
Set-ExecutionPolicy Bypass -Scope Process -Force
|
||||||
|
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
||||||
|
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
|
||||||
|
echo "C:\ProgramData\Chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
|
# Install PowerShell
|
||||||
|
choco install powershell-core -y
|
||||||
|
echo "C:\Program Files\PowerShell\7" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
|
# Install Git
|
||||||
|
choco install git -y
|
||||||
|
echo "C:\Program Files\Git\cmd" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
|
|
||||||
|
# Install 7-Zip
|
||||||
|
choco install 7zip -y
|
||||||
|
echo "C:\ProgramData\chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
|
|
||||||
- name: Build Python ${{ env.VERSION }}
|
- name: Build Python ${{ env.VERSION }}
|
||||||
run: |
|
run: |
|
||||||
./builders/build-python.ps1 -Version $env:VERSION `
|
./builders/build-python.ps1 -Version $env:VERSION `
|
||||||
-Platform ${{ matrix.platform }} -Architecture ${{ matrix.arch }}
|
-Platform ${{ matrix.platform }} -Architecture ${{ matrix.arch }}
|
||||||
|
|
||||||
- name: Publish artifact
|
- name: Publish artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ env.ARTIFACT_NAME }}
|
name: ${{ env.ARTIFACT_NAME }}
|
||||||
path: ${{ runner.temp }}/artifact
|
path: ${{ runner.temp }}/artifact
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
test_python:
|
test_python:
|
||||||
needs: [generate_matrix, build_python]
|
needs: [generate_matrix, build_python]
|
||||||
@@ -94,22 +126,52 @@ jobs:
|
|||||||
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.11.0' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
|
- name: Setup Environment on Windows ARM64 Runner
|
||||||
|
if: matrix.os == 'setup-actions-windows-arm64-4-core'
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
# Install Chocolatey
|
||||||
|
Set-ExecutionPolicy Bypass -Scope Process -Force
|
||||||
|
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
||||||
|
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
|
||||||
|
echo "C:\ProgramData\Chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
|
# Install PowerShell
|
||||||
|
choco install powershell-core -y
|
||||||
|
echo "C:\Program Files\PowerShell\7" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
|
# Install Git
|
||||||
|
choco install git -y
|
||||||
|
echo "C:\Program Files\Git\cmd" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
|
|
||||||
|
# Install 7-Zip
|
||||||
|
choco install 7zip -y
|
||||||
|
echo "C:\ProgramData\chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
- name: Fully cleanup the toolcache directory before testing
|
- name: Fully cleanup the toolcache directory before testing
|
||||||
run: ./helpers/clean-toolcache.ps1 -ToolName "Python"
|
run: ./helpers/clean-toolcache.ps1 -ToolName "Python"
|
||||||
|
|
||||||
- name: Download artifact
|
- name: Delete macOS /Library/Frameworks/Python.framework
|
||||||
uses: actions/download-artifact@v3
|
if: matrix.platform == 'darwin'
|
||||||
with:
|
shell: bash
|
||||||
path: ${{ runner.temp }}
|
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: Extract files
|
- name: Extract files
|
||||||
run: |
|
run: |
|
||||||
if ('${{ matrix.platform }}' -eq 'win32') {
|
if ('${{ matrix.platform }}' -eq 'win32') {
|
||||||
@@ -123,6 +185,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Apply build artifact to the local machine
|
- name: Apply build artifact to the local machine
|
||||||
run: |
|
run: |
|
||||||
|
$PSNativeCommandUseErrorActionPreference = $true
|
||||||
if ('${{ matrix.platform }}' -eq 'win32') {
|
if ('${{ matrix.platform }}' -eq 'win32') {
|
||||||
powershell ./setup.ps1
|
powershell ./setup.ps1
|
||||||
} else {
|
} else {
|
||||||
@@ -132,7 +195,7 @@ jobs:
|
|||||||
working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}
|
working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}
|
||||||
|
|
||||||
- name: Setup Python ${{ env.VERSION }}
|
- name: Setup Python ${{ env.VERSION }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.VERSION }}
|
python-version: ${{ env.VERSION }}
|
||||||
architecture: ${{ matrix.arch }}
|
architecture: ${{ matrix.arch }}
|
||||||
@@ -147,10 +210,9 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
$pythonLocation = which python
|
$pythonLocation = which python
|
||||||
if ('${{ matrix.platform }}' -eq 'darwin') { otool -L $pythonLocation } else { ldd $pythonLocation }
|
if ('${{ matrix.platform }}' -eq 'darwin') { otool -L $pythonLocation } else { ldd $pythonLocation }
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
Install-Module Pester -Force -Scope CurrentUser
|
Install-Module Pester -Force -Scope CurrentUser -SkipPublisherCheck
|
||||||
Import-Module Pester
|
Import-Module Pester
|
||||||
$pesterContainer = New-PesterContainer -Path './python-tests.ps1' -Data @{
|
$pesterContainer = New-PesterContainer -Path './python-tests.ps1' -Data @{
|
||||||
Version="${{ env.VERSION }}";
|
Version="${{ env.VERSION }}";
|
||||||
@@ -170,7 +232,7 @@ jobs:
|
|||||||
needs: test_python
|
needs: test_python
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v4
|
||||||
|
|
||||||
- name: Publish Release ${{ env.VERSION }}
|
- name: Publish Release ${{ env.VERSION }}
|
||||||
id: create_release
|
id: create_release
|
||||||
@@ -182,7 +244,6 @@ jobs:
|
|||||||
release_name: ${{ env.VERSION }}
|
release_name: ${{ env.VERSION }}
|
||||||
body: |
|
body: |
|
||||||
Python ${{ env.VERSION }}
|
Python ${{ env.VERSION }}
|
||||||
|
|
||||||
- name: Generate hash for packages
|
- name: Generate hash for packages
|
||||||
run: |
|
run: |
|
||||||
$childItems = Get-Childitem -Path '.'
|
$childItems = Get-Childitem -Path '.'
|
||||||
@@ -196,7 +257,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
- name: Upload release assets
|
- name: Upload release assets
|
||||||
uses: actions/github-script@v6
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
@@ -220,7 +281,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Trigger "Create Pull Request" workflow
|
- name: Trigger "Create Pull Request" workflow
|
||||||
uses: actions/github-script@v6
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
@@ -230,4 +291,3 @@ jobs:
|
|||||||
workflow_id: 'create-pr.yml',
|
workflow_id: 'create-pr.yml',
|
||||||
ref: 'main'
|
ref: 'main'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
|
|||||||
4
.github/workflows/releases-validation.yml
vendored
4
.github/workflows/releases-validation.yml
vendored
@@ -15,10 +15,10 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04]
|
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04]
|
||||||
python: [3.9.12, 3.10.8, 3.11.10]
|
python: [3.9.13, 3.10.11, 3.11.8]
|
||||||
steps:
|
steps:
|
||||||
- name: setup-python ${{ matrix.python }}
|
- name: setup-python ${{ matrix.python }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
|
|
||||||
|
|||||||
@@ -1,168 +0,0 @@
|
|||||||
using module "./python-builder.psm1"
|
|
||||||
|
|
||||||
class NixPythonBuilder : PythonBuilder {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Base Python builder class for *Nix systems.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
Contains methods that required to build Python artifact for *nix systems. Inherited from base PythonBuilder class.
|
|
||||||
|
|
||||||
.PARAMETER version
|
|
||||||
The version of Python that should be built.
|
|
||||||
|
|
||||||
.PARAMETER Platform
|
|
||||||
The type of platform for which Python should be built.
|
|
||||||
|
|
||||||
.PARAMETER PlatformVersion
|
|
||||||
The version of platform for which Python should be built.
|
|
||||||
|
|
||||||
.PARAMETER InstallationTemplateName
|
|
||||||
The name of template that will be used to create installation script for generated Python artifact.
|
|
||||||
|
|
||||||
.PARAMETER InstallationScriptName
|
|
||||||
The name of installation script that will be generated for Python artifact.
|
|
||||||
|
|
||||||
.PARAMETER OutputArtifactName
|
|
||||||
The name of archive with Python binaries that will be generated as part of Python artifact.
|
|
||||||
|
|
||||||
#>
|
|
||||||
|
|
||||||
[string] $InstallationTemplateName
|
|
||||||
[string] $InstallationScriptName
|
|
||||||
[string] $OutputArtifactName
|
|
||||||
|
|
||||||
NixPythonBuilder(
|
|
||||||
[semver] $version,
|
|
||||||
[string] $architecture,
|
|
||||||
[string] $platform
|
|
||||||
) : Base($version, $architecture, $platform) {
|
|
||||||
$this.InstallationTemplateName = "nix-setup-template.sh"
|
|
||||||
$this.InstallationScriptName = "setup.sh"
|
|
||||||
$this.OutputArtifactName = "python-$Version-$Platform-$Architecture.tar.gz"
|
|
||||||
}
|
|
||||||
|
|
||||||
[uri] GetSourceUri() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Get base Python URI and return complete URI for Python sources.
|
|
||||||
#>
|
|
||||||
|
|
||||||
$base = $this.GetBaseUri()
|
|
||||||
$versionName = $this.GetBaseVersion()
|
|
||||||
$nativeVersion = Convert-Version -version $this.Version
|
|
||||||
|
|
||||||
return "${base}/${versionName}/Python-${nativeVersion}.tgz"
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] GetPythonBinary() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Return name of Python binary.
|
|
||||||
#>
|
|
||||||
|
|
||||||
if ($this.Version.Major -eq 2) { $pythonBinary = "python" } else { $pythonBinary = "python3" }
|
|
||||||
return $pythonBinary
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Download() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Download Python sources and extract them at temporary work folder. Returns expanded archive location path.
|
|
||||||
#>
|
|
||||||
|
|
||||||
$sourceUri = $this.GetSourceUri()
|
|
||||||
Write-Host "Sources URI: $sourceUri"
|
|
||||||
|
|
||||||
$archiveFilepath = Download-File -Uri $sourceUri -OutputFolder $this.WorkFolderLocation
|
|
||||||
$expandedSourceLocation = Join-Path -Path $this.TempFolderLocation -ChildPath "SourceCode"
|
|
||||||
New-Item -Path $expandedSourceLocation -ItemType Directory
|
|
||||||
|
|
||||||
Extract-TarArchive -ArchivePath $archiveFilepath -OutputDirectory $expandedSourceLocation
|
|
||||||
Write-Debug "Done; Sources location: $expandedSourceLocation"
|
|
||||||
|
|
||||||
return $expandedSourceLocation
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] CreateInstallationScript() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Create Python artifact installation script based on template specified in InstallationTemplateName property.
|
|
||||||
#>
|
|
||||||
|
|
||||||
$installationScriptLocation = New-Item -Path $this.WorkFolderLocation -Name $this.InstallationScriptName -ItemType File
|
|
||||||
$installationTemplateLocation = Join-Path -Path $this.InstallationTemplatesLocation -ChildPath $this.InstallationTemplateName
|
|
||||||
|
|
||||||
$installationTemplateContent = Get-Content -Path $installationTemplateLocation -Raw
|
|
||||||
|
|
||||||
$variablesToReplace = @{
|
|
||||||
"{{__VERSION_FULL__}}" = $this.Version;
|
|
||||||
}
|
|
||||||
$variablesToReplace.keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent.Replace($_, $variablesToReplace[$_]) }
|
|
||||||
|
|
||||||
$installationTemplateContent | Out-File -FilePath $installationScriptLocation
|
|
||||||
|
|
||||||
Write-Debug "Done; Installation script location: $installationScriptLocation)"
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Make() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Executes "make" and "make install" commands for configured build sources. Make output will be writen in build_output.txt located in artifact location folder.
|
|
||||||
#>
|
|
||||||
|
|
||||||
Write-Debug "make Python $($this.Version)-$($this.Architecture) $($this.Platform)"
|
|
||||||
$buildOutputLocation = New-Item -Path $this.WorkFolderLocation -Name "build_output.txt" -ItemType File
|
|
||||||
|
|
||||||
Execute-Command -Command "make 2>&1 | tee $buildOutputLocation" -ErrorAction Continue
|
|
||||||
Execute-Command -Command "make install" -ErrorAction Continue
|
|
||||||
|
|
||||||
Write-Debug "Done; Make log location: $buildOutputLocation"
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] CopyBuildResults() {
|
|
||||||
$buildFolder = $this.GetFullPythonToolcacheLocation()
|
|
||||||
Move-Item -Path "$buildFolder/*" -Destination $this.WorkFolderLocation
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] ArchiveArtifact() {
|
|
||||||
$OutputPath = Join-Path $this.ArtifactFolderLocation $this.OutputArtifactName
|
|
||||||
Create-TarArchive -SourceFolder $this.WorkFolderLocation -ArchivePath $OutputPath
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Build() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Build Python artifact from sources.
|
|
||||||
#>
|
|
||||||
|
|
||||||
Write-Host "Prepare Python Hostedtoolcache location..."
|
|
||||||
$this.PreparePythonToolcacheLocation()
|
|
||||||
|
|
||||||
Write-Host "Prepare system environment..."
|
|
||||||
$this.PrepareEnvironment()
|
|
||||||
|
|
||||||
Write-Host "Download Python $($this.Version)[$($this.Architecture)] sources..."
|
|
||||||
$sourcesLocation = $this.Download()
|
|
||||||
|
|
||||||
Push-Location -Path $sourcesLocation
|
|
||||||
Write-Host "Configure for $($this.Platform)..."
|
|
||||||
$this.Configure()
|
|
||||||
|
|
||||||
Write-Host "Make for $($this.Platform)..."
|
|
||||||
$this.Make()
|
|
||||||
Pop-Location
|
|
||||||
|
|
||||||
Write-Host "Generate structure dump"
|
|
||||||
New-ToolStructureDump -ToolPath $this.GetFullPythonToolcacheLocation() -OutputFolder $this.WorkFolderLocation
|
|
||||||
|
|
||||||
Write-Host "Copying build results to destination location"
|
|
||||||
$this.CopyBuildResults()
|
|
||||||
|
|
||||||
Write-Host "Create installation script..."
|
|
||||||
$this.CreateInstallationScript()
|
|
||||||
|
|
||||||
Write-Host "Archive artifact..."
|
|
||||||
$this.ArchiveArtifact()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -37,16 +37,9 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
$configureString += " --enable-shared"
|
$configureString += " --enable-shared"
|
||||||
$configureString += " --enable-optimizations"
|
$configureString += " --enable-optimizations"
|
||||||
|
|
||||||
### Compile with ucs4 for Python 2.x. On 3.x, ucs4 is enabled by default
|
### Compile with support of loadable sqlite extensions.
|
||||||
if ($this.Version -lt "3.0.0") {
|
|
||||||
$configureString += " --enable-unicode=ucs4"
|
|
||||||
}
|
|
||||||
|
|
||||||
### Compile with support of loadable sqlite extensions. Unavailable for Python 2.*
|
|
||||||
### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension)
|
### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension)
|
||||||
if ($this.Version -ge "3.2.0") {
|
$configureString += " --enable-loadable-sqlite-extensions"
|
||||||
$configureString += " --enable-loadable-sqlite-extensions"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "The passed configure options are: "
|
Write-Host "The passed configure options are: "
|
||||||
Write-Host $configureString
|
Write-Host $configureString
|
||||||
@@ -60,17 +53,13 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
Prepare system environment by installing dependencies and required packages.
|
Prepare system environment by installing dependencies and required packages.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
if (($this.Version -gt "3.0.0") -and ($this.Version -lt "3.5.3")) {
|
if ($this.Version -lt "3.5.3") {
|
||||||
Write-Host "Python3 versions lower than 3.5.3 are not supported"
|
Write-Host "Python versions lower than 3.5.3 are not supported"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
### Compile with tkinter support
|
### Compile with tkinter support
|
||||||
if ($this.Version -gt "3.0.0") {
|
$tkinterInstallString = "sudo apt-get install -y --allow-downgrades python3-tk tk-dev"
|
||||||
$tkinterInstallString = "sudo apt-get install -y --allow-downgrades python3-tk tk-dev"
|
|
||||||
} else {
|
|
||||||
$tkinterInstallString = "sudo apt install -y python-tk tk-dev"
|
|
||||||
}
|
|
||||||
|
|
||||||
Execute-Command -Command "sudo apt-get update"
|
Execute-Command -Command "sudo apt-get update"
|
||||||
Execute-Command -Command $tkinterInstallString
|
Execute-Command -Command $tkinterInstallString
|
||||||
@@ -85,7 +74,8 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
"libsqlite3-dev",
|
"libsqlite3-dev",
|
||||||
"libncursesw5-dev",
|
"libncursesw5-dev",
|
||||||
"libreadline-dev",
|
"libreadline-dev",
|
||||||
"libgdbm-dev"
|
"libgdbm-dev",
|
||||||
|
"liblzma-dev"
|
||||||
) | ForEach-Object {
|
) | ForEach-Object {
|
||||||
Execute-Command -Command "sudo apt install -y $_"
|
Execute-Command -Command "sudo apt install -y $_"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
using module "./python-builder.psm1"
|
using module "./python-builder.psm1"
|
||||||
|
|
||||||
class WinPythonBuilder : PythonBuilder {
|
class WinPythonBuilder : PythonBuilder {
|
||||||
@@ -60,8 +61,11 @@ class WinPythonBuilder : PythonBuilder {
|
|||||||
} else {
|
} else {
|
||||||
$ArchitectureExtension = ".amd64"
|
$ArchitectureExtension = ".amd64"
|
||||||
}
|
}
|
||||||
|
}elseif ($this.Architecture -eq "arm64") {
|
||||||
|
$ArchitectureExtension = "-arm64"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return $ArchitectureExtension
|
return $ArchitectureExtension
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,8 +69,9 @@ fi
|
|||||||
chmod +x ../python $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJOR_MINOR python
|
chmod +x ../python $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJOR_MINOR python
|
||||||
|
|
||||||
echo "Upgrading pip..."
|
echo "Upgrading pip..."
|
||||||
|
export PIP_ROOT_USER_ACTION=ignore
|
||||||
./python -m ensurepip
|
./python -m ensurepip
|
||||||
./python -m pip install --ignore-installed pip --disable-pip-version-check --no-warn-script-location --root-user-action=ignore
|
./python -m pip install --upgrade --force-reinstall pip --disable-pip-version-check --no-warn-script-location
|
||||||
|
|
||||||
echo "Install OpenSSL certificates"
|
echo "Install OpenSSL certificates"
|
||||||
sh -e "${PYTHON_APPLICATION_PATH}/Install Certificates.command"
|
sh -e "${PYTHON_APPLICATION_PATH}/Install Certificates.command"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
PYTHON_FULL_VERSION="{{__VERSION_FULL__}}"
|
PYTHON_FULL_VERSION="{{__VERSION_FULL__}}"
|
||||||
|
ARCH="{{__ARCH__}}"
|
||||||
MAJOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 1)
|
MAJOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 1)
|
||||||
MINOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 2)
|
MINOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 2)
|
||||||
|
|
||||||
@@ -17,7 +18,7 @@ fi
|
|||||||
|
|
||||||
PYTHON_TOOLCACHE_PATH=$TOOLCACHE_ROOT/Python
|
PYTHON_TOOLCACHE_PATH=$TOOLCACHE_ROOT/Python
|
||||||
PYTHON_TOOLCACHE_VERSION_PATH=$PYTHON_TOOLCACHE_PATH/$PYTHON_FULL_VERSION
|
PYTHON_TOOLCACHE_VERSION_PATH=$PYTHON_TOOLCACHE_PATH/$PYTHON_FULL_VERSION
|
||||||
PYTHON_TOOLCACHE_VERSION_ARCH_PATH=$PYTHON_TOOLCACHE_VERSION_PATH/x64
|
PYTHON_TOOLCACHE_VERSION_ARCH_PATH=$PYTHON_TOOLCACHE_VERSION_PATH/$ARCH
|
||||||
|
|
||||||
echo "Check if Python hostedtoolcache folder exist..."
|
echo "Check if Python hostedtoolcache folder exist..."
|
||||||
if [ ! -d $PYTHON_TOOLCACHE_PATH ]; then
|
if [ ! -d $PYTHON_TOOLCACHE_PATH ]; then
|
||||||
@@ -49,8 +50,9 @@ fi
|
|||||||
chmod +x ../python $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJORMINOR python
|
chmod +x ../python $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJORMINOR python
|
||||||
|
|
||||||
echo "Upgrading pip..."
|
echo "Upgrading pip..."
|
||||||
|
export PIP_ROOT_USER_ACTION=ignore
|
||||||
./python -m ensurepip
|
./python -m ensurepip
|
||||||
./python -m pip install --ignore-installed pip --disable-pip-version-check --no-warn-script-location --root-user-action=ignore
|
./python -m pip install --upgrade --force-reinstall pip --disable-pip-version-check --no-warn-script-location
|
||||||
|
|
||||||
echo "Create complete file"
|
echo "Create complete file"
|
||||||
touch $PYTHON_TOOLCACHE_VERSION_PATH/x64.complete
|
touch $PYTHON_TOOLCACHE_VERSION_PATH/$ARCH.complete
|
||||||
@@ -133,8 +133,12 @@ if ($MajorVersion -ne "2") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Install and upgrade Pip"
|
Write-Host "Install and upgrade Pip"
|
||||||
|
$Env:PIP_ROOT_USER_ACTION = "ignore"
|
||||||
$PythonExePath = Join-Path -Path $PythonArchPath -ChildPath "python.exe"
|
$PythonExePath = Join-Path -Path $PythonArchPath -ChildPath "python.exe"
|
||||||
cmd.exe /c "$PythonExePath -m ensurepip && $PythonExePath -m pip install --upgrade pip --no-warn-script-location --root-user-action=ignore"
|
cmd.exe /c "$PythonExePath -m ensurepip && $PythonExePath -m pip install --upgrade --force-reinstall pip --no-warn-script-location"
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Throw "Error happened during pip installation / upgrade"
|
||||||
|
}
|
||||||
|
|
||||||
Write-Host "Create complete file"
|
Write-Host "Create complete file"
|
||||||
New-Item -ItemType File -Path $PythonVersionPath -Name "$Architecture.complete" | Out-Null
|
New-Item -ItemType File -Path $PythonVersionPath -Name "$Architecture.complete" | Out-Null
|
||||||
|
|||||||
@@ -103,4 +103,8 @@ Describe "Tests" {
|
|||||||
It "Check urlopen with HTTPS works" {
|
It "Check urlopen with HTTPS works" {
|
||||||
"python ./sources/python-urlopen-https.py" | Should -ReturnZeroExitCode
|
"python ./sources/python-urlopen-https.py" | Should -ReturnZeroExitCode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
It "Check a single dist-info per distribution is present" {
|
||||||
|
"python ./sources/dist-info.py" | Should -ReturnZeroExitCode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
tests/sources/dist-info.py
Normal file
24
tests/sources/dist-info.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import glob
|
||||||
|
import os.path
|
||||||
|
import sysconfig
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
def check_dist_info():
|
||||||
|
paths = set([sysconfig.get_path("purelib"), sysconfig.get_path("platlib")])
|
||||||
|
versions = defaultdict(list)
|
||||||
|
for path in paths:
|
||||||
|
pattern = os.path.join(path, "*.dist-info")
|
||||||
|
for dist_info in glob.glob(pattern):
|
||||||
|
name = os.path.basename(dist_info).split("-", maxsplit=1)[0]
|
||||||
|
versions[name].append(dist_info)
|
||||||
|
exit_code = 0
|
||||||
|
for name in versions:
|
||||||
|
if len(versions[name]) > 1:
|
||||||
|
print("multiple dist-info found for {}: {}".format(name, versions[name]))
|
||||||
|
exit_code = 1
|
||||||
|
exit(exit_code)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
check_dist_info()
|
||||||
@@ -28,7 +28,7 @@ if os_type == 'Darwin': expected_ld_library_extension = 'dylib'
|
|||||||
if pkg_installer:
|
if pkg_installer:
|
||||||
expected_lib_dir_path = f'/Library/Frameworks/Python.framework/Versions/{version_major}.{version_minor}/lib'
|
expected_lib_dir_path = f'/Library/Frameworks/Python.framework/Versions/{version_major}.{version_minor}/lib'
|
||||||
else:
|
else:
|
||||||
expected_lib_dir_path = f'{os.getenv("AGENT_TOOLSDIRECTORY")}/Python/{version}/x64/lib'
|
expected_lib_dir_path = f'{os.getenv("AGENT_TOOLSDIRECTORY")}/Python/{version}/{architecture}/lib'
|
||||||
|
|
||||||
# Check modules
|
# Check modules
|
||||||
### Validate libraries path
|
### Validate libraries path
|
||||||
|
|||||||
@@ -274,6 +274,27 @@ if sys.version_info >= (3, 12):
|
|||||||
standard_library.remove('asyncore')
|
standard_library.remove('asyncore')
|
||||||
standard_library.remove('asynchat')
|
standard_library.remove('asynchat')
|
||||||
|
|
||||||
|
# 'aifc', 'cgi', 'cgitb', 'chunk', 'crypt', 'imghdr', 'lib2to3', 'mailcap', 'nntplib',
|
||||||
|
# 'pipes', 'sndhdr', 'sunau', 'telnetlib', 'uu' and 'xdrlib' modules have been removed
|
||||||
|
# from Python 3.13
|
||||||
|
# https://docs.python.org/dev/whatsnew/3.13.html
|
||||||
|
if sys.version_info >= (3, 13):
|
||||||
|
standard_library.remove('aifc')
|
||||||
|
standard_library.remove('cgi')
|
||||||
|
standard_library.remove('cgitb')
|
||||||
|
standard_library.remove('chunk')
|
||||||
|
standard_library.remove('crypt')
|
||||||
|
standard_library.remove('imghdr')
|
||||||
|
standard_library.remove('lib2to3')
|
||||||
|
standard_library.remove('mailcap')
|
||||||
|
standard_library.remove('nntplib')
|
||||||
|
standard_library.remove('pipes')
|
||||||
|
standard_library.remove('sndhdr')
|
||||||
|
standard_library.remove('sunau')
|
||||||
|
standard_library.remove('telnetlib')
|
||||||
|
standard_library.remove('uu')
|
||||||
|
standard_library.remove('xdrlib')
|
||||||
|
|
||||||
# Remove tkinter and Easter eggs
|
# Remove tkinter and Easter eggs
|
||||||
excluded_modules = [
|
excluded_modules = [
|
||||||
'antigravity',
|
'antigravity',
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user