Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build pre-populated Python distributions #1475

Merged
merged 1 commit into from
May 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 170 additions & 0 deletions .github/workflows/build-distributions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
name: build distributions

on:
workflow_call:
inputs:
version:
required: false
type: string

defaults:
run:
shell: bash

env:
DIST_URL: "https://github.com/indygreg/python-build-standalone/releases/download"
DIST_VERSION: "20240415"
DIST_PYTHON_VERSION: "3.12.3"
PYTHONDONTWRITEBYTECODE: "1"
PIP_ONLY_BINARY: ":all:"
# Some pip environment variables are weird, this means do not compile
PIP_NO_COMPILE: "0"

jobs:
ensure-installable:
name: Ensure Hatch is installable
runs-on: ubuntu-22.04

steps:
- name: Set up Python ${{ env.DIST_PYTHON_VERSION }}
uses: actions/setup-python@v5
with:
python-version: ${{ env.DIST_PYTHON_VERSION }}

- name: Install Hatch
if: inputs.version
# Try to install the specific version of Hatch that was just released until successful
run: |-
for i in {1..20}; do
pip install hatch==${{ inputs.version }} && break || sleep 5
done

distributions-linux:
name: Distribution ${{ matrix.job.target }}
needs: ensure-installable
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
job:
- target: x86_64-unknown-linux-gnu
image: quay.io/pypa/manylinux2014_x86_64
- target: aarch64-unknown-linux-gnu
image: quay.io/pypa/manylinux_2_28_aarch64
emulation: arm64

steps:
- name: Checkout code
if: ${{ !inputs.version }}
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up QEMU
if: matrix.job.emulation
uses: docker/setup-qemu-action@v3

- name: Set up Docker container
run: >-
docker run --rm -d
--name builder
--workdir /home
--env PYTHONDONTWRITEBYTECODE
--env PIP_ONLY_BINARY
--env PIP_NO_COMPILE
--volume ${{ github.workspace }}:/home/hatch
${{ matrix.job.image }}
sleep infinity

- name: Download distribution
run: >-
docker exec builder
curl -LO
${{ env.DIST_URL }}/${{ env.DIST_VERSION }}/cpython-${{ env.DIST_PYTHON_VERSION }}+${{ env.DIST_VERSION }}-${{ matrix.job.target }}-install_only.tar.gz

- name: Unpack distribution
run: >-
docker exec builder
tar xzf cpython-${{ env.DIST_PYTHON_VERSION }}+${{ env.DIST_VERSION }}-${{ matrix.job.target }}-install_only.tar.gz

- name: Install Hatch
run: >-
docker exec builder
/home/python/bin/python -m pip install
${{ inputs.version && format('hatch=={0}', inputs.version) || '/home/hatch' }}

- name: Archive distribution
run: >-
docker exec builder
tar czf dist-${{ matrix.job.target }}.tar.gz python

- name: Move to host
run: docker cp builder:/home/dist-${{ matrix.job.target }}.tar.gz .

- name: Check original size
run: >-
docker exec builder
ls -lh cpython-${{ env.DIST_PYTHON_VERSION }}+${{ env.DIST_VERSION }}-${{ matrix.job.target }}-install_only.tar.gz

- name: Check final size
run: ls -lh dist-${{ matrix.job.target }}.tar.gz

- name: Upload archive
uses: actions/upload-artifact@v4
with:
name: distribution-${{ matrix.job.target }}
path: dist-${{ matrix.job.target }}.tar.gz

distributions-windows-macos:
name: Distribution ${{ matrix.job.target }}
needs: ensure-installable
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
- target: x86_64-pc-windows-msvc
os: windows-2019
- target: aarch64-apple-darwin
os: macos-14
- target: x86_64-apple-darwin
os: macos-12

steps:
- name: Checkout code
if: ${{ !inputs.version }}
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Download distribution
run: curl -LO ${{ env.DIST_URL }}/${{ env.DIST_VERSION }}/cpython-${{ env.DIST_PYTHON_VERSION }}+${{ env.DIST_VERSION }}-${{ matrix.job.target }}-install_only.tar.gz

- name: Unpack distribution
run: tar xzf cpython-${{ env.DIST_PYTHON_VERSION }}+${{ env.DIST_VERSION }}-${{ matrix.job.target }}-install_only.tar.gz

- name: Install Hatch
run: >-
${{ startsWith(matrix.job.os, 'windows-') && '.\\python\\python.exe' || './python/bin/python' }}
-m pip install
${{ inputs.version && format('hatch=={0}', inputs.version) || '.' }}

- name: Remove debug symbols
if: startsWith(matrix.job.os, 'windows-')
run: Get-ChildItem -Path python -Filter "*.pdb" -Recurse | Remove-Item
shell: pwsh

- name: Archive distribution
run: tar czf dist-${{ matrix.job.target }}.tar.gz python

- name: Check original size
run: ls -lh cpython-${{ env.DIST_PYTHON_VERSION }}+${{ env.DIST_VERSION }}-${{ matrix.job.target }}-install_only.tar.gz

- name: Check final size
run: ls -lh dist-${{ matrix.job.target }}.tar.gz

- name: Upload archive
uses: actions/upload-artifact@v4
with:
name: distribution-${{ matrix.job.target }}
path: dist-${{ matrix.job.target }}.tar.gz
47 changes: 45 additions & 2 deletions .github/workflows/build-hatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -440,8 +440,8 @@ jobs:
path: signed/${{ steps.pkg.outputs.path }}
if-no-files-found: error

publish:
name: Publish release
publish-project:
name: Publish release artifacts
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
needs:
- python-artifacts
Expand Down Expand Up @@ -484,3 +484,46 @@ jobs:

- name: Push Python artifacts to PyPI
uses: pypa/[email protected]

distributions-release:
name: Build release distributions
needs:
- binaries
- publish-project
if: startsWith(github.event.ref, 'refs/tags')
uses: ./.github/workflows/build-distributions.yml
with:
version: ${{ needs.binaries.outputs.version }}

distributions-dev:
name: Build development distributions
if: ${{ !startsWith(github.event.ref, 'refs/tags') }}
uses: ./.github/workflows/build-distributions.yml
# This actually does not need the binary jobs but we want to prioritize
# resources for the test jobs therefore this forces these later on
needs: binaries

publish-distributions:
name: Publish distribution artifacts
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
needs:
- distributions-release
runs-on: ubuntu-latest

permissions:
contents: write
id-token: write

steps:
- name: Download distributions
uses: actions/download-artifact@v4
with:
name: distribution-*
path: distributions
merge-multiple: true

- name: Add assets to current release
uses: softprops/action-gh-release@v2
with:
files: |-
distributions/*
Loading