Pass -utf8
to vswhere
(#429)
#2479
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Linux Python build | |
on: | |
push: | |
branches: [main] | |
pull_request: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
env: | |
FORCE_COLOR: 1 | |
jobs: | |
pythonbuild: | |
runs-on: depot-ubuntu-22.04 | |
steps: | |
- name: Install System Dependencies | |
run: | | |
sudo apt update | |
sudo apt install -y --no-install-recommends libssl-dev pkg-config | |
- uses: actions/checkout@v4 | |
- name: Emit rustc version | |
run: | | |
rustc --version > .rustc-version | |
- uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cargo/registry | |
~/.cargo/git | |
target | |
key: ${{ runner.os }}-pythonbuild-${{ hashFiles('Cargo.lock', '.rustc-version') }} | |
- name: Build | |
run: | | |
cargo build --release | |
- name: Upload pythonbuild Executable | |
uses: actions/upload-artifact@v4 | |
with: | |
name: pythonbuild | |
path: target/release/pythonbuild | |
image: | |
strategy: | |
fail-fast: false | |
matrix: | |
image: | |
- build | |
- build.cross | |
- gcc | |
- xcb | |
- xcb.cross | |
runs-on: depot-ubuntu-22.04 | |
permissions: | |
packages: write | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Login to GitHub Container Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Generate Dockerfiles | |
run: | | |
./build-linux.py --make-target empty | |
repo_name=$(echo "${GITHUB_REPOSITORY,,}" | sed 's|\.|_|g') | |
git_ref_name=$(echo "${GITHUB_REF_NAME,,}" | sed 's|[^a-z0-9_-]|_|g') | |
echo "REPO_NAME=${repo_name}" >> "${GITHUB_ENV}" | |
echo "GIT_REF_NAME=${git_ref_name}" >> "${GITHUB_ENV}" | |
- name: Build Image | |
id: build-image | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
file: build/${{ matrix.image }}.Dockerfile | |
labels: org.opencontainers.image.source=https://github.com/${{ env.REPO_NAME }} | |
# Cache from/to the current branch of the current repo as the primary cache key. | |
# Cache from the default branch of the current repo so branches can have cache hits. | |
# Cache from the default branch of the canonical repo so forks can have cache hits. | |
# Ignore errors on cache writes so CI of forks works without a valid GHCR config. | |
cache-from: | | |
type=registry,ref=ghcr.io/${{ env.REPO_NAME }}:${{ matrix.image }}-${{ env.GIT_REF_NAME }} | |
type=registry,ref=ghcr.io/${{ env.REPO_NAME }}:${{ matrix.image }}-main | |
type=registry,ref=ghcr.io/indygreg/python-build-standalone:${{ matrix.image }}-main | |
cache-to: | | |
type=registry,ref=ghcr.io/${{ env.REPO_NAME }}:${{ matrix.image }}-${{ env.GIT_REF_NAME }},ignore-error=true | |
outputs: | | |
type=docker,dest=build/image-${{ matrix.image }}.tar | |
- name: Compress Image | |
run: | | |
echo ${{ steps.build-image.outputs.imageid }} > build/image-${{ matrix.image }} | |
zstd -v -T0 -6 --rm build/image-*.tar | |
- name: Upload Docker Image | |
uses: actions/upload-artifact@v4 | |
with: | |
name: image-${{ matrix.image }} | |
path: build/image-* | |
generate-matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set up Python | |
uses: astral-sh/setup-uv@v4 | |
- name: Get pull request labels | |
id: get-labels | |
run: | | |
# Convert GitHub labels array to comma-separated string | |
LABELS=$(echo '${{ toJson(github.event.pull_request.labels.*.name) }}' | jq -r 'join(",")') | |
echo "labels=$LABELS" >> $GITHUB_OUTPUT | |
- name: Generate build matrix | |
id: set-matrix | |
run: | | |
uv run ci-matrix.py --platform linux --labels "${{ steps.get-labels.outputs.labels }}" > matrix.json && echo "matrix=$(cat matrix.json)" >> $GITHUB_OUTPUT | |
# Display the matrix for debugging too | |
cat matrix.json | jq | |
build: | |
needs: | |
- generate-matrix | |
- pythonbuild | |
- image | |
runs-on: depot-ubuntu-22.04 | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} | |
fail-fast: false | |
name: ${{ matrix.target_triple }} / ${{ matrix.python }} / ${{ matrix.build_options }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Install Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: Download pythonbuild | |
uses: actions/download-artifact@v4 | |
with: | |
name: pythonbuild | |
path: build | |
- name: Download images | |
uses: actions/download-artifact@v4 | |
with: | |
pattern: image-* | |
path: build | |
merge-multiple: true | |
- name: Load Docker Images | |
run: | | |
for f in build/image-*.tar.zst; do | |
echo "decompressing $f" | |
zstd -d --rm ${f} | |
done | |
for f in build/image-*.tar; do | |
echo "loading $f" | |
docker load --input $f | |
done | |
- name: Build | |
run: | | |
# Do empty target so all generated files are touched. | |
./build-linux.py --make-target empty | |
# Touch mtimes of all images so they are newer than autogenerated files above. | |
touch build/image-* | |
./build-linux.py --target-triple ${{ matrix.target_triple }} --python cpython-${{ matrix.python }} --options ${{ matrix.build_options }} | |
- name: Validate Distribution | |
run: | | |
chmod +x build/pythonbuild | |
if [ -n "${{ matrix.run }}" ]; then | |
EXTRA_ARGS="--run" | |
fi | |
build/pythonbuild validate-distribution ${EXTRA_ARGS} dist/*.tar.zst | |
- name: Upload Distribution | |
uses: actions/upload-artifact@v4 | |
with: | |
name: cpython-${{ matrix.python }}-${{ matrix.target_triple }}-${{ matrix.build_options }} | |
path: dist/* |