Skip to content

home-assistant-chip-core: Add version 2025.7.0 #14

home-assistant-chip-core: Add version 2025.7.0

home-assistant-chip-core: Add version 2025.7.0 #14

# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `build_prepare`/`build_linux_python_lib` jobs of:
# https://github.com/home-assistant-libs/chip-wheels/blob/2025.7.0/.github/workflows/build.yaml
name: Build home-assistant-chip-core wheels (riscv64)
on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/home-assistant-chip-core.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-home-assistant-chip-core.yml'
- 'docs/packages/home-assistant-chip-core.yaml'
- 'patches/home-assistant-chip-core/**'
push:
branches: [main]
paths:
- '.github/workflows/build-home-assistant-chip-core.yml'
- 'docs/packages/home-assistant-chip-core.yaml'
- 'patches/home-assistant-chip-core/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read # to fetch code (actions/checkout)
env:
# gn/gn git_revision pinned by the Pigweed submodule's cipd_setup/pigweed.json
GN_REVISION: 487f8353f15456474437df32bb186187b0940b45
# infra/3pp/tools/protoc version pinned by the same pigweed.json
PROTOC_VERSION: '28.2'
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64
jobs:
setup:
uses: $/.github/workflows/_setup.yml
with:
package: home-assistant-chip-core
version: ${{ inputs.version }}
# ZAP code generation has no riscv64 build (project-chip/zap ships prebuilt
# Electron/node binaries for x86_64/arm64 only), so it runs once here on a
# regular x86_64 runner, as in chip-wheels' own build_prepare, and
# build_wheels consumes it via chip_code_pre_generated_directory, which
# never invokes ZAP itself. Unlike chip-wheels, only zzz_pregenerated/ is
# handed over, not a tar of the whole SDK: the riscv64 runners download
# Actions artifacts at ~1 MB/s in one non-resumable stream, so that ~4 GB tar
# took over an hour and failed whenever the stream broke, while the same
# checkout and patches straight from GitHub take minutes there.
build_prepare:
name: Prepare home-assistant-chip-core ${{ matrix.version }}
needs: [setup]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
runs-on: ubuntu-24.04
env:
CHIP_VERSION: ${{ matrix.version }}
steps:
- name: Checkout home-assistant-libs/chip-wheels ${{ env.CHIP_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: home-assistant-libs/chip-wheels
ref: ${{ env.CHIP_VERSION }}
submodules: true
persist-credentials: false
- name: Checkout python-wheels
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
path: python-wheels
persist-credentials: false
- name: Checkout connectedhomeip submodules
working-directory: connectedhomeip
run: scripts/checkout_submodules.py --shallow --platform linux
- name: Apply riscv64 patches
working-directory: connectedhomeip
run: git apply ../python-wheels/patches/home-assistant-chip-core/${{ env.CHIP_VERSION }}/*.patch
- name: Apply chip-wheels patches
working-directory: connectedhomeip
run: |
for patch in ../*.patch; do
echo "Applying ${patch}"
patch -p1 < "$patch"
done
- name: Bootstrap
working-directory: connectedhomeip
run: bash scripts/bootstrap.sh -p all,linux
- name: ZAP code pre-generation
working-directory: connectedhomeip
run: scripts/run_in_build_env.sh "scripts/codepregen.py ./zzz_pregenerated/"
- name: Create ZAP pre-generated code tar
run: tar -caf zzz_pregenerated-${{ env.CHIP_VERSION }}.tar.zst --use-compress-program=zstdmt -C connectedhomeip zzz_pregenerated
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: home-assistant-chip-core-${{ env.CHIP_VERSION }}-zap-pregenerated
path: zzz_pregenerated-${{ env.CHIP_VERSION }}.tar.zst
if-no-files-found: error
build_wheels:
needs: [setup, build_prepare]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
name: Build home-assistant-chip-core ${{ matrix.version }} cp37-abi3-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 1440 # full Pigweed/GN/Ninja CHIP SDK compile from source
# container.image can't read the env context, so the image is repeated
# literally here; MANYLINUX_RISCV64_IMAGE below still pins gpl_sources to
# the same one.
container:
image: quay.io/pypa/manylinux_2_39_riscv64
defaults:
run:
working-directory: connectedhomeip
env:
CHIP_VERSION: ${{ matrix.version }}
# CHIP's constraints.txt pins protobuf==5.28.3, which ships binary (upb)
# wheels for x86_64/aarch64 only, so on riscv64 pip picks its
# py3-none-any wheel: the pure-Python backend. That backend has no
# FieldOptions.RegisterExtension, which the extensions_pb2.py bundled in
# the pinned mypy-protobuf 3.5.0 calls, so every protoc --mypy_out step
# in Bootstrap fails. Build protobuf from its sdist instead, which
# compiles the same upb extension the other platforms get.
PIP_NO_BINARY: protobuf
# Pigweed pip-installs its own package with --no-build-isolation, so a
# dependency with no riscv64 wheel is built in the Pigweed venv, which
# has no maturin (or Rust) for cryptography's sdist. Take cryptography
# (pinned to 43.0.1 by patch 0004) and its cffi from our registry.
# Patch 0005 also moves that venv's pip off CHIP's 23.2.1, which lists
# no manylinux_*_riscv64 tags and so can't see these wheels at all
# (gotchas 234/640).
PIP_EXTRA_INDEX_URL: https://pypi.riseproject.dev/simple/
PIP_ONLY_BINARY: cryptography,cffi
steps:
- name: Checkout home-assistant-libs/chip-wheels ${{ env.CHIP_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: home-assistant-libs/chip-wheels
ref: ${{ env.CHIP_VERSION }}
submodules: true
persist-credentials: false
- name: Checkout python-wheels
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
path: python-wheels
persist-credentials: false
- name: Install system dependencies
working-directory: ./
run: |
# cairo-gobject-devel ships cairo-gobject.h; chip-repl's pygobject==3.50.0
# dependency needs it for its pygi-foreign-cairo.c Cairo integration.
dnf install -y --enablerepo=crb zstd \
openssl-devel glib2-devel libnl3-devel cairo-devel \
cairo-gobject-devel gobject-introspection-devel dbus-devel \
python3-devel libstdc++-static
git config --global --add safe.directory '*'
echo "/opt/python/cp312-cp312/bin" >> "$GITHUB_PATH"
- name: Checkout connectedhomeip submodules
run: scripts/checkout_submodules.py --shallow --platform linux
- name: Apply riscv64 patches
run: git apply ../python-wheels/patches/home-assistant-chip-core/${{ env.CHIP_VERSION }}/*.patch
- name: Apply chip-wheels patches
run: |
for patch in ../*.patch; do
echo "Applying ${patch}"
patch -p1 < "$patch"
done
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: home-assistant-chip-core-${{ env.CHIP_VERSION }}-zap-pregenerated
- name: Extract ZAP pre-generated code
run: tar -xaf ../zzz_pregenerated-${{ env.CHIP_VERSION }}.tar.zst --use-compress-program=zstdmt
# Rocky 10's riscv64 CIPD backend has no fuchsia/third_party/ninja build
# at all, and gn_gen.sh's own gn/ninja fetch goes through the CIPD
# client this job's patched pigweed wrapper.py bootstraps -- same "no
# CIPD gn/ninja on riscv64" situation build-skia-python.yml/
# build-skia-pathops.yml already solved: build gn from source and get
# ninja from its own riscv64 PyPI wheel, ahead of bootstrap.sh.
#
# gn's own link step passes -static-libstdc++, which needs
# libstdc++.a -- the riscv64 manylinux image doesn't ship it by
# default (CLAUDE.md gotcha 77), hence libstdc++-static above.
- name: Install gn and ninja
run: |
set -e
python3 -m pip install ninja
git clone https://gn.googlesource.com/gn /tmp/gn
git -C /tmp/gn checkout "${GN_REVISION}"
(cd /tmp/gn && CXX=g++ python3 build/gen.py --allow-warnings && ninja -C out gn)
install -m 0755 /tmp/gn/out/gn /usr/local/bin/gn
# Pigweed's bootstrap runs a bare `protoc` from PATH to generate the
# Python protos, and infra/3pp/tools/protoc has no linux-riscv64 CIPD
# build. CRB's protobuf-compiler (3.19.6) rejects --experimental_editions
# and the riscv64 grpcio-tools bundles protoc 35, whose output won't load
# under CHIP's protobuf==5.28.3, so build Pigweed's own version. The
# well-known .protos go in /opt/protoc/include, found relative to the binary.
- name: Install protoc
run: |
set -e
git clone --depth 1 --branch "v${PROTOC_VERSION}" https://github.com/protocolbuffers/protobuf /tmp/protobuf
git -C /tmp/protobuf submodule update --init --depth 1 third_party/abseil-cpp
cmake -S /tmp/protobuf -B /tmp/protobuf/build -G Ninja \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/protoc \
-Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_LIBUPB=OFF -Dprotobuf_WITH_ZLIB=OFF
cmake --build /tmp/protobuf/build --target protoc
cmake --install /tmp/protobuf/build --component protoc
cmake --install /tmp/protobuf/build --component protobuf-headers
ln -s /opt/protoc/bin/protoc /usr/local/bin/protoc
protoc --version
- name: Bootstrap
run: bash scripts/bootstrap.sh -p linux
- name: Setup build and run build
run: |
scripts/build/gn_gen.sh --args=" \
chip_project_config_include_dirs=[\"//..\"] \
chip_crypto=\"boringssl\" \
enable_rtti=true \
chip_config_memory_debug_checks=false \
chip_config_memory_debug_dmalloc=false \
chip_exchange_node_id_logging=true \
chip_mdns=\"minimal\" \
chip_minmdns_default_policy=\"libnl\" \
chip_python_version=\"${{ env.CHIP_VERSION }}\" \
chip_python_package_prefix=\"home-assistant-chip\" \
chip_python_platform_tag=\"manylinux_2_39\" \
chip_code_pre_generated_directory=\"$(pwd)/zzz_pregenerated\" \
"
scripts/run_in_build_env.sh "ninja -C ./out chip-repl"
- name: Run Python library specific unit tests
run: |
scripts/run_in_build_env.sh 'pip3 install ./out/controller/python/home_assistant_chip_core-${{ env.CHIP_VERSION }}-cp37-abi3-manylinux_2_39_riscv64.whl'
scripts/run_in_build_env.sh 'pip3 install ./out/controller/python/home_assistant_chip_clusters-${{ env.CHIP_VERSION }}-py3-none-any.whl'
scripts/run_in_build_env.sh 'pip3 install ./out/controller/python/home_assistant_chip_repl-${{ env.CHIP_VERSION }}-py3-none-any.whl'
scripts/run_in_build_env.sh '(cd src/controller/python/test/unit_tests/ && python3 -m unittest -v)'
# Only chip-core goes in the wheelhouse. The build also emits
# home_assistant_chip_clusters and home_assistant_chip_repl, which the
# unit tests above install, but those are separate PyPI projects that
# upstream already ships as pure-Python py3-none-any wheels (no
# extension, Root-Is-Purelib), so riscv64 installs them from PyPI as is.
# _publish-wheel.yml also publishes exactly one project per run and
# rejects a wheelhouse mixing project names.
- name: Repair wheel
run: |
mkdir -p ../wheelhouse
pip3 install auditwheel
auditwheel repair -w ../wheelhouse --plat manylinux_2_39_riscv64 \
out/controller/python/home_assistant_chip_core-${{ env.CHIP_VERSION }}-cp37-abi3-manylinux_2_39_riscv64.whl
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: home-assistant-chip-core-${{ env.CHIP_VERSION }}-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error
gpl_sources:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
name: Collect GPL sources (glib2, libnl3) for home-assistant-chip-core ${{ matrix.version }}
runs-on: ubuntu-24.04-riscv
env:
CHIP_VERSION: ${{ matrix.version }}
steps:
# auditwheel vendors the image's libglib-2.0/libgobject-2.0/libgio-2.0
# (glib2, LGPL) and libnl-3/libnl-route-3 (libnl3, LGPL) into the wheel.
- name: Collect glib2/libnl3 source RPMs from manylinux_riscv64
uses: riseproject-dev/python-wheels/actions/collect-gpl-sources@main
with:
image: ${{ env.MANYLINUX_RISCV64_IMAGE }}
packages: glib2 libnl3
output: gpl-sources.tar
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: home-assistant-chip-core-${{ env.CHIP_VERSION }}-gpl-sources
path: gpl-sources.tar
if-no-files-found: error
publish:
name: Publish home-assistant-chip-core ${{ matrix.version }}
needs: [setup, build_wheels, gpl_sources]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
secrets:
app-private-key: ${{ secrets.RISEPROJECT_APP_PRIVATE_KEY }}
with:
artifact-pattern: home-assistant-chip-core-${{ matrix.version }}-manylinux_riscv64
gpl-sources-artifact: home-assistant-chip-core-${{ matrix.version }}-gpl-sources
gpl-sources-description: glib2, libnl3