Skip to content

CI: add a 32-bit test job (armv7, emulated) - #10211

Merged
ThomasWaldmann merged 1 commit into
borgbackup:masterfrom
ThomasWaldmann:ci-32bit-armv7
Aug 25, 2026
Merged

CI: add a 32-bit test job (armv7, emulated)#10211
ThomasWaldmann merged 1 commit into
borgbackup:masterfrom
ThomasWaldmann:ci-32bit-armv7

Conversation

@ThomasWaldmann

Copy link
Copy Markdown
Member

We have big-endian coverage (s390x) now, but no 32-bit platform: all our other CI
machines are 64-bit, so nothing exercises borg where a pointer, size_t,
Py_ssize_t and off_t are 32 bits wide.

Why armv7: 32-bit x86 desktops are basically gone, but 32-bit ARM is not — it
is what borg users on Raspberry Pi OS 32-bit and on quite some NAS / router /
embedded boxes run. It also has two properties x86 does not have: it does not
tolerate unaligned memory accesses everywhere, and plain char is unsigned on
ARM (signed on x86) — a classic C portability trap. GitHub's arm64 runners cannot
execute 32-bit ARM code natively, so this is emulated (qemu user-mode) regardless.

Why trixie: borg needs OpenSSL >= 3.2, so debian bookworm and its OpenSSL 3.0
are out. trixie has OpenSSL 3.5.6 and python 3.13 for armhf.

The job is modelled on bigendian.yml and has the same trigger policy: native /
format relevant paths on PRs, weekly (Wednesdays, one hour after the s390x job so
the two emulated jobs do not start at the same time), plus workflow_dispatch.

It runs the word size sensitive tests (chunkers, crypto, compress, hashindex,
item, repoobj, repository, archive, cache, digests, msgpack, time) and then the
cross-architecture interoperability test: a repository written on the emulated
32-bit machine is checked, extracted and written to by the 64-bit runner and the
other way round, and both sides must produce identical chunk IDs.

scripts/endian_interop_test.py is reused unchanged (its labels are just names
for the two sides); only its docstring mentions the second use now.

Note on runtime: armv7l has fewer wheels on PyPI than s390x — only blake3 ships
one, so PyYAML, msgpack and backports-zstd (which vendors the whole zstd library)
are compiled under emulation. The .pip-cache-armv7 cache keeps that to the
first run and to dependency bumps.

Not tested beyond YAML validity and the pytest target list — the first run on
GitHub will show the real emulated runtime.

All our other CI machines are 64-bit, so nothing exercises borg where a
pointer, size_t, Py_ssize_t and off_t are 32 bits wide. armv7 is the 32-bit
platform borg users still run (Raspberry Pi OS 32-bit, NAS / router /
embedded boxes); it additionally does not tolerate unaligned accesses
everywhere and has an unsigned plain "char", so it exercises C portability,
too.

Modelled on the big-endian s390x job: debian trixie (python 3.13, and its
OpenSSL 3.5 satisfies our OpenSSL >= 3.2 requirement - bookworm's 3.0 would
not) under qemu user-mode emulation, the same trigger policy (native/format
relevant paths, weekly, manual), the word size sensitive tests, and a
cross-architecture interoperability test - a repository written on the
emulated 32-bit machine is read (and written to) by the 64-bit runner and the
other way round, requiring identical chunk IDs on both sides.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Aug 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.25%. Comparing base (2491d56) to head (d69838c).
⚠️ Report is 30 commits behind head on master.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##           master   #10211      +/-   ##
==========================================
+ Coverage   87.20%   87.25%   +0.05%     
==========================================
  Files         102      102              
  Lines       18394    18430      +36     
  Branches     2829     2832       +3     
==========================================
+ Hits        16040    16082      +42     
+ Misses       1644     1642       -2     
+ Partials      710      706       -4     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@ThomasWaldmann
ThomasWaldmann merged commit f49949f into borgbackup:master Aug 25, 2026
23 of 25 checks passed
@ThomasWaldmann
ThomasWaldmann deleted the ci-32bit-armv7 branch August 25, 2026 17:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant