Skip to content

Commit 6da1055

Browse files
committed
Align release gates with Flatpak runtime
1 parent efc3a99 commit 6da1055

9 files changed

Lines changed: 47 additions & 168 deletions

File tree

.github/workflows/release.yml

Lines changed: 0 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ on:
4747
required: true
4848
type: boolean
4949
default: false
50-
force_live_ui_runtime_smoke:
51-
description: Run the live GTK/AT-SPI/PipeWire smoke even when app-sensitive files did not change.
52-
required: true
53-
type: boolean
54-
default: false
5550

5651
permissions:
5752
contents: read
@@ -151,48 +146,6 @@ jobs:
151146
--github-output "$GITHUB_OUTPUT" \
152147
--github-summary "$GITHUB_STEP_SUMMARY"
153148
154-
live-ui-risk:
155-
name: Detect live UI smoke gate
156-
needs: validate-inputs
157-
runs-on: ubuntu-24.04
158-
159-
outputs:
160-
required: ${{ steps.detect.outputs.required }}
161-
base_tag: ${{ steps.detect.outputs.base_tag }}
162-
163-
steps:
164-
- name: Check out repository
165-
uses: actions/checkout@v6
166-
with:
167-
ref: ${{ inputs.target }}
168-
fetch-depth: 0
169-
170-
- name: Detect app and UI runtime-sensitive changes
171-
id: detect
172-
env:
173-
CREATE_GITHUB_RELEASE: ${{ inputs.create_github_release }}
174-
DRY_RUN: ${{ inputs.dry_run }}
175-
FORCE_LIVE_UI_RUNTIME_SMOKE: ${{ inputs.force_live_ui_runtime_smoke }}
176-
PUBLISH_PYPI: ${{ inputs.publish_pypi }}
177-
PUBLISH_TESTPYPI: ${{ inputs.publish_testpypi }}
178-
TAG_NAME: ${{ inputs.tag_name }}
179-
run: |
180-
set -euo pipefail
181-
182-
release_requested=false
183-
if { [ "$CREATE_GITHUB_RELEASE" = "true" ] || [ "$PUBLISH_TESTPYPI" = "true" ] || [ "$PUBLISH_PYPI" = "true" ]; } \
184-
&& [ "$DRY_RUN" = "false" ]; then
185-
release_requested=true
186-
fi
187-
188-
python3 tools/release_runtime_gate.py \
189-
--scope live-ui \
190-
--tag "$TAG_NAME" \
191-
--release-requested "$release_requested" \
192-
--force "$FORCE_LIVE_UI_RUNTIME_SMOKE" \
193-
--github-output "$GITHUB_OUTPUT" \
194-
--github-summary "$GITHUB_STEP_SUMMARY"
195-
196149
flatpak-runtime-smoke:
197150
name: Flatpak routing runtime smoke
198151
needs: runtime-risk
@@ -220,58 +173,6 @@ jobs:
220173
- name: Build and run Flatpak routing runtime smoke
221174
run: tools/run_flatpak_runtime_smoke_ci.sh
222175

223-
live-ui-runtime-smoke:
224-
name: Live UI runtime smoke
225-
needs: live-ui-risk
226-
if: ${{ needs['live-ui-risk'].outputs.required == 'true' }}
227-
runs-on: ubuntu-24.04
228-
timeout-minutes: 90
229-
230-
steps:
231-
- name: Check out repository
232-
uses: actions/checkout@v6
233-
with:
234-
ref: ${{ inputs.target }}
235-
236-
- name: Install live UI runtime dependencies
237-
run: |
238-
sudo apt-get update
239-
sudo apt-get install -y \
240-
appstream \
241-
at-spi2-core \
242-
build-essential \
243-
dbus-user-session \
244-
desktop-file-utils \
245-
gir1.2-adw-1 \
246-
gir1.2-gtk-4.0 \
247-
git \
248-
gnome-shell \
249-
gobject-introspection \
250-
libebur128-1 \
251-
libgirepository1.0-dev \
252-
libglib2.0-dev \
253-
libpipewire-0.3-dev \
254-
libspa-0.2-modules \
255-
meson \
256-
ninja-build \
257-
pipewire \
258-
pipewire-bin \
259-
pkg-config \
260-
python3 \
261-
python3-cairo \
262-
python3-dev \
263-
python3-gi \
264-
python3-numpy \
265-
python3-pip \
266-
python3-pyatspi \
267-
python3-setuptools \
268-
python3-venv \
269-
patchelf \
270-
wireplumber
271-
272-
- name: Build source environment and run live UI smoke
273-
run: tools/run_live_ui_runtime_smoke_ci.sh
274-
275176
runtime-gate:
276177
name: Require runtime smoke gate
277178
needs:
@@ -299,33 +200,6 @@ jobs:
299200
echo "Flatpak routing runtime smoke was not required for this dispatch."
300201
fi
301202
302-
live-ui-gate:
303-
name: Require live UI smoke gate
304-
needs:
305-
- live-ui-risk
306-
- live-ui-runtime-smoke
307-
if: ${{ always() }}
308-
runs-on: ubuntu-24.04
309-
310-
steps:
311-
- name: Require live-ui-risk job
312-
if: ${{ needs['live-ui-risk'].result != 'success' }}
313-
run: exit 1
314-
315-
- name: Require live UI smoke
316-
if: ${{ needs['live-ui-risk'].outputs.required == 'true' && needs['live-ui-runtime-smoke'].result != 'success' }}
317-
run: |
318-
echo "::error::Live GTK/AT-SPI/PipeWire runtime smoke is required for this release and did not pass."
319-
exit 1
320-
321-
- name: Confirm live UI gate
322-
run: |
323-
if [ "${{ needs['live-ui-risk'].outputs.required }}" = "true" ]; then
324-
echo "Required live UI runtime smoke passed."
325-
else
326-
echo "Live UI runtime smoke was not required for this dispatch."
327-
fi
328-
329203
preflight:
330204
name: Release preflight
331205
needs: validate-inputs
@@ -347,7 +221,6 @@ jobs:
347221
needs:
348222
- validate-inputs
349223
- runtime-gate
350-
- live-ui-gate
351224
- preflight
352225
runs-on: ubuntu-24.04
353226

AGENTS.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ MINI_EQ_RUN_LIVE_UI=1 .venv/bin/python -m pytest tests/test_mini_eq_live_ui_runt
8888
```
8989

9090
The live UI smoke is opt-in locally because it needs nested GNOME Shell,
91-
AT-SPI, PipeWire, and WirePlumber, but it is a blocking `Release` workflow gate
92-
for app-sensitive publish dispatches.
91+
AT-SPI, PipeWire, and WirePlumber. Treat it as a maintainer confidence check on
92+
a supported recent GNOME/GTK stack; the blocking public release runtime gate is
93+
the Flatpak routing smoke.
9394

9495
For manual GNOME Shell extension testing against an installed Flatpak build,
9596
run the nested devkit smoke. It loads the extension from this checkout and

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ flatpak install flathub io.github.bhack.mini-eq
5151
flatpak run io.github.bhack.mini-eq
5252
```
5353

54-
PyPI and source installs are available for development or for systems with the
55-
required GTK, Libadwaita, PyGObject, PipeWire, WirePlumber, and native
54+
PyPI and source installs are available for development or for systems with a
55+
recent GTK/Libadwaita stack plus PyGObject, PipeWire, WirePlumber, and native
5656
pipewire-gobject build/runtime packages already installed:
5757

5858
```bash
@@ -77,8 +77,8 @@ https://extensions.gnome.org/extension/9803/mini-eq-controls/
7777

7878
Runtime data is stored under `~/.config/mini-eq`.
7979

80-
`pip install mini-eq` installs only the Python package. The system packages
81-
listed in
80+
`pip install mini-eq` installs only the Python package. The recent desktop and
81+
audio system packages listed in
8282
[Development](https://github.com/bhack/mini-eq/blob/main/docs/development.md)
8383
are still required for the app to connect to GTK, PipeWire, and the host
8484
WirePlumber-managed session.

docs/development.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ commands. The README stays focused on using Mini EQ.
66
## System Dependencies
77

88
Mini EQ depends on system desktop/audio packages that Python packaging cannot
9-
fully install: GTK 4.12+ and Libadwaita 1.7+ GI bindings, PyGObject, PipeWire,
10-
WirePlumber as the session manager, and the native libraries required by
11-
pipewire-gobject. Install PyGObject from your distro, such as `python3-gi` or
12-
`python3-gobject`, rather than adding a PyPI PyGObject dependency to Mini EQ.
9+
fully install: a recent GTK/Libadwaita GI stack comparable to the supported
10+
GNOME Flatpak runtime, PyGObject, PipeWire, WirePlumber as the session manager,
11+
and the native libraries required by pipewire-gobject. Install PyGObject from
12+
your distro, such as `python3-gi` or `python3-gobject`, rather than adding a
13+
PyPI PyGObject dependency to Mini EQ.
1314

1415
If your distro ships older GTK or Libadwaita builds, prefer the Flatpak build.
16+
The current UI is validated against the GNOME Flatpak runtime; native distro
17+
installs are best for development on a recent GNOME stack.
1518

1619
Package names vary by distro release. If pip builds pipewire-gobject from its
1720
source distribution, install the GLib, GObject-Introspection, and PipeWire
@@ -151,8 +154,9 @@ MINI_EQ_RUN_LIVE_UI=1 python3 -m pytest tests/test_mini_eq_live_ui_runtime.py -q
151154

152155
These integration smokes are intentionally separate from the default pytest
153156
suite because they require nested GNOME Shell, AT-SPI services, PipeWire, and
154-
WirePlumber. The release workflow promotes the live UI smoke to a blocking gate
155-
for app-sensitive publish dispatches.
157+
WirePlumber. Use the live UI smoke as a maintainer confidence check on a
158+
supported recent GNOME/GTK stack; the public release workflow does not treat
159+
the hosted Ubuntu native GTK stack as the blocking UI runtime.
156160

157161
## Local Flatpak Build
158162

docs/release.md

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@ Run the narrowest gate that covers the release risk:
1414
- **Always:** version metadata, release preflight, GitHub release dry run or
1515
release workflow, TestPyPI install validation, PyPI publish, post-publish
1616
verification, then Flathub stable PR.
17-
- **When application code, UI code, or runtime-sensitive packaging changed:**
18-
live GTK/AT-SPI/PipeWire smoke. Public release workflow dispatches run this
19-
as a blocking job for app-sensitive changes before building publishable
20-
artifacts.
2117
- **When PipeWire, routing, analyzer, Flatpak permissions, runtime dependencies,
2218
or shutdown changed:** local Flatpak install, Flatpak runtime smoke, and
2319
interactive real-music testing before merge or release. Public release
2420
workflow dispatches also run the isolated Flatpak routing smoke as a blocking
2521
job when runtime-sensitive files changed since the previous release tag.
22+
- **When application code, UI code, or state-machine behavior changed:** run the
23+
live GTK/AT-SPI/PipeWire smoke on a supported recent GNOME/GTK stack before
24+
release. The hosted native Ubuntu runner is not the supported Flatpak runtime,
25+
so this smoke is a maintainer confidence gate rather than a blocking public
26+
release job.
2627
- **When background mode, Start at Login, hidden-window lifecycle, or Shell
2728
control changed:** one clean-permission Flatpak portal smoke in a real GNOME
2829
session.
@@ -88,7 +89,7 @@ graph behaves correctly. Treat their claims narrowly:
8889
restore a synthetic stream in an isolated PipeWire/WirePlumber graph.
8990
- The live UI smoke verifies the real GTK app can be driven through AT-SPI
9091
while PipeWire routing, output following, monitor capture, preset reset, and
91-
shutdown are exercised.
92+
shutdown are exercised on the local GNOME/GTK stack used for the smoke.
9293
- Manual real-session audio testing is still required for changes that depend
9394
on host devices, real music playback, WirePlumber policy, or analyzer
9495
behavior users can perceive.
@@ -212,7 +213,8 @@ run the app interactively with real music before release. Exercise
212213
enable/disable, output switching, preset changes, analyzer display, shutdown,
213214
and stream restoration against the actual desktop audio graph.
214215

215-
Before the manual real-music pass, run the live UI smoke. It starts a private
216+
Before the manual real-music pass for app or UI behavior changes, run the live
217+
UI smoke on a supported recent GNOME/GTK stack. It starts a private
216218
PipeWire/WirePlumber graph, synthetic playback, nested headless GNOME Shell,
217219
the real Mini EQ GTK process, and AT-SPI UI controls:
218220

@@ -221,17 +223,18 @@ python3 tools/check_live_ui_runtime.py --timeout 35 --cycles 1
221223
MINI_EQ_RUN_LIVE_UI=1 python3 -m pytest tests/test_mini_eq_live_ui_runtime.py -q
222224
```
223225

224-
The `Release` workflow runs this live UI smoke as a blocking job for app and UI
225-
runtime-sensitive publish dispatches. The pytest wrapper remains opt-in for
226-
local development so ordinary unit test runs stay fast and do not require
227-
nested GNOME Shell or AT-SPI services.
226+
The pytest wrapper remains opt-in for local development so ordinary unit test
227+
runs stay fast and do not require nested GNOME Shell or AT-SPI services. The
228+
hosted native Ubuntu runner is useful for smoke-harness work, but it is not the
229+
supported Flatpak runtime and is not a release-blocking UI authority.
228230

229231
There is an optional hosted Flatpak runtime smoke path in the `CI` workflow.
230232
Use it as extra signal or for smoke-harness work; keep the local runtime smoke
231233
as the release check when app/runtime routing behavior changed. The `Release`
232234
workflow also runs release preflight as a blocking job and has its own blocking
233-
copy of the Flatpak routing smoke and live UI smoke gates for public TestPyPI,
234-
PyPI, and GitHub release dispatches.
235+
copy of the Flatpak routing smoke gate for public TestPyPI, PyPI, and GitHub
236+
release dispatches. A future Flatpak/GNOME-runtime UI smoke can become
237+
blocking once it drives the installed Flatpak instead of the host GTK stack.
235238

236239
## Package Channels
237240

src/mini_eq/deps.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
)
3333
PYGOBJECT_HINT = "Ubuntu/Debian: python3-gi; Fedora: python3-gobject; Arch: python-gobject"
3434
PYCAIRO_HINT = "Ubuntu/Debian: python3-cairo; Fedora: python3-cairo; Arch: python-cairo"
35-
GTK_HINT = "Ubuntu/Debian: gir1.2-gtk-4.0; Fedora: gtk4; Arch: gtk4. Requires GTK 4.12+."
36-
ADW_HINT = "Ubuntu/Debian: gir1.2-adw-1; Fedora: libadwaita; Arch: libadwaita. Requires Libadwaita 1.7+."
35+
GTK_HINT = "Ubuntu/Debian: gir1.2-gtk-4.0; Fedora: gtk4; Arch: gtk4. Prefer the Flatpak on older GTK stacks."
36+
ADW_HINT = "Ubuntu/Debian: gir1.2-adw-1; Fedora: libadwaita; Arch: libadwaita. Prefer the Flatpak on older stacks."
3737
PWG_HINT = (
3838
"Install pipewire-gobject from PyPI or your distribution. "
3939
"It also needs system libpipewire-0.3, GLib, GObject, GIO, and PyGObject."
@@ -375,7 +375,7 @@ def collect_dependency_checks() -> list[DependencyCheck]:
375375
check_python_version(),
376376
check_python_import("gi", "PyGObject", True, PYGOBJECT_HINT),
377377
check_python_import("cairo", "pycairo", True, PYCAIRO_HINT),
378-
check_gi_repository_attribute("Gtk", "4.0", "Button.set_can_shrink", "GTK 4.12+ GI namespace", True, GTK_HINT),
378+
check_gi_repository_attribute("Gtk", "4.0", "Button.set_can_shrink", "GTK 4 GI namespace", True, GTK_HINT),
379379
check_gi_repository("Gdk", "4.0", "GDK 4 GI namespace", True, GTK_HINT),
380380
check_gi_repository("Gsk", "4.0", "GSK 4 GI namespace", True, GTK_HINT),
381381
check_gi_repository("Graphene", "1.0", "Graphene GI namespace", True, GTK_HINT),

tests/test_github_workflows.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,14 @@ def test_release_workflow_blocks_publish_on_runtime_gate() -> None:
3232
assert "runtime-gate" in release_yml.partition("build:")[2].partition("runs-on:")[0]
3333

3434

35-
def test_release_workflow_blocks_publish_on_live_ui_gate() -> None:
35+
def test_release_workflow_does_not_block_publish_on_native_live_ui_gate() -> None:
3636
release_yml = workflow_text("release.yml")
3737

38-
assert "force_live_ui_runtime_smoke" in release_yml
39-
assert "--scope live-ui" in release_yml
40-
assert "live-ui-risk:" in release_yml
41-
assert "live-ui-runtime-smoke:" in release_yml
42-
assert "live-ui-gate:" in release_yml
43-
assert "tools/run_live_ui_runtime_smoke_ci.sh" in release_yml
44-
assert "needs['live-ui-runtime-smoke'].result != 'success'" in release_yml
45-
assert "live-ui-gate" in release_yml.partition("build:")[2].partition("runs-on:")[0]
38+
assert "force_live_ui_runtime_smoke" not in release_yml
39+
assert "--scope live-ui" not in release_yml
40+
assert "live-ui-runtime-smoke:" not in release_yml
41+
assert "live-ui-gate:" not in release_yml
42+
assert "tools/run_live_ui_runtime_smoke_ci.sh" not in release_yml
4643

4744

4845
def test_release_workflow_blocks_publish_on_release_preflight() -> None:
@@ -64,11 +61,11 @@ def test_ci_scope_treats_release_workflow_and_release_gate_tools_as_tested_chang
6461

6562

6663
def test_live_ui_runtime_smoke_uses_host_gir_build_environment() -> None:
67-
release_yml = workflow_text("release.yml")
6864
ci_yml = workflow_text("ci.yml")
6965
script = (ROOT / "tools/run_live_ui_runtime_smoke_ci.sh").read_text(encoding="utf-8")
7066

71-
assert "patchelf" in release_yml
7267
assert "patchelf" in ci_yml
7368
assert "pipewire-gobject" in script
7469
assert "--no-build-isolation" in script
70+
assert "pip install -e ." in script
71+
assert ".[dev]" not in script

tools/release_preflight.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,9 @@ def run_live_ui_runtime_smoke_notice() -> None:
200200
for path in changes:
201201
print(f" {path}")
202202
print(
203-
"Run the live GTK/AT-SPI/PipeWire smoke before releasing this change. "
204-
"The Release workflow also blocks public publish dispatches on this smoke."
203+
"Run the live GTK/AT-SPI/PipeWire smoke on a supported recent GNOME/GTK stack before "
204+
"releasing this change. The Release workflow does not treat the hosted native Ubuntu GTK "
205+
"stack as the blocking UI runtime."
205206
)
206207

207208

tools/run_live_ui_runtime_smoke_ci.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ PY
2929
)"
3030
"$venv/bin/python" -m pip install "meson-python>=0.18" "meson>=1.2" ninja packaging
3131
"$venv/bin/python" -m pip install --no-build-isolation "$pwg_requirement"
32-
"$venv/bin/python" -m pip install -e '.[dev]'
32+
"$venv/bin/python" -m pip install -e .
3333
"$venv/bin/python" tools/check_live_ui_runtime.py \
3434
--timeout "$timeout" \
3535
--cycles "$cycles" \

0 commit comments

Comments
 (0)