Skip to content

Setup CI to run on 2027 branch #408

Setup CI to run on 2027 branch

Setup CI to run on 2027 branch #408

Workflow file for this run

---
name: dist
on:
pull_request:
push:
branches:
- main
- '2027'
tags:
- '*'
workflow_dispatch:
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
env:
SCCACHE_WEBDAV_ENDPOINT: "https://frcmaven.wpi.edu/artifactory/wpilib-generic-cache-cmake-local"
SCCACHE_WEBDAV_KEY_PREFIX: "sccache-robotpy"
jobs:
# This job limits concurrency on the default branch
# - we want it to run so it can populate ccache, but we typically
# don't care about when it completes, so limit its concurrency
# to stop eating up valuable + slow Windows/macOS runners
setup_concurrency:
runs-on: ubuntu-latest
outputs:
max-parallel: ${{ steps.max-parallel.outputs.p }}
steps:
- name: Setup concurrency
shell: bash
id: max-parallel
run: |
if [[ "${{ github.ref_name }}" == "main" ]]; then
echo "PARALLEL=1"
echo "p={\"v\": 1}" >> $GITHUB_OUTPUT
elif [[ "${{ github.ref_name }}" == "2027" ]]; then
echo "PARALLEL=1"
echo "p={\"v\": 1}" >> $GITHUB_OUTPUT
else
echo "PARALLEL=10000"
echo "p={\"v\": 10000}" >> $GITHUB_OUTPUT
fi
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: psf/black@stable
- uses: actions/setup-python@v5
with:
python-version: "3.13"
- name: Install deps
shell: bash
run: |
python -m pip --disable-pip-version-check install -r rdev_requirements.txt
- name: Check pyproject / rdev synchronization
shell: bash
run: |
./rdev.sh ci check-pyproject
#
# Build other wheels first (OS-specific, not python specific)
#
build-other:
runs-on: ${{ matrix.os }}
needs: [setup_concurrency]
strategy:
max-parallel: ${{ fromJSON(needs.setup_concurrency.outputs.max-parallel).v }}
fail-fast: true
matrix:
os: ["ubuntu-22.04", "ubuntu-22.04-arm", "macos-14", "windows-2022"]
include:
- os: ubuntu-22.04-arm
container: python:3.13-bookworm
container: ${{ matrix.container }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install python
if: matrix.os != 'ubuntu-22.04-arm'
uses: actions/setup-python@v5
with:
python-version: '3.13'
- name: Install deps
shell: bash
run: |
python -m pip --disable-pip-version-check install -r rdev_requirements.txt
- name: Build + test wheels
shell: bash
run: |
./rdev.sh ci build-other-wheels
- uses: actions/upload-artifact@v4
with:
name: "pypi-other-${{ runner.os }}-${{ runner.arch }}"
path: dist
#
# Build meson wheels
#
build-meson:
runs-on: ${{ matrix.os }}
needs: [setup_concurrency, build-other]
strategy:
max-parallel: ${{ fromJSON(needs.setup_concurrency.outputs.max-parallel).v }}
fail-fast: true
matrix:
os:
- "ubuntu-22.04"
- "macos-13" # x86_64
- "macos-14" # arm64
- "windows-2022"
python_version:
- '3.9'
- '3.10'
- '3.11'
- '3.12'
- '3.13'
include:
- os: ubuntu-22.04-arm
python_version: '3.11'
container: python:3.11-bookworm
- os: ubuntu-22.04-arm
python_version: '3.12'
container: python:3.12-bookworm
- os: ubuntu-22.04-arm
python_version: '3.13'
container: python:3.13-bookworm
container: ${{ matrix.container }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install python
if: matrix.os != 'ubuntu-22.04-arm'
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python_version }}
- uses: actions/download-artifact@v4
with:
pattern: "pypi-other-${{ runner.os }}-*"
path: dist-other
merge-multiple: true
#
# Platform specific setup
#
- name: Install libgl
run: apt-get update && apt-get install -y libgl1
if: matrix.os == 'ubuntu-22.04-arm'
- name: Setup MSVC
uses: bus1/cabuild/action/msdevshell@e22aba57d6e74891d059d66501b6b5aed8123c4d # v1
with:
architecture: x64
if: runner.os == 'Windows'
#
# Setup build caching
#
- name: Set ccache params
shell: bash
id: ccache
env:
OS: ${{ runner.os }}
run: |
if [[ "$OS" == "macOS" ]]; then
echo "SCCACHE_CACHE_MULTIARCH=1" >> $GITHUB_ENV
fi
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.7
- name: Install deps
run: |
python -m pip --disable-pip-version-check install -r rdev_requirements.txt
- name: Install numpy (needed for stubgen but broken in raspbian CI)
run: |
python -m pip --disable-pip-version-check install numpy
- name: Build + test wheels
run: |
python -m devtools ci build-meson-wheels
env:
SCCACHE_WEBDAV_USERNAME: ${{ secrets.WPI_ARTIFACTORY_USERNAME }}
SCCACHE_WEBDAV_PASSWORD: ${{ secrets.WPI_ARTIFACTORY_TOKEN }}
- uses: actions/upload-artifact@v4
with:
name: "pypi-meson-${{ runner.os }}-${{ runner.arch }}-${{ matrix.python_version }}"
path: dist
#
# Build roboRIO/raspbian wheels
#
cross-other:
runs-on: ubuntu-latest
needs: [setup_concurrency]
strategy:
max-parallel: ${{ fromJSON(needs.setup_concurrency.outputs.max-parallel).v }}
matrix:
os:
- container: wpilib/roborio-cross-ubuntu:2025-22.04-py313
name: roborio
- container: wpilib/raspbian-cross-ubuntu:2025-bookworm-22.04-py313
name: raspbian
container:
image: "${{ matrix.os.container }}"
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup cross environment for meson
uses: robotpy/build-actions/setup-cross-meson@semiwrap
- name: Install deps
shell: bash
run: |
/build/venv/bin/cross-pip --disable-pip-version-check install -r rdev_requirements.txt
- name: Build + test wheels
shell: bash
run: |
/build/venv/bin/cross-python -m devtools ci build-other-wheels --no-test
- uses: actions/upload-artifact@v4
with:
name: cross-other-${{ matrix.os.name }}
path: dist
cross-meson:
runs-on: ubuntu-latest
needs: [setup_concurrency, cross-other]
strategy:
max-parallel: ${{ fromJSON(needs.setup_concurrency.outputs.max-parallel).v }}
matrix:
os:
- container: wpilib/roborio-cross-ubuntu:2025-22.04-py313
name: roborio
base: roborio
- container: wpilib/raspbian-cross-ubuntu:2025-bookworm-22.04-py311
name: raspbian-py311
base: raspbian
- container: wpilib/raspbian-cross-ubuntu:2025-bookworm-22.04-py312
name: raspbian-py312
base: raspbian
- container: wpilib/raspbian-cross-ubuntu:2025-bookworm-22.04-py313
name: raspbian-py313
base: raspbian
container:
image: "${{ matrix.os.container }}"
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/download-artifact@v4
with:
name: "cross-other-${{ matrix.os.base }}"
path: dist-other
- name: Setup cross environment for meson
uses: robotpy/build-actions/setup-cross-meson@semiwrap
- run: apt-get update
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: ${{ matrix.os.container }}
variant: ccache
- name: Install deps
shell: bash
run: |
/build/venv/bin/cross-pip --disable-pip-version-check install -r rdev_requirements.txt
- name: Build wheels
shell: bash
run: |
/build/venv/bin/cross-python -m devtools ci build-meson-wheels --no-test --cross=cross.txt
- uses: actions/upload-artifact@v4
with:
name: cross-meson-${{ matrix.os.name }}
path: dist
#
# Publish wheels to wpilib artifactory, pypi
#
publish-rpyrepo:
runs-on: ubuntu-latest
needs: [check, build-meson, cross-meson]
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
steps:
- uses: actions/download-artifact@v4
with:
pattern: cross-meson-*
path: dist/
merge-multiple: true
- uses: pypa/gh-action-pypi-publish@release/v1
with:
verify-metadata: false
user: ${{ secrets.WPI_ARTIFACTORY_USERNAME }}
password: ${{ secrets.WPI_ARTIFACTORY_TOKEN }}
repository-url: https://wpilib.jfrog.io/artifactory/api/pypi/wpilib-python-release-2025-local
publish-rpyrepo-other:
runs-on: ubuntu-latest
needs: [check, build-meson, cross-meson]
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
steps:
- uses: actions/download-artifact@v4
with:
pattern: cross-other-*
path: dist/
merge-multiple: true
- uses: pypa/gh-action-pypi-publish@release/v1
with:
verify-metadata: false
skip-existing: true # native packages can be uploaded multiple times
user: ${{ secrets.WPI_ARTIFACTORY_USERNAME }}
password: ${{ secrets.WPI_ARTIFACTORY_TOKEN }}
repository-url: https://wpilib.jfrog.io/artifactory/api/pypi/wpilib-python-release-2025-local
publish-pypi:
runs-on: ubuntu-latest
needs: [check, build-meson, cross-meson]
permissions:
id-token: write
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/download-artifact@v4
with:
pattern: pypi-meson-*
path: dist/
merge-multiple: true
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
verify-metadata: false
publish-pypi-other:
runs-on: ubuntu-latest
needs: [check, build-meson, cross-meson]
permissions:
id-token: write
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/download-artifact@v4
with:
pattern: pypi-other-*
path: dist/
merge-multiple: true
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
verify-metadata: false
skip-existing: true # native packages can be uploaded multiple times
ping-rtd:
runs-on: ubuntu-latest
needs: [check, build-meson, cross-meson]
if: |
github.event_name == 'push' &&
(startsWith(github.event.ref, 'refs/tags') || github.event.ref == 'refs/heads/main')
steps:
- name: Sleep 1 minute to allow artifact upload
shell: bash
run: sleep 60
- name: Ping readthedocs
uses: robotpy/build-actions/ping-rtd@v2024
with:
token: ${{ secrets.RTD_TOKEN }}
webhook: ${{ secrets.RTD_WEBHOOK }}
ping-meta:
runs-on: ubuntu-latest
needs: [publish-rpyrepo, publish-rpyrepo-other, publish-pypi, publish-pypi-other]
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
steps:
- uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.META_REPO_ACCESS_TOKEN }}
repository: robotpy/robotpy-meta
event-type: tag
client-payload: '{"package_name": "mostrobotpy", "package_version": "${{ github.ref_name }}"}'