Skip to content

chore: add debug info to CI #23

chore: add debug info to CI

chore: add debug info to CI #23

Workflow file for this run

name: 15. _Build Distribution

Check failure on line 1 in .github/workflows/_build.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/_build.yml

Invalid workflow file

(Line: 95, Col: 7): 'run' is already defined
on:
workflow_call:
inputs:
os_json:
description: 'JSON string of OS to build on'
required: false
type: string
default: '["ubuntu-latest", "macos-latest", "macos-15-intel", "windows-latest"]'
python_json:
description: 'JSON string of Python versions'
required: false
type: string
default: '["3.10", "3.11", "3.12", "3.13"]'
build_sdist:
description: 'Whether to build source distribution'
required: false
type: boolean
default: true
build_wheels:
description: 'Whether to build wheel distribution'
required: false
type: boolean
default: true
workflow_dispatch:
inputs:
build_sdist:
description: 'Whether to build source distribution'
required: false
type: boolean
default: true
build_wheels:
description: 'Whether to build wheel distribution'
required: false
type: boolean
default: true
os_json:
description: 'JSON string of OS to build on'
required: false
default: '["ubuntu-latest", "macos-latest", "macos-15-intel", "windows-latest"]'
python_json:
description: 'JSON string of Python versions'
required: false
default: '["3.10", "3.11", "3.12", "3.13"]'
jobs:
build-sdist:
name: Build source distribution
if: inputs.build_sdist
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
fetch-depth: 0 # Required for setuptools_scm to detect version from git tags
- name: Fetch all tags
run: git fetch --force --tags
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Create venv
run: uv venv
- name: Install build dependencies
run: uv pip install build setuptools_scm
- name: Clean workspace (force ignore dirty)
run: |
git reset --hard HEAD
git clean -fd
- name: Debug Git and SCM
run: |
echo "=== Git Describe ==="
git describe --tags --long --dirty --always
echo "=== Setuptools SCM Version ==="
uv run python -m setuptools_scm
echo "=== Git Status (Ignored included) ==="
git status --ignored
echo "=== Check openviking/_version.py ==="
if [ -f openviking/_version.py ]; then cat openviking/_version.py; else echo "Not found"; fi
- name: Build sdist
run: uv run python -m build --sdist
run: uv run python -m build --sdist
- name: Store the distribution packages
uses: actions/upload-artifact@v6
with:
name: python-package-distributions-sdist
path: dist/*.tar.gz
- name: Display built sdist version
continue-on-error: true
run: |
VERSION=$(ls dist/*.tar.gz | head -n 1 | xargs basename | sed -E 's/^[^-]+-(.+)\.tar\.gz$/\1/')
echo "Build Version: $VERSION"
echo "::notice::Build sdist Version: $VERSION"
build-linux:
name: Build distribution on Linux (glibc 2.31) py${{ matrix.python-version }}
# Only run if inputs.os_json contains 'ubuntu' or 'linux'
if: inputs.build_wheels && (contains(inputs.os_json, 'ubuntu') || contains(inputs.os_json, 'linux'))
runs-on: ubuntu-latest
container: ubuntu:20.04
env:
DEBIAN_FRONTEND: noninteractive
TZ: Etc/UTC
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(inputs.python_json) }}
steps:
- name: Install system dependencies (Linux)
run: |
# Replace archive.ubuntu.com with azure.archive.ubuntu.com for better stability in GH Actions
sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/azure.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list
# Retry apt-get update
for i in 1 2 3 4 5; do apt-get update && break || sleep 5; done
apt-get install -y \
git ca-certificates cmake build-essential tzdata curl \
libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \
libffi-dev liblzma-dev libgdbm-dev libnss3-dev libncurses5-dev \
libncursesw5-dev tk-dev uuid-dev libexpat1-dev
ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
- uses: actions/checkout@v6
with:
submodules: recursive
fetch-depth: 0 # Required for setuptools_scm to detect version from git tags
- name: Fetch all tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --force --tags
- name: Build CPython (Dynamic Selection)
run: |
# Map short version to full version for our specific build environment
PYTHON_VERSION="${{ matrix.python-version }}"
case "$PYTHON_VERSION" in
"3.9") PYTHON_FULL="3.9.18" ;;
"3.10") PYTHON_FULL="3.10.13" ;;
"3.11") PYTHON_FULL="3.11.8" ;;
"3.12") PYTHON_FULL="3.12.2" ;;
"3.13") PYTHON_FULL="3.13.2" ;;
*)
echo "Error: Unknown python version $PYTHON_VERSION"
exit 1
;;
esac
PYTHON_PREFIX="/opt/python/${PYTHON_FULL}"
PYTHON_BIN="${PYTHON_PREFIX}/bin/python${{ matrix.python-version }}"
if [ ! -x "$PYTHON_BIN" ]; then
curl -fsSL -o /tmp/Python-${PYTHON_FULL}.tgz \
https://www.python.org/ftp/python/${PYTHON_FULL}/Python-${PYTHON_FULL}.tgz
tar -xzf /tmp/Python-${PYTHON_FULL}.tgz -C /tmp
cd /tmp/Python-${PYTHON_FULL}
CFLAGS="-fPIC" \
./configure --prefix="${PYTHON_PREFIX}" --with-ensurepip=install --enable-shared
make -j"$(nproc)"
make install
fi
echo "PYTHON_BIN=${PYTHON_BIN}" >> "$GITHUB_ENV"
echo "LD_LIBRARY_PATH=${PYTHON_PREFIX}/lib:${LD_LIBRARY_PATH}" >> "$GITHUB_ENV"
export LD_LIBRARY_PATH="${PYTHON_PREFIX}/lib:${LD_LIBRARY_PATH}"
"$PYTHON_BIN" -V
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: '1.25.1'
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Create venv (Linux)
run: uv venv --python "$PYTHON_BIN"
- name: Seed pip (Linux)
run: uv run python -m ensurepip --upgrade
- name: Install dependencies
run: uv sync --frozen
- name: Install build dependencies
run: uv pip install setuptools setuptools_scm pybind11 cmake wheel build
- name: Clean workspace (force ignore dirty)
run: |
git reset --hard HEAD
git clean -fd
- name: Debug Git and SCM
run: |
echo "=== Git Describe ==="
git describe --tags --long --dirty --always
echo "=== Setuptools SCM Version ==="
uv run python -m setuptools_scm
echo "=== Git Status (Ignored included) ==="
git status --ignored
echo "=== Check openviking/_version.py ==="
if [ -f openviking/_version.py ]; then cat openviking/_version.py; else echo "Not found"; fi
- name: Build package (Wheel Only)
run: uv run python -m build --wheel
- name: Install patchelf (Linux)
run: |
PATCHELF_VERSION=0.18.0
curl -fsSL -o /tmp/patchelf-${PATCHELF_VERSION}.tar.gz \
https://github.com/NixOS/patchelf/releases/download/${PATCHELF_VERSION}/patchelf-${PATCHELF_VERSION}.tar.gz
tar -xzf /tmp/patchelf-${PATCHELF_VERSION}.tar.gz -C /tmp
cd /tmp/patchelf-${PATCHELF_VERSION}
./configure
make -j"$(nproc)"
make install
patchelf --version
- name: Repair wheels (Linux)
run: |
uv pip install auditwheel
# Repair wheels and output to a temporary directory
uv run auditwheel repair dist/*.whl -w dist_fixed
# Remove original non-compliant wheels
rm dist/*.whl
# Move repaired wheels back to dist
mv dist_fixed/*.whl dist/
rmdir dist_fixed
- name: Store the distribution packages
uses: actions/upload-artifact@v6
with:
name: python-package-distributions-linux-${{ matrix.python-version }}
path: dist/
- name: Display built wheel version
continue-on-error: true
run: |
VERSION=$(ls dist/*.whl | head -n 1 | xargs basename | cut -d- -f2)
echo "Build Version: $VERSION"
echo "::notice::Build Wheel Version (Linux py${{ matrix.python-version }}): $VERSION"
build-other:
name: Build distribution on ${{ matrix.os }}
# Filter out ubuntu-latest from this job since it's handled by build-linux
if: inputs.build_wheels
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
strategy:
fail-fast: false
matrix:
os: ${{ fromJson(inputs.os_json) }}
python-version: ${{ fromJson(inputs.python_json) }}
# Exclude ubuntu-latest from this matrix if it was passed in inputs
exclude:
- os: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
fetch-depth: 0 # Required for setuptools_scm to detect version from git tags
- name: Fetch all tags
run: git fetch --force --tags
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: '1.25.1'
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Install system dependencies (macOS)
if: runner.os == 'macOS'
run: brew install cmake
- name: Install system dependencies (Windows)
if: runner.os == 'Windows'
run: |
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
choco install mingw
- name: Install dependencies
run: uv sync --frozen
- name: Install build dependencies
run: uv pip install setuptools setuptools_scm pybind11 cmake wheel build
- name: Clean workspace (force ignore dirty)
run: |
git reset --hard HEAD
git clean -fd
- name: Debug Git and SCM
run: |
echo "=== Git Describe ==="
git describe --tags --long --dirty --always
echo "=== Setuptools SCM Version ==="
uv run python -m setuptools_scm
echo "=== Git Status (Ignored included) ==="
git status --ignored
echo "=== Check openviking/_version.py ==="
if [ -f openviking/_version.py ]; then cat openviking/_version.py; else echo "Not found"; fi
- name: Build package (Wheel Only)
run: uv run python -m build --wheel
- name: Store the distribution packages
uses: actions/upload-artifact@v6
with:
name: python-package-distributions-${{ matrix.os }}-${{ matrix.python-version }}
path: dist/
- name: Display built wheel version
shell: bash
continue-on-error: true
run: |
VERSION=$(ls dist/*.whl | head -n 1 | xargs basename | cut -d- -f2)
echo "Build Version: $VERSION"
echo "::notice::Build Wheel Version (${{ matrix.os }} py${{ matrix.python-version }}): $VERSION"