Run testbed with Textual in CI #6637
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
workflow_call: | |
inputs: | |
attest-package: | |
description: "Create GitHub provenance attestation for the package." | |
default: "false" | |
type: string | |
outputs: | |
artifact-basename: | |
description: "Base name of the uploaded artifacts; use for artifact retrieval." | |
value: ${{ jobs.package.outputs.artifact-basename }} | |
env: | |
min_python_version: "3.8" | |
max_python_version: "3.12" | |
FORCE_COLOR: "1" | |
defaults: | |
run: | |
shell: bash | |
# Cancel active CI runs for a PR before starting another run | |
concurrency: | |
group: ${{ github.workflow}}-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
# pre-commit: | |
# name: Pre-commit checks | |
# uses: beeware/.github/.github/workflows/pre-commit-run.yml@main | |
# with: | |
# pre-commit-source: "./core[dev]" | |
# | |
# towncrier: | |
# name: Check towncrier | |
# uses: beeware/.github/.github/workflows/towncrier-run.yml@main | |
# with: | |
# tox-source: "./core[dev]" | |
# | |
# package: | |
# name: Package Toga | |
# permissions: | |
# id-token: write | |
# contents: read | |
# attestations: write | |
# strategy: | |
# matrix: | |
# subdir: | |
# - "android" | |
# - "cocoa" | |
# - "core" | |
# - "demo" | |
# - "dummy" | |
# - "gtk" | |
# - "iOS" | |
# - "toga" | |
# - "textual" | |
# - "web" | |
# - "winforms" | |
# uses: beeware/.github/.github/workflows/python-package-create.yml@main | |
# with: | |
# build-subdirectory: ${{ matrix.subdir }} | |
# attest: ${{ inputs.attest-package }} | |
# core: | |
# name: Test core | |
# runs-on: ${{ matrix.platform }} | |
# needs: [ pre-commit, towncrier, package ] | |
# continue-on-error: ${{ matrix.experimental }} | |
# strategy: | |
# fail-fast: false | |
# matrix: | |
# platform: [ "macos-12", "macos-14", "ubuntu-latest", "windows-latest" ] | |
# python-version: [ "3.8", "3.12", "3.13-dev" ] | |
# include: | |
# - experimental: false | |
# # Test Python 3.9-3.11 on Ubuntu only | |
# - platform: "ubuntu-latest" | |
# python-version: "3.9" | |
# experimental: false | |
# - platform: "ubuntu-latest" | |
# python-version: "3.10" | |
# experimental: false | |
# - platform: "ubuntu-latest" | |
# python-version: "3.11" | |
# experimental: false | |
# # Allow development Python to fail without failing entire job. | |
# - python-version: "3.13-dev" | |
# experimental: true | |
# exclude: | |
# # macos-14 (i.e. arm64) does not support Python 3.8 | |
# - platform: "macos-14" | |
# python-version: "3.8" | |
# # Pillow isn't available for Python 3.13 on Windows | |
# - platform: "windows-latest" | |
# python-version: "3.13-dev" | |
# steps: | |
# - name: Checkout | |
# uses: actions/checkout@v4.1.7 | |
# with: | |
# fetch-depth: 0 | |
# | |
# - name: Set up Python ${{ matrix.python-version }} | |
# uses: actions/setup-python@v5.2.0 | |
# with: | |
# python-version: ${{ matrix.python-version }} | |
# | |
# - name: Install Tox | |
# uses: beeware/.github/.github/actions/install-requirement@main | |
# with: | |
# requirements: tox | |
# extra: dev | |
# project-root: core | |
# | |
# - name: Get Packages | |
# uses: actions/download-artifact@v4.1.8 | |
# with: | |
# pattern: ${{ format('{0}-*', needs.package.outputs.artifact-basename) }} | |
# merge-multiple: true | |
# path: dist | |
# | |
# - name: Test | |
# run: | | |
# # The $(ls ...) shell expansion is done in the Github environment; | |
# # the value of TOGA_INSTALL_COMMAND will be a literal string without any shell expansions to perform | |
# TOGA_INSTALL_COMMAND="python -m pip install ../$(ls dist/toga_core-*.whl)[dev] ../$(ls dist/toga_dummy-*.whl)" \ | |
# tox -e py-cov | |
# tox -qe coverage$(tr -dc "0-9" <<< "${{ matrix.python-version }}") | |
# mv core/.coverage core/.coverage.${{ matrix.platform }}.${{ matrix.python-version }} | |
# | |
# - name: Store Coverage Data | |
# uses: actions/upload-artifact@v4.4.0 | |
# with: | |
# name: core-coverage-data-${{ matrix.platform }}-${{ matrix.python-version }} | |
# path: "core/.coverage.*" | |
# if-no-files-found: error | |
# include-hidden-files: true | |
# | |
# core-coverage: | |
# name: Coverage | |
# needs: core | |
# runs-on: ubuntu-latest | |
# steps: | |
# - name: Checkout | |
# uses: actions/checkout@v4.1.7 | |
# with: | |
# fetch-depth: 0 | |
# | |
# - name: Set up Python ${{ env.min_python_version }} | |
# uses: actions/setup-python@v5.2.0 | |
# with: | |
# # Use minimum version of python for coverage to avoid phantom branches | |
# # https://github.com/nedbat/coveragepy/issues/1572#issuecomment-1522546425 | |
# python-version: ${{ env.min_python_version }} | |
# | |
# - name: Install Tox | |
# uses: beeware/.github/.github/actions/install-requirement@main | |
# with: | |
# requirements: tox | |
# extra: dev | |
# project-root: core | |
# | |
# - name: Retrieve Coverage Data | |
# uses: actions/download-artifact@v4.1.8 | |
# with: | |
# pattern: core-coverage-data-* | |
# path: core | |
# merge-multiple: true | |
# | |
# - name: Generate Coverage Report | |
# run: tox -e coverage-html-fail-platform | |
# | |
# - name: Upload HTML Coverage Report | |
# uses: actions/upload-artifact@v4.4.0 | |
# if: failure() | |
# with: | |
# name: html-coverage-report | |
# path: core/htmlcov | |
testbed: | |
name: Testbed | |
# needs: core | |
runs-on: ${{ matrix.runs-on }} | |
strategy: | |
fail-fast: false | |
matrix: | |
backend: | |
- "macOS-x86_64" | |
- "macOS-arm64" | |
- "windows" | |
- "linux-x11" | |
- "linux-wayland" | |
- "android" | |
- "iOS" | |
- "textual-linux" | |
- "textual-macOS" | |
- "textual-windows" | |
include: | |
- pre-command: "" | |
briefcase-run-prefix: "" | |
briefcase-run-args: "" | |
setup-python: true | |
- backend: "macOS-x86_64" | |
platform: "macOS" | |
runs-on: "macos-12" | |
app-user-data-path: "$HOME/Library/Application Support/org.beeware.toga.testbed" | |
- backend: "macOS-arm64" | |
platform: "macOS" | |
runs-on: "macos-14" | |
app-user-data-path: "$HOME/Library/Application Support/org.beeware.toga.testbed" | |
# We use a fixed Ubuntu version rather than `-latest` because at some point, | |
# `-latest` will be updated, but it will be a soft changeover, which would cause | |
# the system Python version to become inconsistent from run to run. | |
- backend: "linux-x11" | |
platform: "linux" | |
runs-on: "ubuntu-22.04" | |
# The package list should be the same as in tutorial-0.rst, and the BeeWare | |
# tutorial, plus blackbox to provide a window manager. We need a window | |
# manager that is reasonably lightweight, honors full screen mode, and | |
# treats the window position as the top-left corner of the *window*, not the | |
# top-left corner of the window *content*. The default GNOME window managers of | |
# most distros meet these requirements, but they're heavyweight; flwm doesn't | |
# work either. Blackbox is the lightest WM we've found that works. | |
pre-command: | | |
sudo apt update -y | |
sudo apt install -y --no-install-recommends \ | |
blackbox pkg-config python3-dev libgirepository1.0-dev libcairo2-dev \ | |
gir1.2-webkit2-4.1 gir1.2-xapp-1.0 | |
# Start Virtual X Server | |
echo "Start X server..." | |
Xvfb :99 -screen 0 2048x1536x24 & | |
sleep 1 | |
# Start Window Mmanager | |
echo "Start window manager..." | |
DISPLAY=:99 blackbox & | |
sleep 1 | |
briefcase-run-prefix: 'DISPLAY=:99' | |
setup-python: false # Use the system Python packages | |
app-user-data-path: "$HOME/.local/share/testbed" | |
- backend: "linux-wayland" | |
platform: "linux" | |
runs-on: "ubuntu-22.04" | |
# The package list should be the same as in tutorial-0.rst, and the BeeWare | |
# tutorial, plus mutter to provide a window manager, and libjpeg-dev for Pillow. | |
pre-command: | | |
sudo apt update -y | |
sudo apt install -y --no-install-recommends \ | |
mutter pkg-config python3-dev libgirepository1.0-dev libcairo2-dev \ | |
gir1.2-webkit2-4.1 gir1.2-xapp-1.0 | |
# Start Virtual X Server | |
echo "Start X server..." | |
Xvfb :99 -screen 0 2048x1536x24 & | |
sleep 1 | |
# Start Window Manager | |
echo "Start window manager..." | |
# mutter is being run inside a virtual X server because mutter's headless | |
# mode is not compatible with Gtk | |
DISPLAY=:99 MUTTER_DEBUG_DUMMY_MODE_SPECS=2048x1536 \ | |
mutter --nested --wayland --no-x11 --wayland-display toga & | |
sleep 1 | |
briefcase-run-prefix: "WAYLAND_DISPLAY=toga" | |
setup-python: false # Use the system Python packages | |
app-user-data-path: "$HOME/.local/share/testbed" | |
- backend: "textual-linux" | |
platform: "linux" | |
runs-on: "ubuntu-22.04" | |
setup-python: false # Use the system Python packages | |
briefcase-run-args: --config 'requires=["../core","../textual"]' --config 'console_app=true' | |
app-user-data-path: "$HOME/.local/share/testbed" | |
- backend: "textual-macOS" | |
platform: "macOS" | |
runs-on: "macos-14" | |
briefcase-run-args: --config 'requires=["../core","../textual"]' --config 'console_app=true' | |
app-user-data-path: "$HOME/Library/Application Support/org.beeware.toga.testbed" | |
- backend: "textual-windows" | |
platform: "windows" | |
runs-on: "windows-latest" | |
briefcase-run-args: --config 'requires=["../core","../textual"]' --config 'console_app=true' | |
app-user-data-path: '$HOME\AppData\Local\Tiberius Yak\Toga Testbed\Data' | |
- backend: "windows" | |
platform: "windows" | |
runs-on: "windows-latest" | |
app-user-data-path: '$HOME\AppData\Local\Tiberius Yak\Toga Testbed\Data' | |
- backend: "iOS" | |
platform: "iOS" | |
runs-on: "macos-14" | |
# As of early April 2024, the XCode 15/iOS 17 simulator had a performance | |
# issue that rendered GitHub Actions testing impossible. The issue didn't | |
# impact iOS 16.4, but that required the use of Xcode 14.3.1. | |
# | |
# Refs #2476, actions/runner-images#9591. | |
pre-command: "sudo xcode-select -s /Applications/Xcode_14.3.1.app" | |
briefcase-run-args: "--device 'iPhone SE (3rd generation)::iOS 16.4'" | |
# briefcase-run-args: "--device 'iPhone SE (3rd generation)'" | |
app-user-data-path: "$(xcrun simctl get_app_container booted org.beeware.toga.testbed data)/Documents" | |
- backend: "android" | |
platform: "android" | |
runs-on: "ubuntu-latest" | |
briefcase-run-prefix: JAVA_HOME=${JAVA_HOME_17_X64} | |
briefcase-run-args: >- | |
--device '{"avd":"beePhone","skin":"pixel_3a"}' | |
--Xemulator=-no-window | |
--Xemulator=-no-snapshot | |
--Xemulator=-no-audio | |
--Xemulator=-no-boot-anim | |
--shutdown-on-exit | |
pre-command: | | |
# allow access to KVM to run the emulator | |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \ | |
| sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
sudo udevadm control --reload-rules | |
sudo udevadm trigger --name-match=kvm | |
steps: | |
# GitHub runners seem to have intermittent connectivity issues. | |
# See https://github.com/beeware/toga/issues/2632 | |
- name: Tune GitHub-hosted runner network | |
uses: smorimoto/tune-github-hosted-runner-network@v1.0.0 | |
- name: Checkout | |
uses: actions/checkout@v4.1.7 | |
with: | |
fetch-depth: 0 | |
- name: Set up Python | |
uses: actions/setup-python@v5.2.0 | |
if: matrix.setup-python | |
with: | |
# We're not using Python 3.11 yet, because: | |
# * The testbed's ProxyEventLoop has some problems with it | |
# (https://github.com/beeware/toga/issues/1982). | |
# * It doesn't have an Android build of Pillow yet. | |
python-version: "3.10" | |
- name: Install Dependencies | |
run: | | |
${{ matrix.pre-command }} | |
# Use the development version of Briefcase | |
python -m pip install -U pip | |
# python -m pip install git+https://github.com/beeware/briefcase.git | |
# TODO: Use the stable release of Briefcase so that binary packages are available. | |
python -m pip install briefcase==0.3.19 | |
- name: Test App | |
working-directory: testbed | |
timeout-minutes: 15 | |
run: | | |
${{ matrix.briefcase-run-prefix }} \ | |
briefcase run ${{ matrix.platform }} --log --test ${{ matrix.briefcase-run-args }} -- --ci | |
- name: Upload Logs | |
uses: actions/upload-artifact@v4.4.0 | |
if: failure() | |
with: | |
name: testbed-failure-logs-${{ matrix.backend }} | |
path: testbed/logs/* | |
- name: Copy App Generated User Data | |
if: failure() && matrix.backend != 'android' | |
run: | | |
mkdir -p testbed/app_data | |
cp -r "${{ matrix.app-user-data-path }}" testbed/app_data/testbed-app_data-${{ matrix.backend }} | |
- name: Upload App Data | |
uses: actions/upload-artifact@v4.4.0 | |
if: failure() && matrix.backend != 'android' | |
with: | |
name: testbed-failure-app-data-${{ matrix.backend }} | |
path: testbed/app_data/* | |
# This step is only needed if you're trying to diagnose test failures that | |
# only occur in CI, and can't be reproduced locally. When it runs, it will | |
# open an SSH server (URL reported in the logs) so you can ssh into the CI | |
# machine. | |
# - name: Setup tmate session | |
# uses: mxschmitt/action-tmate@v3 | |
# if: failure() |