diff --git a/kokoro/release/python/windows/build_artifacts.bat b/kokoro/release/python/windows/build_artifacts.bat index b2adbe03f3ffe..2a5b7b6fe1c5b 100644 --- a/kokoro/release/python/windows/build_artifacts.bat +++ b/kokoro/release/python/windows/build_artifacts.bat @@ -62,6 +62,8 @@ SET PYTHON_VERSION=3.7 SET PYTHON_ARCH=64 CALL build_single_artifact.bat || goto :error +powershell -File kokoro/release/python/windows/install_python_interpreters.ps1 + SET PYTHON=C:\python38_32bit SET PYTHON_VERSION=3.8 SET PYTHON_ARCH=32 diff --git a/kokoro/release/python/windows/install_python_interpreters.ps1 b/kokoro/release/python/windows/install_python_interpreters.ps1 new file mode 100644 index 0000000000000..b63259a829848 --- /dev/null +++ b/kokoro/release/python/windows/install_python_interpreters.ps1 @@ -0,0 +1,97 @@ +#!/usr/bin/env powershell +# Install Python 3.8 for x64 and x86 in order to build wheels on Windows. +# Originally from grpc/tools/internal_ci/helper_scripts/install_python_interpreters.ps1 + +Set-StrictMode -Version 2 +$ErrorActionPreference = 'Stop' + +trap { + $ErrorActionPreference = "Continue" + Write-Error $_ + exit 1 +} + +# Avoid "Could not create SSL/TLS secure channel" +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +function Install-Python { + Param( + [string]$PythonVersion, + [string]$PythonInstaller, + [string]$PythonInstallPath, + [string]$PythonInstallerHash + ) + $PythonInstallerUrl = "https://www.python.org/ftp/python/$PythonVersion/$PythonInstaller.exe" + $PythonInstallerPath = "C:\tools\$PythonInstaller.exe" + + # Downloads installer + Write-Host "Downloading the Python installer: $PythonInstallerUrl => $PythonInstallerPath" + Invoke-WebRequest -Uri $PythonInstallerUrl -OutFile $PythonInstallerPath + + # Validates checksum + $HashFromDownload = Get-FileHash -Path $PythonInstallerPath -Algorithm MD5 + if ($HashFromDownload.Hash -ne $PythonInstallerHash) { + throw "Invalid Python installer: failed checksum!" + } + Write-Host "Python installer $PythonInstallerPath validated." + + # Installs Python + & $PythonInstallerPath /passive InstallAllUsers=1 PrependPath=1 Include_test=0 TargetDir=$PythonInstallPath + if (-Not $?) { + throw "The Python installation exited with error!" + } + + # NOTE(lidiz) Even if the install command finishes in the script, that + # doesn't mean the Python installation is finished. If using "ps" to check + # for running processes, you might see ongoing installers at this point. + # So, we needs this "hack" to reliably validate that the Python binary is + # functioning properly. + + # Wait for the installer process + Wait-Process -Name $PythonInstaller -Timeout 300 + Write-Host "Installation process exits normally." + + # Validate Python binary + $PythonBinary = "$PythonInstallPath\python.exe" + & $PythonBinary -c 'print(42)' + Write-Host "Python binary works properly." + + # Installs pip + & $PythonBinary -m ensurepip --user + + Write-Host "Python $PythonVersion installed by $PythonInstaller at $PythonInstallPath." +} + +# Python 3.8 +$Python38x86Config = @{ + PythonVersion = "3.8.0" + PythonInstaller = "python-3.8.0" + PythonInstallPath = "C:\python38_32bit" + PythonInstallerHash = "412a649d36626d33b8ca5593cf18318c" +} +Install-Python @Python38x86Config + +$Python38x64Config = @{ + PythonVersion = "3.8.0" + PythonInstaller = "python-3.8.0-amd64" + PythonInstallPath = "C:\python38" + PythonInstallerHash = "29ea87f24c32f5e924b7d63f8a08ee8d" +} +Install-Python @Python38x64Config + +# Python 3.9 +$Python39x86Config = @{ + PythonVersion = "3.9.0" + PythonInstaller = "python-3.9.0" + PythonInstallPath = "C:\python39_32bit" + PythonInstallerHash = "4a2812db8ab9f2e522c96c7728cfcccb" +} +Install-Python @Python39x86Config + +$Python39x64Config = @{ + PythonVersion = "3.9.0" + PythonInstaller = "python-3.9.0-amd64" + PythonInstallPath = "C:\python39" + PythonInstallerHash = "b61a33dc28f13b561452f3089c87eb63" +} +Install-Python @Python39x64Config