name: pypi-wheels on: workflow_call: inputs: tag: description: "Release tag to package (e.g., v1.2.3)" required: true type: string workflow_dispatch: inputs: tag: description: "Release tag to package (e.g., v1.2.3). Leave blank to use the latest release." required: false type: string permissions: {} jobs: build-wheels: name: Build PyPI wheels runs-on: ubuntu-latest permissions: contents: read id-token: write steps: - name: Determine version/tag id: version shell: bash env: INPUT_TAG: ${{ inputs.tag || github.event.inputs.tag || '' }} run: | set -euo pipefail if [[ -z "${INPUT_TAG}" ]]; then echo "No tag provided — cannot determine version" >&2 exit 1 fi TAG="${INPUT_TAG}" if [[ ! "${TAG}" =~ ^v[0-9A-Za-z._+-]+$ ]]; then echo "Invalid tag format: ${TAG}" >&2 exit 1 fi VERSION="${TAG#v}" echo "tag=${TAG}" >> "$GITHUB_OUTPUT" echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: ref: ${{ steps.version.outputs.tag }} - name: Download release assets env: GH_TOKEN: ${{ github.token }} run: | mkdir -p release-assets gh release download "${{ steps.version.outputs.tag }}" \ -p "kingfisher-*.tgz" \ -p "kingfisher-*.zip" \ -D release-assets - name: Extract binaries shell: bash run: | set -euo pipefail mkdir -p extracted for archive in release-assets/*; do name=$(basename "$archive") dir="extracted/${name%.*}" mkdir -p "$dir" case "$archive" in *.tgz) tar -xzf "$archive" -C "$dir" ;; *.zip) unzip -q "$archive" -d "$dir" ;; *) echo "Unknown archive: $archive" >&2 exit 1 ;; esac done mkdir -p extracted/bin for bin in $(find extracted -type f \( -name "kingfisher" -o -name "kingfisher.exe" \)); do chmod +x "$bin" || true done - name: Install build tooling run: "python -m pip install --upgrade --only-binary :all: --require-hashes -r .github/requirements/pypi-build.txt" - name: Build wheels shell: bash run: | set -euo pipefail version="${{ steps.version.outputs.version }}" linux_x64=$(find extracted -type f -name "kingfisher" | grep -m1 "linux-x64") linux_arm64=$(find extracted -type f -name "kingfisher" | grep -m1 "linux-arm64") mac_x64=$(find extracted -type f -name "kingfisher" | grep -m1 "darwin-x64") mac_arm64=$(find extracted -type f -name "kingfisher" | grep -m1 "darwin-arm64") win_x64=$(find extracted -type f -name "kingfisher.exe" | grep -m1 "windows-x64") win_arm64=$(find extracted -type f -name "kingfisher.exe" | grep -m1 "windows-arm64") scripts/build-pypi-wheel.sh \ --binary "$linux_x64" \ --version "$version" \ --plat-name musllinux_1_2_x86_64 scripts/build-pypi-wheel.sh \ --binary "$linux_arm64" \ --version "$version" \ --plat-name musllinux_1_2_aarch64 scripts/build-pypi-wheel.sh \ --binary "$mac_x64" \ --version "$version" \ --plat-name macosx_10_9_x86_64 scripts/build-pypi-wheel.sh \ --binary "$mac_arm64" \ --version "$version" \ --plat-name macosx_11_0_arm64 scripts/build-pypi-wheel.sh \ --binary "$win_x64" \ --version "$version" \ --plat-name win_amd64 scripts/build-pypi-wheel.sh \ --binary "$win_arm64" \ --version "$version" \ --plat-name win_arm64 - name: Publish to PyPI (Trusted Publishing) uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # release/v1 with: packages-dir: dist-pypi