Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Build WinPython for 2026-01 Cycle #34

Build WinPython for 2026-01 Cycle

Build WinPython for 2026-01 Cycle #34

name: Build WinPython for 2026-01 Cycle
on:
workflow_dispatch:
inputs:
python_versionf:
description: 'Python version to build (3.13, 3.14, 3.14F or 3.15)'
required: true
default: '3.14'
type: choice
options:
- '3.13'
- '3.14'
- '3.14F'
- '3.15'
env:
# === Global Configuration ===
WINPYARCH: "64"
my_cycle: "winpython/portable/cycle_2026_01"
my_release_level: "b0"
dotwheelhouse: "dotpython\\wheelhouse\\included.wheels"
pandoc_source: "https://github.com/jgm/pandoc/releases/download/3.1.9/pandoc-3.1.9-windows-x86_64.zip"
pandoc_sha256: "11eb6dbe5286c9e5edb0cca4412e7d99ec6578ec04158b0b7fe11f7fd96688e5"
jobs:
build-winpython:
runs-on: windows-latest
strategy:
fail-fast: true
matrix:
flavor:
- name: "dot"
REQUIREMENTS_313: "requir.64-3_13_11_1dotb0.txt"
REQUIREMENTS_314: "requir.64-3_14_2_1dotb0.txt"
REQUIREMENTS_315: "requir.64-3_15_0_1dotb0.txt"
REQUIREMENTS_WHL_313: ""
REQUIREMENTS_WHL_314: ""
REQUIREMENTS_WHL_315: ""
formats: { zip: true, 7z: false, exe: true }
PANDOC: "0"
WINPYARCHDET: "64"
- name: "slim"
REQUIREMENTS_313: "requir.64-3_13_11_1slimb0.txt"
REQUIREMENTS_314: "requir.64-3_14_2_1slimb0.txt"
REQUIREMENTS_315: ""
REQUIREMENTS_WHL_313: ""
REQUIREMENTS_WHL_314: ""
REQUIREMENTS_WHL_315: ""
formats: { zip: false, 7z: true, exe: true }
PANDOC: "1"
WINPYARCHDET: "64"
- name: "whl"
REQUIREMENTS_313: "requir.64-3_13_11_1dotb0.txt"
REQUIREMENTS_314: "requir.64-3_14_2_1dotb0.txt"
REQUIREMENTS_315: ""
REQUIREMENTS_WHL_313: "requir.64-3_13_11_1whl_wheelsb0.txt"
REQUIREMENTS_WHL_314: "requir.64-3_14_2_1whl_wheelsb0.txt"
REQUIREMENTS_WHL_315: ""
formats: { zip: false, 7z: true, exe: false }
PANDOC: "0"
WINPYARCHDET: "64"
- name: "free"
REQUIREMENTS_313: ""
REQUIREMENTS_314: "requir.64-3_14_2_1freeb0.txt"
REQUIREMENTS_315: ""
REQUIREMENTS_WHL_313: ""
REQUIREMENTS_WHL_314: ""
REQUIREMENTS_WHL_315: ""
formats: { zip: true, 7z: false, exe: true }
PANDOC: "0"
WINPYARCHDET: "64F"
- name: "slimf"
REQUIREMENTS_313: ""
REQUIREMENTS_314: "requir.64-3_14_2_1slimfb0.txt"
REQUIREMENTS_315: ""
REQUIREMENTS_WHL_313: ""
REQUIREMENTS_WHL_314: ""
REQUIREMENTS_WHL_315: ""
formats: { zip: false, 7z: true, exe: true }
PANDOC: "1"
WINPYARCHDET: "64F"
env:
PYTHON_VERSIONF: ${{ github.event.inputs.python_versionf }}
WINPYFLAVOR: ${{ matrix.flavor.name }}
PANDOC: ${{ matrix.flavor.PANDOC }}
WINPYARCHDET: ${{ matrix.flavor.WINPYARCHDET }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set Python version configuration
id: python_config
shell: bash
run: |
case "${{ github.event.inputs.python_versionf }}" in
"3.13")
echo "ver2=3.13.11.1" >> $GITHUB_OUTPUT
echo "v_tag=3_13_11_1" >> $GITHUB_OUTPUT
echo "src=https://github.com/astral-sh/python-build-standalone/releases/download/20251205/cpython-3.13.11+20251205-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" >> $GITHUB_OUTPUT
echo "sha=d8a2b5e05ef71fc71f048a6f409d69b940bc5d33da8b112611cfba68fc5b86c3" >> $GITHUB_OUTPUT
;;
"3.14")
echo "ver2=3.14.2.1" >> $GITHUB_OUTPUT
echo "v_tag=3_14_2_1" >> $GITHUB_OUTPUT
echo "src=https://github.com/astral-sh/python-build-standalone/releases/download/20251205/cpython-3.14.2+20251205-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" >> $GITHUB_OUTPUT
echo "sha=512744d8a86dc6042a712035ada5d87c5e2ce4218f5dbdc74d039cee46e76fb4" >> $GITHUB_OUTPUT
;;
"3.14F")
echo "ver2=3.14.2.1" >> $GITHUB_OUTPUT
echo "v_tag=3_14_2_1" >> $GITHUB_OUTPUT
echo "src=https://github.com/astral-sh/python-build-standalone/releases/download/20251205/cpython-3.14.2+20251205-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst" >> $GITHUB_OUTPUT
echo "sha=536cf813857ea566fcfae18a1b7dbcd185385f1dc1f04d5a0951bad235c8fc61" >> $GITHUB_OUTPUT
;;
"3.15")
echo "ver2=3.15.0.1" >> $GITHUB_OUTPUT
echo "v_tag=3_15_0_1" >> $GITHUB_OUTPUT
echo "src=https://github.com/astral-sh/python-build-standalone/releases/download/20251217/cpython-3.15.0a3+20251217-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" >> $GITHUB_OUTPUT
echo "sha=4cac37170050bb402eaabad84e7ceb4679ec8ffaf43fbea71d62651ca761dcd7" >> $GITHUB_OUTPUT
;;
esac
- name: Set static and matrix variables based on selected Python version
shell: bash
env:
PYTHON_VERSIONF: ${{ env.PYTHON_VERSIONF }}
WINPYARCHDET: ${{ env.WINPYARCHDET }}
WINPYVER2: ${{ steps.python_config.outputs.ver2 }}
my_cycle: ${{ env.my_cycle }}
my_release_level: ${{ env.my_release_level }}
V_TAG: ${{ steps.python_config.outputs.v_tag }}
FLAVOR_NAME: ${{ matrix.flavor.name }}
run: |
PYTHON_VERSION="${PYTHON_VERSIONF%F}" # remove trailing F if present
echo "PYTHON_VERSION=$PYTHON_VERSION" >> $GITHUB_ENV
# Compute detected arch from the input (3.14F -> 64F)
detected_arch="64"
if [[ "$PYTHON_VERSIONF" == *F ]]; then
detected_arch="64F"
fi
# compute build_location from WINPYVER2 (remove dots)
WINPYVER2="${WINPYVER2:-}"
BUILD_LOCATION="WPy64-${WINPYVER2//./}"
echo "build_location=$BUILD_LOCATION" >> $GITHUB_ENV
WINPYREQUIREMENTS=""
WINPYREQUIREMENTSwhl=""
testreq="${my_cycle}/requir.64-${V_TAG}${FLAVOR_NAME}${my_release_level}.txt"
testwhl="${my_cycle}/requir.64-${V_TAG}${FLAVOR_NAME}_wheels${my_release_level}.txt"
echo "is $WINPYARCHDET=$detected_arch , search $testreq $testwhl $detected_arch"
if [ "$WINPYARCHDET" = "$detected_arch" ] && [[ -f "$testreq" ]] ; then
WINPYREQUIREMENTS="$testreq"
echo "Found $WINPYREQUIREMENTS"
if [[ -f "$testwhl" ]]; then
"WINPYREQUIREMENTSwhl=$testwhl"
echo "Found also $WINPYREQUIREMENTSwhl"
fi
fi
echo "WINPYREQUIREMENTS=$WINPYREQUIREMENTS" >> $GITHUB_ENV
echo "WINPYREQUIREMENTSwhl=$WINPYREQUIREMENTSwhl" >> $GITHUB_ENV
# Populate generic per-flavor / per-version selections using matrix-expanded values
#elif [ "$PYTHON_VERSION" = "3.13" ]; then
# echo "WINPYREQUIREMENTS=$my_cycle/${{ matrix.flavor.REQUIREMENTS_313 }}" >> $GITHUB_ENV
# echo "WINPYREQUIREMENTSwhl=$my_cycle/${{ matrix.flavor.REQUIREMENTS_WHL_313 }}" >> $GITHUB_ENV
#elif [ "$PYTHON_VERSION" = "3.14" ] && [ "$WINPYARCHDET" = "$detected_arch" ]; then
# echo "WINPYREQUIREMENTS=$my_cycle/${{ matrix.flavor.REQUIREMENTS_314 }}" >> $GITHUB_ENV
# echo "WINPYREQUIREMENTSwhl=$my_cycle/${{ matrix.flavor.REQUIREMENTS_WHL_314 }}" >> $GITHUB_ENV
#elif [ "$PYTHON_VERSION" = "3.15" ]; then
# echo "WINPYREQUIREMENTS=$my_cycle/${{ matrix.flavor.REQUIREMENTS_315 }}" >> $GITHUB_ENV
# echo "WINPYREQUIREMENTSwhl=$my_cycle/${{ matrix.flavor.REQUIREMENTS_WHL_315 }}" >> $GITHUB_ENV
#fi
# write common flavor env vars derived here rather than in the job env block
ARTIFACT_NAME="publish_${PYTHON_VERSION}${FLAVOR_NAME}"
echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV
echo "destwheelhouse=${BUILD_LOCATION}\\wheelhouse\\included.wheels" >> $GITHUB_ENV
WINPYVER="${WINPYVER2}${FLAVOR_NAME}${{ env.my_release_level }}"
echo "WINPYVER=$WINPYVER" >> $GITHUB_ENV
# Store WINPYVER2 in env for later steps
echo "WINPYVER2=$WINPYVER2" >> $GITHUB_ENV
- name: Download, verify and extract python standalone
if: env.WINPYREQUIREMENTS != ''
uses: ./.github/actions/python-setup
with:
python_source: ${{ steps.python_config.outputs.src }}
python_sha256: ${{ steps.python_config.outputs.sha }}
build_location: ${{ env.build_location }}
- name: Download, checking hash and integrating pandoc binary
if: env.WINPYREQUIREMENTS != '' && env.PANDOC == '1'
uses: ./.github/actions/pandoc-setup
with:
pandoc_source: ${{ env.pandoc_source }}
pandoc_sha256: ${{ env.pandoc_sha256 }}
build_location: ${{ env.build_location }}
- name: Upgrade pip and patch launchers
if: env.WINPYREQUIREMENTS != ''
shell: pwsh
run: |
& "$env:build_location\python\python.exe" -m pip install --upgrade --force-reinstall pip
& "$env:build_location\python\python.exe" -m pip install --upgrade packaging==25.0
& "$env:build_location\python\python.exe" -c "from wppm import wppm;dist=wppm.Distribution();dist.patch_standard_packages('pip', to_movable=True)"
- name: Download all requirements
if: ${{ env.WINPYREQUIREMENTS != '' }}
shell: pwsh
run: |
$py = "$env:build_location\python\python.exe"
& $py -m pip download --dest $env:dotwheelhouse --no-deps --require-hashes -r $env:WINPYREQUIREMENTS
if ($env:WINPYREQUIREMENTSwhl -ne '') {
& $py -m pip download --dest $env:destwheelhouse --no-deps --require-hashes -r $env:WINPYREQUIREMENTSwhl
}
- name: Install requirements
if: env.WINPYREQUIREMENTS != ''
shell: pwsh
run: |
& "$env:build_location\python\python.exe" -m pip install --no-deps --no-index --trusted-host=None --find-links=$env:dotwheelhouse --require-hashes -r $env:WINPYREQUIREMENTS
- name: Generate Assets and Hashes
if: env.WINPYREQUIREMENTS != ''
uses: ./.github/actions/publish-winpython
with:
build_location: ${{ env.build_location }}
winpy_flavor: ${{ env.WINPYFLAVOR }}
winpy_arch: ${{ env.WINPYARCH }}
winpy_ver: ${{ env.WINPYVER }}
winpy_ver2: ${{ env.WINPYVER2 }}
dotwheelhouse: ${{ env.dotwheelhouse }}
winpy_requirements_whl: ${{ env.WINPYREQUIREMENTSwhl }}
format_zip: ${{ matrix.flavor.formats.zip }}
format_7z: ${{ matrix.flavor.formats['7z'] }}
format_exe: ${{ matrix.flavor.formats.exe }}
- name: Upload artifacts
if: env.WINPYREQUIREMENTS != ''
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: publish_output
retention-days: 66 # keeps artifact for 66 days