Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 158 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,169 @@ on:
jobs:
snap:
runs-on: ubuntu-latest
outputs:
runtime: ${{ steps.upload-runtime.outputs.artifact-id }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6

- name: Free disk space
run: |
sudo rm -rf /usr/local/lib/android
- uses: snapcore/action-build@v1

- name: Build SDK
uses: snapcore/action-build@v1
id: snapcraft
- uses: actions/upload-artifact@v4

- uses: actions/upload-artifact@v6
with:
name: 'snap'
path: ${{ steps.snapcraft.outputs.snap}}

- name: Prepare runtime
run: |
set -eu
git clone --depth 1 --branch gnome-46-2404 https://github.com/ubuntu/gnome-sdk gnome-runtime
mkdir gnome-runtime/base-gnome-sdk
mv ${{ steps.snapcraft.outputs.snap}} gnome-runtime/base-gnome-sdk/
cd gnome-runtime
./local-build.py --prepare-only

- name: Build runtime
uses: snapcore/action-build@v1
id: snapcraft-runtime
with:
path: gnome-runtime

- name: Delete old snap
run: |
rm -f gnome-runtime/base-gnome-sdk/*.snap

- uses: actions/upload-artifact@v6
id: upload-runtime
with:
name: 'snap-runtime'
path: ${{ steps.snapcraft-runtime.outputs.snap}}

testing:
Comment thread
sergio-costas marked this conversation as resolved.
strategy:
fail-fast: false
matrix:
# define in 'snapname' the name of each snap to test
snapname:
- cheese
- chromium
- darktable
- evince
- firefox
- gimp
- gnome-calculator
- gnome-system-monitor
- gnome-text-editor
- kicad
- mattermost-desktop
- shotwell
- telegram-desktop
- thunderbird
# - epiphany
# here, in waittext, define the text to find for each snap
# more variables are:
# - commandname: the command to run instead of 'snap run $snapname'
# - timeout: the timeout to wait for the text to appear. Default is 20 seconds.
# - connections: an space-separated list of plugs that must be connected
# - enablex11: if true, will enable Xwayland
# - separated: if true, the words will be split and must be found each anywhere in the screen
include:
- snapname: "cheese"
waittext: "Take a Photo"
- snapname: "chromium"
waittext: "New Tab"
enablex11: "true"
- snapname: "darktable"
waittext: "darktable lighttable darkroom"
separated: "true"
- snapname: "evince"
waittext: "Document Viewer Open"
- snapname: "firefox"
waittext: "Welcome to Firefox"
- snapname: "gimp"
waittext: "Welcome to GIMP"
- snapname: "gnome-calculator"
waittext: "Basic mod"
separated: "true"
- snapname: "gnome-system-monitor"
waittext: "Network Resources Processes Disk Memory Swap CPU"
separated: "true"
- snapname: "gnome-text-editor"
waittext: "New Document"
- snapname: "kicad"
waittext: "Configure KiCad"
enablex11: "true"
- snapname: "mattermost-desktop"
waittext: "Mattermost"
separated: "true"
commandname: "snap run mattermost-desktop"
enablex11: "true"
connections: "login-session-observe"
- snapname: "shotwell"
waittext: "Shotwell"
- snapname: "telegram-desktop"
waittext: "Welcome to the official Telegram Desktop app"
- snapname: "thunderbird"
waittext: "Thunderbird will automatically search"
# Current snapped version of epiphany fails to launch. Seems fixed in upstream.
# - snapname: "epiphany"
# waittext: "Set as Default Browser"
# enablex11: "true"
runs-on: ubuntu-latest
needs: snap
steps:
- name: Get data
uses: actions/checkout@v6
- name: Download artifact
id: download-snap
uses: actions/download-artifact@v8
with:
artifact-ids: ${{ needs.snap.outputs.runtime }}
- name: Install tools
run: |
set -eu
sudo snap refresh
sudo apt update
# dbus-x11 is required because it contains dbus-launch!!
# x11-apps are required to wait for XWayland
sudo apt install -y \
dbus-daemon \
dconf-gsettings-backend \
xwayland \
gnome-keyring \
wayland-utils \
xdg-desktop-portal-gnome \
dbus-x11 \
x11-apps \
gnome-session-common \
gnome-settings-daemon
# to be able to use Xwayland, --devmode is required
sudo snap install --devmode mir-test-tools
sudo snap install --beta yarf
sudo snap connect yarf:process-control
sudo snap install --dangerous ${{ steps.download-snap.outputs.download-path}}/*.snap

# test application with the new runtime
- name: Test application
run: |
export TEST_SNAPNAME=${{ matrix.snapname }}
export TEST_WAITTEXT="${{ matrix.waittext }}"
export TEST_COMMAND_NAME="${{ matrix.commandname }}"
export TEST_DO_ENABLE_X11=${{ matrix.enablex11 }}
export TEST_DO_SEPARATED=${{ matrix.separated }}
export TEST_TIMEOUT=${{ matrix.timeout }}
export TEST_IFACE_CONNECTIONS=${{ matrix.connections }}

./.github/workflows/test_script.sh

- uses: actions/upload-artifact@v6
id: upload-yarf-log
if: always()
with:
path: ~/snap/yarf/common/yarf-outdir
name: yarf-failure-${{ matrix.snapname }}
137 changes: 137 additions & 0 deletions .github/workflows/test_script.sh
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use a clearer name what this is about

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you propose, instead?

Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
#!/bin/bash

Comment thread
3v1n0 marked this conversation as resolved.
set -eux -o pipefail

export TEST_COMMAND_NAME="${TEST_COMMAND_NAME:-snap run ${TEST_SNAPNAME}}"
# default value for TEST_TIMEOUT: 20 seconds
export TEST_TIMEOUT=${TEST_TIMEOUT:-20}

echo Testing ${TEST_SNAPNAME} with $TEST_COMMAND_NAME and waiting for ${TEST_WAITTEXT}
rm -rf ./testRobot
mkdir ./testRobot

TEST_ROBOT_FILE=./testRobot/app.robot
cat > $TEST_ROBOT_FILE <<EOF
*** Settings ***
Resource kvm.resource
Library Process

*** Tasks ***
Do test
EOF
if [[ "${TEST_DO_SEPARATED}" == "true" ]]; then
for entry in ${TEST_WAITTEXT}; do
echo " Match Text ${entry} ${TEST_TIMEOUT}" >> ${TEST_ROBOT_FILE}
export TEST_TIMEOUT=""
done
echo " Sleep 5" >> ${TEST_ROBOT_FILE}
for entry in ${TEST_WAITTEXT}; do
echo " Match Text ${entry}" >> ${TEST_ROBOT_FILE}
done
else
cat >> $TEST_ROBOT_FILE <<EOF
Match Text ${TEST_WAITTEXT} ${TEST_TIMEOUT}
Sleep 5
Match Text ${TEST_WAITTEXT}
EOF
fi
cat >> $TEST_ROBOT_FILE <<EOF
Keys Combo Alt_L F4
[Teardown] Run Keyword Log Screenshot
EOF

echo "Test robot file:"
cat ${TEST_ROBOT_FILE}
sudo snap install ${TEST_SNAPNAME} || echo Snap already installed
# This is needed because the gnome runtime has been installed manually with --dangerous
sudo snap connect ${TEST_SNAPNAME}:gnome-46-2404 gnome-46-2404:gnome-46-2404
for plug in ${TEST_IFACE_CONNECTIONS}; do
sudo snap connect ${TEST_SNAPNAME}:${plug}
done
sudo /usr/lib/snapd/snap-discard-ns ${TEST_SNAPNAME}
echo Current connections:
snap connections ${TEST_SNAPNAME}
echo

MYUID=$(id -u)
export WAYLAND_DISPLAY=/run/user/${MYUID}/wayland-0
export MIR_SERVER_ADD_WAYLAND_EXTENSIONS=zwlr_screencopy_manager_v1:zwlr_virtual_pointer_manager_v1
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${MYUID}/bus
export LANG=en_US.UTF-8
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
export XDG_MENU_PREFIX=gnome-
export XDG_SESSION_DESKTOP=ubuntu
export XDG_SESSION_TYPE=wayland
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_SESSION_CLASS=user
export XDG_RUNTIME_DIR=/run/user/${MYUID}
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
export GNOME_SHELL_SESSION_MODE=ubuntu
export GNOME_SETUP_DISPLAY=:1

# use only GTK portal, since mutter isn't running
sudo sed -i -e 's/gnome;gtk;/gtk;/g' /usr/share/xdg-desktop-portal/gnome-portals.conf
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mmh, sketchy. we could avoid lying about being a GNOME desktop instead, and it should default to xdg-desktop-portal-gtk already.

On the other hand, I know for a fact that some third party applications check for XDG_CURRENT_DESKTOP=GNOME before enabling some features so maybe this more realistic than not lying about being GNOME...


# this must be defined after launching the demo server; if not, it won't launch
unset DISPLAY
export ENABLE_X11_PROP=""
if [[ "${TEST_DO_ENABLE_X11}" == "true" ]]; then
export ENABLE_X11_PROP="--enable-x11=true"
export DISPLAY=:0
fi

mir-test-tools.demo-server --platform-display-libs mir:virtual --virtual-output 1920x1080 ${ENABLE_X11_PROP} & MIR_PID=$! # starts the demo Mir compositor

counter=0
until wayland-info > /dev/null || (( ${counter} > 30 )); do
echo waiting for mir server...
sleep 1
counter=$((counter+1))
done

if [[ "${TEST_DO_ENABLE_X11}" == "true" ]]; then
counter=0
until (( ${counter} > 30 )); do
timeout 2 xclock || EXIT_CODE=$?
# 124 is "timeout"
if (( "EXIT_CODE" == "124" )); then
# end loop if timed out
echo XWayland available
counter=50
else
echo Waiting for XWayland to be available
sleep 1
fi
done
unset WAYLAND_DISPLAY
export XDG_SESSION_TYPE=x11
fi

echo Launching ${TEST_COMMAND_NAME}
${TEST_COMMAND_NAME} & command_pid=$!

echo Launching YARF
YARF_RETERR=0
APP_RETERR=0
MIR_RETERR=0
yarf --platform Mir ./testRobot || YARF_RETERR=$?

echo Journal
journalctl --user --no-pager

echo Waiting for application to die
# wait up to 10 seconds for the snap to finish.
timeout 10 tail --pid=${command_pid} -f /dev/null || /bin/true

echo killing MIR server
# kill DBus and MIR and wait for it to fully finish.
kill $MIR_PID
wait $MIR_PID

echo Cleaning up
# remove user data, just in case
rm -rf ~/snap/${TEST_SNAPNAME}
sudo snap remove ${TEST_SNAPNAME} || echo Failed to remove the snap
rm -rf ./testRobot
# only fail after cleanup
exit ${YARF_RETERR}
Loading