Compare commits

...

44 Commits

Author SHA1 Message Date
MaksimZhukov
0b6a06284d Merge pull request #58 from dmitry-shibanov/v-dmshib/rebuild-python-openssl
Change version of openssl for python building.
2020-10-28 15:17:45 +03:00
Dmitry Shibanov
50e47adc8b remove debug lines 2020-10-27 11:56:49 +03:00
Dmitry Shibanov
99a84463ad revert test changes 2020-10-27 11:45:49 +03:00
Dmitry Shibanov
a7aea91c95 change links 2020-10-21 19:18:35 +03:00
Dmitry Shibanov
cdd1351989 change to static path 2020-10-21 15:55:45 +03:00
Dmitry Shibanov
2aa5c75cf9 change connection 2020-10-21 10:58:28 +03:00
Dmitry Shibanov
13b26039fa add fix to confirm uninstalling 2020-10-20 15:47:44 +03:00
Dmitry Shibanov
aa8915507a add new openssl 2020-10-20 13:12:41 +03:00
MaksimZhukov
57bf4da3a5 Merge pull request #57 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 10/14/2020
2020-10-14 12:06:42 +03:00
Service account
085cf7607e Update versions-manifest 2020-10-14 08:52:18 +00:00
MaksimZhukov
ae06e9c90f Merge pull request #56 from dmitry-shibanov/v-dmshib/exclude-symbol-from3.10
Exclude symbol module from python 3.10 and higher.
2020-10-14 11:27:17 +03:00
Dmitry Shibanov
c4030498aa add version compare 2020-10-13 19:56:27 +03:00
Dmitry Shibanov
6701f7c8b0 add new exclude 2020-10-13 16:42:04 +03:00
github-actions[bot]
1430296346 Add 3.9.0 (#55)
Co-authored-by: Service account <no-reply@microsoft.com>
2020-10-06 15:48:59 +03:00
MaksimZhukov
abc7af4881 Merge pull request #54 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 09/24/2020
2020-09-25 11:21:23 +03:00
Service account
c2464b5d82 Update versions-manifest 2020-09-24 12:26:29 +00:00
MaksimZhukov
ff07bfffbb Merge pull request #53 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 09/21/2020
2020-09-21 18:06:30 +03:00
Service account
46856eea96 Update versions-manifest 2020-09-21 14:48:39 +00:00
MaksimZhukov
1c92aa7fd8 Merge pull request #52 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 09/07/2020
2020-09-07 12:22:42 +03:00
Service account
4e23e7ccf5 Update versions-manifest 2020-09-07 09:07:48 +00:00
MaksimZhukov
e643db6cb1 Merge pull request #50 from actions/v-mazhuk/move-release-creation-to-github-actions
Move release and PR creation to GitHub Actions
2020-08-28 18:01:59 +03:00
MaksimZhukov
15099a8cbe Add link to the created PR 2020-08-28 15:24:47 +03:00
MaksimZhukov
a3078ebf0c Move release and PR creation to the GitHub Actions 2020-08-28 14:14:38 +03:00
MaksimZhukov
87b41b829e Merge pull request #47 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 08/18/2020
2020-08-18 16:40:37 +03:00
Service account
b41aabd79c Update versions-manifest based on build from 20200818.1 2020-08-18 13:25:10 +00:00
MaksimZhukov
ca3edf5446 Merge pull request #46 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 08/12/2020
2020-08-12 12:55:08 +03:00
Service account
04b0679602 Update versions-manifest based on build from 20200812.1 2020-08-12 08:45:37 +00:00
MaksimZhukov
6204b3717e Update Git submodule (#45)
Co-authored-by: MaksimZhukov <v-mazhuk@microsoft.com>
2020-07-30 14:22:24 +03:00
Maxim Lobanov
d20146a86c Update versions-manifest.json 2020-07-28 22:12:47 +03:00
MaksimZhukov
4df41f4916 Update versions-manifest based on build from 20200721.2 (#44)
Co-authored-by: Service account <no-reply@microsoft.com>
2020-07-24 14:15:21 +03:00
MaksimZhukov
636e550e78 Update versions-manifest based on build from 20200721.2 (#43)
Co-authored-by: Service account <no-reply@microsoft.com>
2020-07-21 16:04:40 +03:00
MaksimZhukov
bbbf87f2cf Update versions-manifest based on build from 20200715.1 (#42)
Co-authored-by: Service account <no-reply@microsoft.com>
2020-07-17 16:45:08 +03:00
MaksimZhukov
1cb5ff2fb0 Update versions-manifest based on build from 20200715.1 (#40)
Co-authored-by: Service account <no-reply@microsoft.com>
2020-07-15 20:49:07 +03:00
MaksimZhukov
654b037263 Fix python tests (#41)
Co-authored-by: MaksimZhukov <v-mazhuk@microsoft.com>
2020-07-15 15:54:30 +03:00
Maxim Lobanov
06e3e6702d Update README.md 2020-07-15 13:37:07 +03:00
MaksimZhukov
5c851d6172 Add support for unstable Python versions (#38)
* Add support of unstable versions to package generation (#2)
* Add support of symver versions to Python setup scripts and tests

Co-authored-by: Maksim Petrov <47208721+vmapetr@users.noreply.github.com>
Co-authored-by: MaksimZhukov <v-mazhuk@microsoft.com>
Co-authored-by: Maxim Lobanov <v-malob@microsoft.com>
2020-07-15 13:13:21 +03:00
Maxim Lobanov
67794a4d5f switch default branch (#37) 2020-07-14 17:22:51 +03:00
MaksimZhukov
58a9c4b1d9 Merge pull request #35 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 06/29/2020
2020-06-29 18:14:43 +03:00
Service account
9b7480ff6d Update versions-manifest based on build from 20200629.6 2020-06-29 11:51:19 +00:00
MaksimZhukov
7ef20701e6 Merge pull request #34 from actions/v-mazhuk/validate-version-manifest
Add test workflow to validate versions-manifest.json file
2020-06-17 10:45:17 +03:00
MaksimZhukov
4dee72fe2f Remove checkout and update git submodules 2020-06-16 20:10:32 +03:00
MaksimZhukov
94ccfe8b74 Add test workflow to validate versions-manifest.json file 2020-06-16 18:39:00 +03:00
Alena Sviridenko
6e82fdd5b2 Merge pull request #32 from actions/update-versions-manifest-file
[versions-manifest] Update for release from 06/10/2020
2020-06-10 12:32:33 +03:00
Service account
0baa79c808 Update versions-manifest based on build from 20200610.1 2020-06-10 08:43:43 +00:00
27 changed files with 1091 additions and 170 deletions

33
.github/workflows/create-pr.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Create Pull Request
on:
workflow_dispatch:
defaults:
run:
shell: pwsh
jobs:
create_pr:
name: Create Pull Request
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Create versions-manifest.json
run: |
./helpers/packages-generation/manifest-generator.ps1 -RepositoryFullName "$env:GITHUB_REPOSITORY" `
-GitHubAccessToken "${{secrets.GITHUB_TOKEN}}" `
-OutputFile "./versions-manifest.json" `
-ConfigurationFile "./config/python-manifest-config.json"
- name: Create GitHub PR
run: |
$formattedDate = Get-Date -Format "MM/dd/yyyy"
./helpers/github/create-pull-request.ps1 `
-RepositoryFullName "$env:GITHUB_REPOSITORY" `
-AccessToken "${{secrets.GITHUB_TOKEN}}" `
-BranchName "update-versions-manifest-file" `
-CommitMessage "Update versions-manifest" `
-PullRequestTitle "[versions-manifest] Update for release from ${formattedDate}" `
-PullRequestBody "Update versions-manifest.json for release from ${formattedDate}"

18
.github/workflows/create-release.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Create release
on:
repository_dispatch:
types: [create-release]
jobs:
create_release:
name: Create release ${{ github.event.client_payload.ToolVersion }}
runs-on: ubuntu-latest
steps:
- name: Create release for Python ${{ github.event.client_payload.ToolVersion }}
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.event.client_payload.TagName }}
release_name: ${{ github.event.client_payload.ToolVersion }}
body: ${{ github.event.client_payload.ReleaseBody }}

View File

@@ -0,0 +1,32 @@
name: Manifest config tests
on:
pull_request:
branches:
- main
paths-ignore:
- 'versions-manifest.json'
jobs:
RunTests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: true
- name: Install Pester
shell: pwsh
run: |
Install-Module Pester -Force -Scope CurrentUser
- name: Run tests
shell: pwsh
run: |
Import-Module Pester
Invoke-Pester -Configuration @{
Run = @{
Path = "tests/ManifestConfig.Tests.ps1"
Exit = $true
}
}

View File

@@ -0,0 +1,35 @@
name: Validate 'versions-manifest.json' file
on:
push:
branches:
- main
paths:
- 'versions-manifest.json'
jobs:
setup-versions-from-manifest:
name: Setup ${{ matrix.python }} ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest, ubuntu-16.04, ubuntu-18.04, ubuntu-20.04]
python: [3.5.4, 3.6.7, 3.7.5, 3.8.1]
steps:
- name: setup-python ${{ matrix.python }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python }}
- 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))'

2
.gitmodules vendored
View File

@@ -1,4 +1,4 @@
[submodule "helpers"] [submodule "helpers"]
path = helpers path = helpers
url = https://github.com/actions/versions-package-tools url = https://github.com/actions/versions-package-tools
branch = master branch = main

View File

@@ -10,7 +10,7 @@ Some versions are pre-installed on [virtual-environments](https://github.com/act
More versions will (soon!) be available to install on-the-fly through the [`setup-python`](https://github.com/actions/setup-python) action. More versions will (soon!) be available to install on-the-fly through the [`setup-python`](https://github.com/actions/setup-python) action.
## Adding new versions ## Adding new versions
We are trying to build and release new versions of Python as soon as they are released. Please open an issue if any versions are missing. We are trying to build and release new versions of Python as soon as they are released. Please open an issue in [actions/virtual-environments](https://github.com/actions/virtual-environments) if any versions are missing.
## Contribution ## Contribution
Contributions are welcome! See [Contributor's Guide](./CONTRIBUTING.md) for more details about contribution process and code structure Contributions are welcome! See [Contributor's Guide](./CONTRIBUTING.md) for more details about contribution process and code structure

View File

@@ -116,3 +116,17 @@ stages:
Architecture: x86 Architecture: x86
jobs: jobs:
- template: /azure-pipelines/templates/test-job.yml - template: /azure-pipelines/templates/test-job.yml
- stage: Publish_Release
dependsOn: [Test_Python_MacOS, Test_Python_Ubuntu_1604, Test_Python_Ubuntu_1804, Test_Python_Ubuntu_2004, Test_Python_x64_Windows, Test_Python_x86_Windows]
jobs:
- deployment: Publish_Release
pool:
name: Azure Pipelines
vmImage: ubuntu-18.04
environment: 'Get Available Tools Versions - Publishing Approval'
strategy:
runOnce:
deploy:
steps:
- template: /azure-pipelines/templates/publish-release-steps.yml

View File

@@ -3,7 +3,7 @@ pr:
autoCancel: true autoCancel: true
branches: branches:
include: include:
- master - main
paths: paths:
exclude: exclude:
- versions-manifest.json - versions-manifest.json
@@ -29,6 +29,10 @@ jobs:
-AzureDevOpsProjectName $(System.TeamProject) ` -AzureDevOpsProjectName $(System.TeamProject) `
-AzureDevOpsAccessToken $(System.AccessToken) ` -AzureDevOpsAccessToken $(System.AccessToken) `
-SourceBranch $(Build.SourceBranch) ` -SourceBranch $(Build.SourceBranch) `
-DefinitionId $(DEFINITION_ID) `
-SourceVersion $(Build.SourceVersion) ` -SourceVersion $(Build.SourceVersion) `
-ManifestLink $(MANIFEST_LINK) `
-WaitForBuilds $(WAIT_FOR_BUILDS) `
-ToolVersions "$(PYTHON_VERSIONS)" ` -ToolVersions "$(PYTHON_VERSIONS)" `
-DefinitionId $(DEFINITION_ID) -RetryIntervalSec $(RETRY_INTERVAL_SEC) `
-RetryCount $(RETRY_COUNT)

View File

@@ -14,6 +14,7 @@ jobs:
targetType: filePath targetType: filePath
filePath: './builders/build-python.ps1' filePath: './builders/build-python.ps1'
arguments: '-Version $(VERSION) -Platform $(Platform) -Architecture $(Architecture)' arguments: '-Version $(VERSION) -Platform $(Platform) -Architecture $(Architecture)'
pwsh: true
- task: PublishPipelineArtifact@1 - task: PublishPipelineArtifact@1
displayName: 'Publish Artifact: Python $(VERSION)' displayName: 'Publish Artifact: Python $(VERSION)'

View File

@@ -0,0 +1,47 @@
steps:
- download: none
- checkout: self
submodules: true
- task: DownloadPipelineArtifact@2
inputs:
source: 'current'
path: $(Build.BinariesDirectory)
- task: PowerShell@2
displayName: 'Create release Python $(VERSION)'
inputs:
TargetType: inline
script: |
$tagName = "$(VERSION)-$(Build.BuildId)"
$releaseBody = "Python $(VERSION)"
./helpers/github/create-release.ps1 -RepositoryFullName "$(Build.Repository.Name)" `
-AccessToken "$(GITHUB_TOKEN)" `
-ToolVersion "$(VERSION)" `
-TagName "$tagName" `
-ReleaseBody "$releaseBody" `
-EventType "$(EVENT_TYPE)"
- task: GitHubRelease@1
displayName: 'Upload release assets'
inputs:
gitHubConnection: 'Github Connection'
action: edit
tag: '$(VERSION)-$(Build.BuildId)'
title: '$(VERSION)'
releaseNotesSource: inline
releaseNotesInline: '$(RELEASE_NOTES_CONTENT)'
assets: '$(Build.BinariesDirectory)/*/*'
assetUploadMode: replace
addChangeLog: false
- task: PowerShell@2
displayName: 'Trigger "Create Pull Request" workflow'
inputs:
TargetType: inline
script: |
Import-Module (Join-Path (Get-Location).Path "github-api.psm1")
$gitHubApi = Get-GitHubApi -RepositoryFullName "$(Build.Repository.Name)" -AccessToken "$(GITHUB_TOKEN)"
$gitHubApi.CreateWorkflowDispatch("$(WORKFLOW_FILE_NAME)", "$(WORKFLOW_DISPATCH_REF)", "$(INPUTS)")
Write-Host "Please find created Pull request here: $(Build.Repository.Uri)/pulls"
workingDirectory: '$(Build.SourcesDirectory)/helpers/github'

View File

@@ -3,6 +3,8 @@ jobs:
pool: pool:
name: Azure Pipelines name: Azure Pipelines
vmImage: $(VmImage) vmImage: $(VmImage)
variables:
TestRunTitle: 'python-$(Platform)-$(Architecture)'
steps: steps:
- checkout: self - checkout: self
submodules: true submodules: true
@@ -74,6 +76,7 @@ jobs:
} }
} }
Invoke-Pester -Script $pesterParams -OutputFile "test_results.xml" -OutputFormat NUnitXml Invoke-Pester -Script $pesterParams -OutputFile "test_results.xml" -OutputFormat NUnitXml
pwsh: true
workingDirectory: '$(Build.SourcesDirectory)/tests' workingDirectory: '$(Build.SourcesDirectory)/tests'
- task: PublishTestResults@2 - task: PublishTestResults@2

View File

@@ -21,7 +21,7 @@ Required parameter. The platform for which Python will be built.
#> #>
param( param(
[Parameter (Mandatory=$true)][Version] $Version, [Parameter (Mandatory=$true)][semver] $Version,
[Parameter (Mandatory=$true)][string] $Platform, [Parameter (Mandatory=$true)][string] $Platform,
[string] $Architecture = "x64" [string] $Architecture = "x64"
) )
@@ -29,6 +29,7 @@ param(
Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "common-helpers.psm1") -DisableNameChecking Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "common-helpers.psm1") -DisableNameChecking
Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "nix-helpers.psm1") -DisableNameChecking Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "nix-helpers.psm1") -DisableNameChecking
Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "win-helpers.psm1") -DisableNameChecking Import-Module (Join-Path $PSScriptRoot "../helpers" | Join-Path -ChildPath "win-helpers.psm1") -DisableNameChecking
Import-Module (Join-Path $PSScriptRoot "python-version.psm1") -DisableNameChecking
function Get-PythonBuilder { function Get-PythonBuilder {
<# <#
@@ -49,13 +50,12 @@ function Get-PythonBuilder {
#> #>
param ( param(
[version] $Version, [semver] $Version,
[string] $Architecture, [string] $Architecture,
[string] $Platform [string] $Platform
) )
$Platform = $Platform.ToLower()
if ($Platform -match 'win32') { if ($Platform -match 'win32') {
$builder = [WinPythonBuilder]::New($Version, $Architecture, $Platform) $builder = [WinPythonBuilder]::New($Version, $Architecture, $Platform)
} elseif ($Platform -match 'linux') { } elseif ($Platform -match 'linux') {
@@ -71,5 +71,5 @@ function Get-PythonBuilder {
} }
### Create Python builder instance, and build artifact ### Create Python builder instance, and build artifact
$Builder = Get-PythonBuilder -Version $Version -Architecture $Architecture -Platform $Platform $Builder = Get-PythonBuilder -Version $Version -Architecture $Architecture -Platform $Platform
$Builder.Build() $Builder.Build()

View File

@@ -17,7 +17,7 @@ class macOSPythonBuilder : NixPythonBuilder {
#> #>
macOSPythonBuilder( macOSPythonBuilder(
[version] $version, [semver] $version,
[string] $architecture, [string] $architecture,
[string] $platform [string] $platform
) : Base($version, $architecture, $platform) { } ) : Base($version, $architecture, $platform) { }
@@ -40,10 +40,10 @@ class macOSPythonBuilder : NixPythonBuilder {
### and then add the appropriate paths for the header and library files to configure command. ### and then add the appropriate paths for the header and library files to configure command.
### Link to documentation (https://cpython-devguide.readthedocs.io/setup/#build-dependencies) ### Link to documentation (https://cpython-devguide.readthedocs.io/setup/#build-dependencies)
if ($this.Version -lt "3.7.0") { if ($this.Version -lt "3.7.0") {
$env:LDFLAGS = "-L$(brew --prefix openssl)/lib" $env:LDFLAGS = "-L/usr/local/opt/openssl@1.1/lib"
$env:CFLAGS = "-I$(brew --prefix openssl)/include" $env:CFLAGS = "-I/usr/local/opt/openssl@1.1/include"
} else { } else {
$configureString += " --with-openssl=/usr/local/opt/openssl" $configureString += " --with-openssl=/usr/local/opt/openssl@1.1"
} }
### Compile with support of loadable sqlite extensions. Unavailable for Python 2.* ### Compile with support of loadable sqlite extensions. Unavailable for Python 2.*

View File

@@ -33,13 +33,12 @@ class NixPythonBuilder : PythonBuilder {
[string] $OutputArtifactName [string] $OutputArtifactName
NixPythonBuilder( NixPythonBuilder(
[version] $version, [semver] $version,
[string] $architecture, [string] $architecture,
[string] $platform [string] $platform
) : Base($version, $architecture, $platform) { ) : Base($version, $architecture, $platform) {
$this.InstallationTemplateName = "nix-setup-template.sh" $this.InstallationTemplateName = "nix-setup-template.sh"
$this.InstallationScriptName = "setup.sh" $this.InstallationScriptName = "setup.sh"
$this.OutputArtifactName = "python-$Version-$Platform-$Architecture.tar.gz" $this.OutputArtifactName = "python-$Version-$Platform-$Architecture.tar.gz"
} }
@@ -50,8 +49,10 @@ class NixPythonBuilder : PythonBuilder {
#> #>
$base = $this.GetBaseUri() $base = $this.GetBaseUri()
$versionName = $this.GetBaseVersion()
$nativeVersion = Convert-Version -version $this.Version
return "${base}/$($this.Version)/Python-$($this.Version).tgz" return "${base}/${versionName}/Python-${nativeVersion}.tgz"
} }
[string] GetPythonBinary() { [string] GetPythonBinary() {
@@ -95,9 +96,7 @@ class NixPythonBuilder : PythonBuilder {
$installationTemplateContent = Get-Content -Path $installationTemplateLocation -Raw $installationTemplateContent = Get-Content -Path $installationTemplateLocation -Raw
$variablesToReplace = @{ $variablesToReplace = @{
"{{__VERSION_MAJOR__}}" = $this.Version.Major; "{{__VERSION_FULL__}}" = $this.Version;
"{{__VERSION_MINOR__}}" = $this.Version.Minor;
"{{__VERSION_BUILD__}}" = $this.Version.Build;
} }
$variablesToReplace.keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent.Replace($_, $variablesToReplace[$_]) } $variablesToReplace.keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent.Replace($_, $variablesToReplace[$_]) }

View File

@@ -29,7 +29,7 @@ class PythonBuilder {
#> #>
[version] $Version [semver] $Version
[string] $Architecture [string] $Architecture
[string] $Platform [string] $Platform
[string] $HostedToolcacheLocation [string] $HostedToolcacheLocation
@@ -38,17 +38,17 @@ class PythonBuilder {
[string] $ArtifactFolderLocation [string] $ArtifactFolderLocation
[string] $InstallationTemplatesLocation [string] $InstallationTemplatesLocation
PythonBuilder ([version] $version, [string] $architecture, [string] $platform) { PythonBuilder ([semver] $version, [string] $architecture, [string] $platform) {
$this.Version = $version $this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers"
$this.Architecture = $architecture
$this.Platform = $platform
$this.HostedToolcacheLocation = $env:AGENT_TOOLSDIRECTORY $this.HostedToolcacheLocation = $env:AGENT_TOOLSDIRECTORY
$this.TempFolderLocation = $env:BUILD_SOURCESDIRECTORY $this.TempFolderLocation = $env:BUILD_SOURCESDIRECTORY
$this.WorkFolderLocation = $env:BUILD_BINARIESDIRECTORY $this.WorkFolderLocation = $env:BUILD_BINARIESDIRECTORY
$this.ArtifactFolderLocation = $env:BUILD_STAGINGDIRECTORY $this.ArtifactFolderLocation = $env:BUILD_STAGINGDIRECTORY
$this.InstallationTemplatesLocation = Join-Path -Path $PSScriptRoot -ChildPath "../installers" $this.Version = $version
$this.Architecture = $architecture
$this.Platform = $platform
} }
[uri] GetBaseUri() { [uri] GetBaseUri() {
@@ -79,11 +79,21 @@ class PythonBuilder {
return "$pythonToolcacheLocation/$($this.Version)/$($this.Architecture)" return "$pythonToolcacheLocation/$($this.Version)/$($this.Architecture)"
} }
[string] GetBaseVersion() {
<#
.SYNOPSIS
Return Major.Minor.Patch version string.
#>
return "$($this.Version.Major).$($this.Version.Minor).$($this.Version.Patch)"
}
[void] PreparePythonToolcacheLocation() { [void] PreparePythonToolcacheLocation() {
<# <#
.SYNOPSIS .SYNOPSIS
Prepare system hostedtoolcache folder for new Python version. Prepare system hostedtoolcache folder for new Python version.
#> #>
$pythonBinariesLocation = $this.GetFullPythonToolcacheLocation() $pythonBinariesLocation = $this.GetFullPythonToolcacheLocation()
if (Test-Path $pythonBinariesLocation) { if (Test-Path $pythonBinariesLocation) {

View File

@@ -0,0 +1,45 @@
function Convert-Label() {
<#
.SYNOPSIS
Convert generic semver label to native Python label.
#>
param(
[Parameter(Mandatory)]
[string] $label
)
switch ($label) {
"alpha" { return "a" }
"beta" { return "b" }
"rc" { return "rc" }
default { throw "Invalid version label '$label'" }
}
}
function Convert-Version {
<#
.SYNOPSIS
Convert generic semver version to native Python version.
#>
param(
[Parameter(Mandatory)]
[semver] $version,
[char] $delimiter = "."
)
$nativeVersion = "{0}.{1}.{2}" -f $version.Major, $version.Minor, $version.Patch
if ($version.PreReleaseLabel)
{
$preReleaseLabel = $version.PreReleaseLabel.Split($delimiter)
$preReleaseLabelName = Convert-Label -Label $preReleaseLabel[0]
$preReleaseLabelVersion = $preReleaseLabel[1]
$nativeVersion += "${preReleaseLabelName}${preReleaseLabelVersion}"
}
return $nativeVersion
}

View File

@@ -17,7 +17,7 @@ class UbuntuPythonBuilder : NixPythonBuilder {
#> #>
UbuntuPythonBuilder( UbuntuPythonBuilder(
[version] $version, [semver] $version,
[string] $architecture, [string] $architecture,
[string] $platform [string] $platform
) : Base($version, $architecture, $platform) { } ) : Base($version, $architecture, $platform) { }
@@ -68,6 +68,7 @@ class UbuntuPythonBuilder : NixPythonBuilder {
} else { } else {
$tkinterInstallString = "sudo apt install -y python-tk tk-dev" $tkinterInstallString = "sudo apt install -y python-tk tk-dev"
} }
Execute-Command -Command $tkinterInstallString Execute-Command -Command $tkinterInstallString
### Install dependent packages ### Install dependent packages

View File

@@ -27,7 +27,7 @@ class WinPythonBuilder : PythonBuilder {
[string] $OutputArtifactName [string] $OutputArtifactName
WinPythonBuilder( WinPythonBuilder(
[version] $version, [semver] $version,
[string] $architecture, [string] $architecture,
[string] $platform [string] $platform
) : Base($version, $architecture, $platform) { ) : Base($version, $architecture, $platform) {
@@ -72,10 +72,12 @@ class WinPythonBuilder : PythonBuilder {
#> #>
$base = $this.GetBaseUri() $base = $this.GetBaseUri()
$versionName = $this.GetBaseVersion()
$nativeVersion = Convert-Version -version $this.Version
$architecture = $this.GetArchitectureExtension() $architecture = $this.GetArchitectureExtension()
$extension = $this.GetPythonExtension() $extension = $this.GetPythonExtension()
$uri = "${base}/$($this.Version)/python-$($this.Version)${architecture}${extension}" $uri = "${base}/${versionName}/python-${nativeVersion}${architecture}${extension}"
return $uri return $uri
} }

View File

@@ -1,8 +1,8 @@
{ {
"regex": "python-\\d+\\.\\d+\\.\\d+-(\\w+)-([\\w\\.]+)?-?(x\\d+)", "regex": "python-\\d+\\.\\d+\\.\\d+-(\\w+\\.\\d+)?-?(\\w+)-(\\d+\\.\\d+)?-?(x\\d+)",
"groups": { "groups": {
"arch": 3, "arch": 4,
"platform": 1, "platform": 2,
"platform_version": 2 "platform_version": 3
} }
} }

Submodule helpers updated: 350e2888aa...f8f76caff1

View File

@@ -1,13 +1,12 @@
set -e set -e
MAJOR_VERSION="{{__VERSION_MAJOR__}}" PYTHON_FULL_VERSION="{{__VERSION_FULL__}}"
MINOR_VERSION="{{__VERSION_MINOR__}}" MAJOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 1)
BUILD_VERSION="{{__VERSION_BUILD__}}" MINOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 2)
PYTHON_MAJOR=python$MAJOR_VERSION PYTHON_MAJOR=python$MAJOR_VERSION
PYTHON_MAJOR_DOT_MINOR=python$MAJOR_VERSION.$MINOR_VERSION PYTHON_MAJOR_DOT_MINOR=python$MAJOR_VERSION.$MINOR_VERSION
PYTHON_MAJORMINOR=python$MAJOR_VERSION$MINOR_VERSION PYTHON_MAJORMINOR=python$MAJOR_VERSION$MINOR_VERSION
PYTHON_FULL_VERSION=$MAJOR_VERSION.$MINOR_VERSION.$BUILD_VERSION
if [ -z ${AGENT_TOOLSDIRECTORY+x} ]; then if [ -z ${AGENT_TOOLSDIRECTORY+x} ]; then
# No AGENT_TOOLSDIRECTORY on GitHub images # No AGENT_TOOLSDIRECTORY on GitHub images

View File

@@ -1,10 +1,9 @@
[String] $Architecture = "{{__ARCHITECTURE__}}" [String] $Architecture = "{{__ARCHITECTURE__}}"
[Version] $Version = "{{__VERSION__}}" [String] $Version = "{{__VERSION__}}"
[String] $PythonExecName = "{{__PYTHON_EXEC_NAME__}}" [String] $PythonExecName = "{{__PYTHON_EXEC_NAME__}}"
function Get-RegistryVersionFilter { function Get-RegistryVersionFilter {
param param(
(
[Parameter(Mandatory)][String] $Architecture, [Parameter(Mandatory)][String] $Architecture,
[Parameter(Mandatory)][Int32] $MajorVersion, [Parameter(Mandatory)][Int32] $MajorVersion,
[Parameter(Mandatory)][Int32] $MinorVersion [Parameter(Mandatory)][Int32] $MinorVersion
@@ -12,20 +11,15 @@ function Get-RegistryVersionFilter {
$archFilter = if ($Architecture -eq 'x86') { "32-bit" } else { "64-bit" } $archFilter = if ($Architecture -eq 'x86') { "32-bit" } else { "64-bit" }
### Python 2.7 x86 have no architecture postfix ### Python 2.7 x86 have no architecture postfix
if (($Architecture -eq "x86") -and ($MajorVersion -eq 2)) if (($Architecture -eq "x86") -and ($MajorVersion -eq 2)) {
{
"Python $MajorVersion.$MinorVersion.\d+$" "Python $MajorVersion.$MinorVersion.\d+$"
} } else {
else
{
"Python $MajorVersion.$MinorVersion.*($archFilter)" "Python $MajorVersion.$MinorVersion.*($archFilter)"
} }
} }
function Remove-RegistryEntries function Remove-RegistryEntries {
{ param(
param
(
[Parameter(Mandatory)][String] $Architecture, [Parameter(Mandatory)][String] $Architecture,
[Parameter(Mandatory)][Int32] $MajorVersion, [Parameter(Mandatory)][Int32] $MajorVersion,
[Parameter(Mandatory)][Int32] $MinorVersion [Parameter(Mandatory)][Int32] $MinorVersion
@@ -35,10 +29,8 @@ function Remove-RegistryEntries
$regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products" $regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"
$regKeys = Get-ChildItem -Path Registry::$regPath -Recurse | Where-Object Property -Ccontains DisplayName $regKeys = Get-ChildItem -Path Registry::$regPath -Recurse | Where-Object Property -Ccontains DisplayName
foreach ($key in $regKeys) foreach ($key in $regKeys) {
{ if ($key.getValue("DisplayName") -match $versionFilter) {
if ($key.getValue("DisplayName") -match $versionFilter)
{
Remove-Item -Path $key.PSParentPath -Recurse -Force -Verbose Remove-Item -Path $key.PSParentPath -Recurse -Force -Verbose
} }
} }
@@ -63,40 +55,34 @@ function Remove-RegistryEntries
} }
function Get-ExecParams { function Get-ExecParams {
param param(
(
[Parameter(Mandatory)][Boolean] $IsMSI, [Parameter(Mandatory)][Boolean] $IsMSI,
[Parameter(Mandatory)][String] $PythonArchPath [Parameter(Mandatory)][String] $PythonArchPath
) )
if ($IsMSI) if ($IsMSI) {
{
"TARGETDIR=$PythonArchPath ALLUSERS=1" "TARGETDIR=$PythonArchPath ALLUSERS=1"
} } else {
else
{
"DefaultAllUsersTargetDir=$PythonArchPath InstallAllUsers=1" "DefaultAllUsersTargetDir=$PythonArchPath InstallAllUsers=1"
} }
} }
$ToolcacheRoot = $env:AGENT_TOOLSDIRECTORY $ToolcacheRoot = $env:AGENT_TOOLSDIRECTORY
if ([string]::IsNullOrEmpty($ToolcacheRoot)) if ([string]::IsNullOrEmpty($ToolcacheRoot)) {
{
# GitHub images don't have `AGENT_TOOLSDIRECTORY` variable # GitHub images don't have `AGENT_TOOLSDIRECTORY` variable
$ToolcacheRoot = $env:RUNNER_TOOL_CACHE $ToolcacheRoot = $env:RUNNER_TOOL_CACHE
} }
$PythonToolcachePath = Join-Path -Path $ToolcacheRoot -ChildPath "Python" $PythonToolcachePath = Join-Path -Path $ToolcacheRoot -ChildPath "Python"
$PythonVersionPath = Join-Path -Path $PythonToolcachePath -ChildPath $Version.ToString() $PythonVersionPath = Join-Path -Path $PythonToolcachePath -ChildPath $Version
$PythonArchPath = Join-Path -Path $PythonVersionPath -ChildPath $Architecture $PythonArchPath = Join-Path -Path $PythonVersionPath -ChildPath $Architecture
$IsMSI = $PythonExecName -match "msi" $IsMSI = $PythonExecName -match "msi"
$MajorVersion = $Version.Major $MajorVersion = $Version.Split('.')[0]
$MinorVersion = $Version.Minor $MinorVersion = $Version.Split('.')[1]
Write-Host "Check if Python hostedtoolcache folder exist..." Write-Host "Check if Python hostedtoolcache folder exist..."
if (-Not (Test-Path $PythonToolcachePath)) if (-Not (Test-Path $PythonToolcachePath)) {
{
Write-Host "Create Python toolcache folder" Write-Host "Create Python toolcache folder"
New-Item -ItemType Directory -Path $PythonToolcachePath | Out-Null New-Item -ItemType Directory -Path $PythonToolcachePath | Out-Null
} }
@@ -104,22 +90,17 @@ if (-Not (Test-Path $PythonToolcachePath))
Write-Host "Check if current Python version is installed..." Write-Host "Check if current Python version is installed..."
$InstalledVersions = Get-Item "$PythonToolcachePath\$MajorVersion.$MinorVersion.*\$Architecture" $InstalledVersions = Get-Item "$PythonToolcachePath\$MajorVersion.$MinorVersion.*\$Architecture"
if ($null -ne $InstalledVersions) if ($null -ne $InstalledVersions) {
{
Write-Host "Python$MajorVersion.$MinorVersion ($Architecture) was found in $PythonToolcachePath..." Write-Host "Python$MajorVersion.$MinorVersion ($Architecture) was found in $PythonToolcachePath..."
foreach ($InstalledVersion in $InstalledVersions) foreach ($InstalledVersion in $InstalledVersions) {
{ if (Test-Path -Path $InstalledVersion) {
if (Test-Path -Path $InstalledVersion)
{
Write-Host "Deleting $InstalledVersion..." Write-Host "Deleting $InstalledVersion..."
Remove-Item -Path $InstalledVersion -Recurse -Force Remove-Item -Path $InstalledVersion -Recurse -Force
Remove-Item -Path "$($InstalledVersion.Parent.FullName)/${Architecture}.complete" -Force -Verbose Remove-Item -Path "$($InstalledVersion.Parent.FullName)/${Architecture}.complete" -Force -Verbose
} }
} }
} } else {
else
{
Write-Host "No Python$MajorVersion.$MinorVersion.* found" Write-Host "No Python$MajorVersion.$MinorVersion.* found"
} }
@@ -136,8 +117,7 @@ Write-Host "Install Python $Version in $PythonToolcachePath..."
$ExecParams = Get-ExecParams -IsMSI $IsMSI -PythonArchPath $PythonArchPath $ExecParams = Get-ExecParams -IsMSI $IsMSI -PythonArchPath $PythonArchPath
cmd.exe /c "cd $PythonArchPath && call $PythonExecName $ExecParams /quiet" cmd.exe /c "cd $PythonArchPath && call $PythonExecName $ExecParams /quiet"
if ($LASTEXITCODE -ne 0) if ($LASTEXITCODE -ne 0) {
{
Throw "Error happened during Python installation" Throw "Error happened during Python installation"
} }

View File

@@ -0,0 +1,44 @@
Import-Module (Join-Path $PSScriptRoot "../helpers/packages-generation/manifest-utils.psm1")
$ConfigurationFile = Join-Path $PSScriptRoot "../config/python-manifest-config.json"
$Configuration = Read-ConfigurationFile -Filepath $ConfigurationFile
$stableTestCases = @(
@{ ReleaseName = "python-3.8.3-darwin-x64.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64"} },
@{ ReleaseName = "python-3.8.3-linux-16.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "16.04"; arch = "x64"} },
@{ ReleaseName = "python-3.8.3-linux-18.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "18.04"; arch = "x64"} },
@{ ReleaseName = "python-3.8.3-linux-20.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64"} },
@{ ReleaseName = "python-3.8.3-win32-x64.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64"} },
@{ ReleaseName = "python-3.8.3-win32-x86.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86"} }
) | ForEach-Object { $_.Configuration = $Configuration; $_ }
$unstableTestCases = @(
@{ ReleaseName = "python-3.9.0-alpha.2-darwin-x64.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64"} },
@{ ReleaseName = "python-3.9.0-beta.1-linux-16.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "16.04"; arch = "x64"} },
@{ ReleaseName = "python-3.9.0-rc.4-linux-18.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "18.04"; arch = "x64"} },
@{ ReleaseName = "python-3.9.0-beta.2-linux-20.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64"} },
@{ ReleaseName = "python-3.9.0-beta.2-win32-x64.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64"} },
@{ ReleaseName = "python-3.9.0-beta.2-win32-x86.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86"} }
) | ForEach-Object { $_.Configuration = $Configuration; $_ }
Describe "Python manifest config" {
Context "Stable versions" {
It "<ReleaseName>" -TestCases $stableTestCases {
$Release = @{ name = $ReleaseName }
$asset = New-AssetItem -ReleaseAsset $Release -Configuration $Configuration
$asset.platform | Should -Be $ExpectedResult.platform
$asset.platform_version | Should -Be $ExpectedResult.platform_version
$asset.arch | Should -Be $ExpectedResult.arch
}
}
Context "Prerelease versions" {
It "<ReleaseName>" -TestCases $unstableTestCases {
$Release = @{ name = $ReleaseName }
$asset = New-AssetItem -ReleaseAsset $Release -Configuration $Configuration
$asset.platform | Should -Be $ExpectedResult.platform
$asset.platform_version | Should -Be $ExpectedResult.platform_version
$asset.arch | Should -Be $ExpectedResult.arch
}
}
}

View File

@@ -1,12 +1,13 @@
param ( param (
[Version] [Parameter (Mandatory = $true)] [ValidateNotNullOrEmpty()] [semver] [Parameter (Mandatory = $true)] [ValidateNotNullOrEmpty()]
$Version, $Version,
[String] [Parameter (Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] [Parameter (Mandatory = $true)] [ValidateNotNullOrEmpty()]
$Platform $Platform
) )
Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1") Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1")
Import-Module (Join-Path $PSScriptRoot "../helpers/common-helpers.psm1") Import-Module (Join-Path $PSScriptRoot "../helpers/common-helpers.psm1")
Import-Module (Join-Path $PSScriptRoot "../builders/python-version.psm1")
function Analyze-MissingModules([string] $buildOutputLocation) { function Analyze-MissingModules([string] $buildOutputLocation) {
$searchStringStart = "Failed to build these modules:" $searchStringStart = "Failed to build these modules:"
@@ -47,6 +48,11 @@ Describe "Tests" {
} }
} }
It "Run pip" {
"pip install requests" | Should -ReturnZeroExitCode
"pip uninstall requests -y" | Should -ReturnZeroExitCode
}
if (IsNixPlatform $Platform) { if (IsNixPlatform $Platform) {
It "Check for failed modules in build_output" { It "Check for failed modules in build_output" {
@@ -59,7 +65,8 @@ Describe "Tests" {
} }
It "Check if python configuration is correct" { It "Check if python configuration is correct" {
"python ./sources/python-config-test.py" | Should -ReturnZeroExitCode $nativeVersion = Convert-Version -version $Version
"python ./sources/python-config-test.py $Version $nativeVersion" | Should -ReturnZeroExitCode
} }
It "Check if shared libraries are linked correctly" { It "Check if shared libraries are linked correctly" {

View File

@@ -1,4 +1,5 @@
import distutils.sysconfig import distutils.sysconfig
from distutils.version import StrictVersion
import sysconfig import sysconfig
import sys import sys
import platform import platform
@@ -6,7 +7,8 @@ import os
# Define variables # Define variables
os_type = platform.system() os_type = platform.system()
version = sys.version.split(" ")[0] version = sys.argv[1]
nativeVersion = sys.argv[2]
lib_dir_path = sysconfig.get_config_var('LIBDIR') lib_dir_path = sysconfig.get_config_var('LIBDIR')
ld_library_name = sysconfig.get_config_var('LDLIBRARY') ld_library_name = sysconfig.get_config_var('LDLIBRARY')
@@ -41,7 +43,7 @@ else:
### Validate macOS ### Validate macOS
if os_type == 'Darwin': if os_type == 'Darwin':
### Validate openssl links ### Validate openssl links
if version < "3.7.0": if StrictVersion(nativeVersion) < StrictVersion("3.7.0"):
expected_ldflags = '-L/usr/local/opt/openssl@1.1/lib' expected_ldflags = '-L/usr/local/opt/openssl@1.1/lib'
ldflags = sysconfig.get_config_var('LDFLAGS') ldflags = sysconfig.get_config_var('LDFLAGS')
@@ -49,8 +51,8 @@ if os_type == 'Darwin':
print('Invalid ldflags: %s; Expected: %s' % (ldflags, expected_ldflags)) print('Invalid ldflags: %s; Expected: %s' % (ldflags, expected_ldflags))
exit(1) exit(1)
else: else:
expected_openssl_includes = '-I/usr/local/opt/openssl/include' expected_openssl_includes = '-I/usr/local/opt/openssl@1.1/include'
expected_openssl_ldflags ='-L/usr/local/opt/openssl/lib' expected_openssl_ldflags ='-L/usr/local/opt/openssl@1.1/lib'
openssl_includes = sysconfig.get_config_var('OPENSSL_INCLUDES') openssl_includes = sysconfig.get_config_var('OPENSSL_INCLUDES')
openssl_ldflags = sysconfig.get_config_var('OPENSSL_LDFLAGS') openssl_ldflags = sysconfig.get_config_var('OPENSSL_LDFLAGS')

View File

@@ -139,6 +139,7 @@ standard_library = [
'sre_constants', 'sre_constants',
'sre_parse', 'sre_parse',
'ssl', 'ssl',
'_ssl',
'stat', 'stat',
'string', 'string',
'stringprep', 'stringprep',
@@ -251,6 +252,14 @@ if sys.version_info >= (3, 7):
if sys.version_info > (3, 7): if sys.version_info > (3, 7):
standard_library.remove('macpath') standard_library.remove('macpath')
# 'dummy_threading' module has been removed from Python 3.9
if sys.version_info > (3, 8):
standard_library.remove('dummy_threading')
# 'symbol' module has been removed from Python 3.10
if sys.version_info >= (3, 10):
standard_library.remove('symbol')
# 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