Skip to content

Commit

Permalink
ci(flatpak): add flatpak builder lint (#2799)
Browse files Browse the repository at this point in the history
  • Loading branch information
ReenigneArcher authored Jul 7, 2024
1 parent acccacf commit 37b60fb
Show file tree
Hide file tree
Showing 18 changed files with 235 additions and 52 deletions.
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# ensure dockerfiles are checked out with LF line endings
Dockerfile text eol=lf
*.dockerfile text eol=lf

# ensure flatpak lint json files are checked out with LF line endings
*flatpak-lint-*.json text eol=lf
73 changes: 65 additions & 8 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ jobs:
matrix: ${{ steps.flatpak_matrix.outputs.matrix }}

build_linux_flatpak:
env:
APP_ID: dev.lizardbyte.app.Sunshine
name: Linux Flatpak
runs-on: ubuntu-22.04
needs: [setup_release, setup_flatpak_matrix]
Expand Down Expand Up @@ -157,20 +159,75 @@ jobs:
-DSUNSHINE_CONFIGURE_ONLY=ON \
..
- name: Debug Manifest
working-directory: build
run: |
cat ${APP_ID}.yml
- name: Build Linux Flatpak
working-directory: build
run: |
sudo su $(whoami) -c 'flatpak run org.flatpak.Builder --arch=${{ matrix.arch }} --repo=repo --force-clean \
--stop-at=cuda build-sunshine dev.lizardbyte.sunshine.yml'
sudo su $(whoami) -c "flatpak run org.flatpak.Builder --arch=${{ matrix.arch }} --repo=repo --force-clean \
--stop-at=cuda build-sunshine ${APP_ID}.yml"
cp -r .flatpak-builder copy-of-flatpak-builder
sudo su $(whoami) -c 'flatpak run org.flatpak.Builder --arch=${{ matrix.arch }} --repo=repo --force-clean \
build-sunshine dev.lizardbyte.sunshine.yml'
sudo su $(whoami) -c "flatpak run org.flatpak.Builder --arch=${{ matrix.arch }} --repo=repo --force-clean \
build-sunshine ${APP_ID}.yml"
rm -rf .flatpak-builder
mv copy-of-flatpak-builder .flatpak-builder
sudo su $(whoami) -c 'flatpak build-bundle --arch=${{ matrix.arch }} ./repo \
../artifacts/sunshine_${{ matrix.arch }}.flatpak dev.lizardbyte.sunshine'
sudo su $(whoami) -c 'flatpak build-bundle --runtime --arch=${{ matrix.arch }} ./repo \
../artifacts/sunshine_debug_${{ matrix.arch }}.flatpak dev.lizardbyte.sunshine.Debug'
sudo su $(whoami) -c "flatpak build-bundle --arch=${{ matrix.arch }} ./repo \
../artifacts/sunshine_${{ matrix.arch }}.flatpak ${APP_ID}"
sudo su $(whoami) -c "flatpak build-bundle --runtime --arch=${{ matrix.arch }} ./repo \
../artifacts/sunshine_debug_${{ matrix.arch }}.flatpak ${APP_ID}.Debug"
- name: Lint Flatpak
working-directory: build
run: |
echo "Linting flatpak manifest"
flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
manifest ${APP_ID}.yml > _flatpak-lint-exceptions_manifest.json || true
echo "Linting flatpak repo"
# TODO: add arg
# --mirror-screenshots-url=https://dl.flathub.org/media \
flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
repo repo > _flatpak-lint-exceptions_repo.json || true
checks=(manifest repo)
exit_code=0
# check if files are equal
for check in "${checks[@]}"; do
echo "Validating $check"
# load baseline and result files
baseline="${{ github.workspace }}/packaging/linux/flatpak/flatpak-lint-baseline_${check}.json"
result="_flatpak-lint-exceptions_${check}.json"
# Extract errors from both JSON files
readarray -t result_errors < <(jq -r '.errors[]' "$result")
readarray -t baseline_errors < <(jq -r '.errors[]' "$baseline")
# Loop through result errors and check against baseline errors
for error in "${result_errors[@]}"; do
if printf '%s\n' "${baseline_errors[@]}" | grep -q -F "$error"; then
echo "::warning:: '$error'"
else
echo "::error:: '$error'"
exit_code=1
fi
done
done
# if exit code is not 0, print results
if [ $exit_code -ne 0 ]; then
echo "Manifest lint results:"
cat _flatpak-lint-exceptions_manifest.json
echo "Repo lint results:"
cat _flatpak-lint-exceptions_repo.json
fi
# exit with the correct code
exit $exit_code
- name: Upload Artifacts
uses: actions/upload-artifact@v4
Expand Down
6 changes: 5 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ project(Sunshine VERSION 0.0.0
DESCRIPTION "Self-hosted game stream host for Moonlight"
HOMEPAGE_URL "https://app.lizardbyte.dev/Sunshine")

set(PROJECT_LICENSE "GPL-3.0")
set(PROJECT_LICENSE "GPL-3.0-only")

set(PROJECT_FQDN "dev.lizardbyte.app.Sunshine")

set(PROJECT_BRIEF_DESCRIPTION "GameStream host for Moonlight") # must be <= 35 characters

set(PROJECT_LONG_DESCRIPTION "Offering low latency, cloud gaming server capabilities with support for AMD, Intel, \
and Nvidia GPUs for hardware encoding. Software encoding is also available. You can connect to Sunshine from any \
Expand Down
38 changes: 29 additions & 9 deletions cmake/packaging/linux.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,14 @@ endif()
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)

# application icon
install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps")
if(NOT ${SUNSHINE_BUILD_FLATPAK})
install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps")
else()
install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps"
RENAME "${PROJECT_FQDN}.svg")
endif()

# tray icon
if(${SUNSHINE_TRAY} STREQUAL 1)
Expand All @@ -103,18 +109,32 @@ endif()

# desktop file
# todo - validate desktop files with `desktop-file-validate`
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.desktop"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
if(NOT ${SUNSHINE_BUILD_APPIMAGE})
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine_terminal.desktop"
if(NOT ${SUNSHINE_BUILD_FLATPAK})
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.desktop"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
else()
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.desktop"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
RENAME "${PROJECT_FQDN}.desktop")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine_kms.desktop"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
RENAME "${PROJECT_FQDN}_kms.desktop")
endif()
if(${SUNSHINE_BUILD_FLATPAK})
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine_kms.desktop"
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine_terminal.desktop"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
RENAME "${PROJECT_FQDN}_terminal.desktop")
elseif(NOT ${SUNSHINE_BUILD_APPIMAGE})
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine_terminal.desktop"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
endif()

# metadata file
# todo - validate file with `appstream-util validate-relax`
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.appdata.xml"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo")
if(NOT ${SUNSHINE_BUILD_FLATPAK})
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.appdata.xml"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo")
else()
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_FQDN}.metainfo.xml"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo")
endif()
8 changes: 8 additions & 0 deletions cmake/prep/init.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,12 @@ elseif (UNIX)
if(NOT DEFINED SUNSHINE_EXECUTABLE_PATH)
set(SUNSHINE_EXECUTABLE_PATH "sunshine")
endif()

if(SUNSHINE_BUILD_FLATPAK)
set(SUNSHINE_SERVICE_START_COMMAND "ExecStart=${PROJECT_FQDN}")
set(SUNSHINE_SERVICE_STOP_COMMAND "ExecStop=flatpak kill ${PROJECT_FQDN}")
else()
set(SUNSHINE_SERVICE_START_COMMAND "ExecStart=${SUNSHINE_EXECUTABLE_PATH}")
set(SUNSHINE_SERVICE_STOP_COMMAND "")
endif()
endif ()
6 changes: 5 additions & 1 deletion cmake/prep/special_package_configuration.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,16 @@ if(APPLE)
endif()
elseif(UNIX)
# configure the .desktop file
set(SUNSHINE_DESKTOP_ICON "sunshine.svg")
if(${SUNSHINE_BUILD_APPIMAGE})
configure_file(packaging/linux/AppImage/sunshine.desktop sunshine.desktop @ONLY)
elseif(${SUNSHINE_BUILD_FLATPAK})
set(SUNSHINE_DESKTOP_ICON "${PROJECT_FQDN}.svg")
configure_file(packaging/linux/flatpak/sunshine.desktop sunshine.desktop @ONLY)
configure_file(packaging/linux/flatpak/sunshine_kms.desktop sunshine_kms.desktop @ONLY)
configure_file(packaging/linux/sunshine_terminal.desktop sunshine_terminal.desktop @ONLY)
configure_file(packaging/linux/flatpak/${PROJECT_FQDN}.metainfo.xml
${PROJECT_FQDN}.metainfo.xml @ONLY)
else()
configure_file(packaging/linux/sunshine.desktop sunshine.desktop @ONLY)
configure_file(packaging/linux/sunshine_terminal.desktop sunshine_terminal.desktop @ONLY)
Expand All @@ -35,7 +39,7 @@ elseif(UNIX)

# configure the flatpak manifest
if(${SUNSHINE_CONFIGURE_FLATPAK_MAN})
configure_file(packaging/linux/flatpak/dev.lizardbyte.sunshine.yml dev.lizardbyte.sunshine.yml @ONLY)
configure_file(packaging/linux/flatpak/${PROJECT_FQDN}.yml ${PROJECT_FQDN}.yml @ONLY)
file(COPY packaging/linux/flatpak/deps/ DESTINATION ${CMAKE_BINARY_DIR})
file(COPY packaging/linux/flatpak/modules DESTINATION ${CMAKE_BINARY_DIR})
endif()
Expand Down
16 changes: 8 additions & 8 deletions docs/source/about/setup.rst
Original file line number Diff line number Diff line change
Expand Up @@ -148,25 +148,25 @@ Install
Additional installation (required)
.. code-block:: bash
flatpak run --command=additional-install.sh dev.lizardbyte.sunshine
flatpak run --command=additional-install.sh dev.lizardbyte.app.Sunshine
Start:
X11 and NVFBC capture (X11 Only)
.. code-block:: bash
flatpak run dev.lizardbyte.sunshine
flatpak run dev.lizardbyte.app.Sunshine
KMS capture (Wayland & X11)
.. code-block:: bash
sudo -i PULSE_SERVER=unix:$(pactl info | awk '/Server String/{print$3}') \
flatpak run dev.lizardbyte.sunshine
flatpak run dev.lizardbyte.app.Sunshine
Uninstall:
.. code-block:: bash
flatpak run --command=remove-additional-install.sh dev.lizardbyte.sunshine
flatpak uninstall --delete-data dev.lizardbyte.sunshine
flatpak run --command=remove-additional-install.sh dev.lizardbyte.app.Sunshine
flatpak uninstall --delete-data dev.lizardbyte.app.Sunshine
.. tab:: Homebrew

Expand Down Expand Up @@ -253,7 +253,7 @@ Install
Restart=on-failure
RestartSec=5s
#Flatpak Only
#ExecStop=flatpak kill dev.lizardbyte.sunshine
#ExecStop=flatpak kill dev.lizardbyte.app.Sunshine
[Install]
WantedBy=graphical-session.target
Expand All @@ -268,7 +268,7 @@ Install
deb /usr/bin/sunshine ✔
rpm /usr/bin/sunshine ✔
AppImage ~/sunshine.AppImage ✔
Flatpak flatpak run dev.lizardbyte.sunshine
Flatpak flatpak run dev.lizardbyte.app.Sunshine
======== ============================================== ===============

**Start once**
Expand Down Expand Up @@ -504,7 +504,7 @@ To get a list of available arguments run the following:

.. code-block:: bash
flatpak run --command=sunshine dev.lizardbyte.Sunshine --help
flatpak run --command=sunshine dev.lizardbyte.app.Sunshine --help
Shortcuts
---------
Expand Down
2 changes: 1 addition & 1 deletion docs/source/troubleshooting/general.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ If you forgot your credentials to the web UI, try this.

.. code-block:: bash
flatpak run --command=sunshine dev.lizardbyte.Sunshine --creds {new-username} {new-password}
flatpak run --command=sunshine dev.lizardbyte.app.Sunshine --creds {new-username} {new-password}
Web UI Access
Expand Down
11 changes: 11 additions & 0 deletions packaging/linux/flatpak/apps.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"env": {
"PATH": "$(PATH):$(HOME)/.local/bin"
},
"apps": [
{
"name": "Desktop",
"image-path": "desktop.png"
}
]
}
66 changes: 66 additions & 0 deletions packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.metainfo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>@PROJECT_FQDN@</id>

<name>@CMAKE_PROJECT_NAME@</name>
<summary>@PROJECT_BRIEF_DESCRIPTION@</summary>

<metadata_license>CC0-1.0</metadata_license>
<project_license>@PROJECT_LICENSE@</project_license>

<supports>
<control>pointing</control>
<control>keyboard</control>
<control>touch</control>
<control>gamepad</control>
</supports>

<url type="bugtracker">https://github.com/LizardByte/Sunshine/issues</url>
<url type="homepage">@PROJECT_HOMEPAGE_URL@</url>
<url type="donation">https://app.lizardbyte.dev/#Donate</url>
<url type="contact">https://app.lizardbyte.dev/support</url>
<url type="translate">https://translate.lizardbyte.dev</url>
<url type="contribute">https://docs.lizardbyte.dev</url>
<url type="vcs-browser">https://github.com/LizardByte/Sunshine</url>

<description>
<p>
@PROJECT_LONG_DESCRIPTION@
</p>

<p>NOTE: Allow Sunshine Virtual Input (Required)</p>
<p>sudo chown $USER /dev/uinput &amp;&amp; echo 'KERNEL=="uinput", SUBSYSTEM=="misc",
OPTIONS+="static_node=uinput", TAG+="uaccess"' | sudo tee
/etc/udev/rules.d/60-sunshine-input.rules</p>
<p>NOTE: Sunshine uses a self-signed certificate. The web browser will report it as not secure,
but it is safe.</p>
<p>NOTE: KMS Grab (Optional)</p>
<p>sudo -i PULSE_SERVER=unix:$(pactl info | awk '/Server String/{print$3}')
flatpak run @PROJECT_FQDN@</p>
</description>

<releases>
<release version="0.23.1" date="2024-04-21"/>
<release version="0.23.0" date="2024-04-06"/>
<release version="0.22.2" date="2024-03-15"/>
<release version="0.22.1" date="2024-03-13"/>
<release version="0.22.0" date="2024-03-04"/>
<release version="0.21.0" date="2023-10-15"/>
<release version="0.20.0" date="2023-05-29"/>
<release version="0.19.1" date="2023-03-30"/>
</releases>

<developer_name>LizardByte</developer_name>
<screenshots>
<screenshot type="default">
<image>https://app.lizardbyte.dev/Sunshine/assets/images/AdobeStock_305732536_1920x1280.jpg</image>
<caption>Sunshine</caption>
</screenshot>
</screenshots>
<content_rating type="oars-1.0">
<content_attribute id="language-profanity">moderate</content_attribute>
<content_attribute id="language-humor">mild</content_attribute>
<content_attribute id="money-purchasing">mild</content_attribute>
</content_rating>
<launchable type="desktop-id">@PROJECT_FQDN@.desktop</launchable>
</component>
Loading

0 comments on commit 37b60fb

Please sign in to comment.