Piplup 1 год назад
Родитель
Сommit
5fa74574ba

+ 40 - 0
.github/workflows/build.yml

@@ -73,6 +73,39 @@ jobs:
           chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh
         if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
 
+      - name: Build AppImage
+        if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
+        run: |
+          PLATFORM_NAME="${{ matrix.platform.name }}"
+
+          sudo apt install -y zsync desktop-file-utils appstream
+
+          mkdir -p tools
+          export PATH="$PATH:$(readlink -f tools)"
+
+          # Setup appimagetool
+          wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
+          chmod +x tools/appimagetool
+          chmod +x distribution/linux/appimage/build-appimage.sh
+
+          # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
+          if [ "$PLATFORM_NAME" = "linux-x64" ]; then
+            ARCH_NAME=x64
+            export ARCH=x86_64
+          elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
+            ARCH_NAME=arm64
+            export ARCH=aarch64
+          else
+            echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
+            exit 1
+          fi
+
+          export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync"
+          BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh
+        shell: bash
+        env:
+          RELEASE=0
+
       - name: Upload Ryujinx artifact
         uses: actions/upload-artifact@v4
         with:
@@ -80,6 +113,13 @@ jobs:
           path: publish
         if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
 
+      - name: Upload Ryujinx (AppImage) artifact
+        uses: actions/upload-artifact@v4
+        if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
+        with:
+          name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage
+          path: publish_appimage
+
       - name: Upload Ryujinx.Headless.SDL2 artifact
         uses: actions/upload-artifact@v4
         with:

+ 40 - 1
.github/workflows/release.yml

@@ -23,6 +23,7 @@ env:
   RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "master"
   RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev"
   RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx"
+  RELEASE=1
 
 jobs:
   tag:
@@ -128,12 +129,50 @@ jobs:
           tar -czvf ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
           popd
         shell: bash
+      
+      - name: Build AppImage (Linux)
+        if: matrix.platform.os == 'ubuntu-latest'
+        run: |
+          BUILD_VERSION="${{ steps.version_info.outputs.build_version }}"
+          PLATFORM_NAME="${{ matrix.platform.name }}"
+
+          sudo apt install -y zsync desktop-file-utils appstream
+
+          mkdir -p tools
+          export PATH="$PATH:$(readlink -f tools)"
+
+          # Setup appimagetool
+          wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
+          chmod +x tools/appimagetool
+          chmod +x distribution/linux/appimage/build-appimage.sh
+
+          # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
+          if [ "$PLATFORM_NAME" = "linux-x64" ]; then
+            ARCH_NAME=x64
+            export ARCH=x86_64
+          elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
+            ARCH_NAME=arm64
+            export ARCH=aarch64
+          else
+            echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
+            exit 1
+          fi
+
+          export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync"
+          BUILDDIR=publish_ava OUTDIR=publish_ava_appimage distribution/linux/appimage/build-appimage.sh
+
+          # Add to release output
+          pushd publish_ava_appimage
+          mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage
+          mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync
+          popd
+        shell: bash
 
       - name: Pushing new release
         uses: ncipollo/release-action@v1
         with:
           name: ${{ steps.version_info.outputs.build_version }}
-          artifacts: "release_output/*.tar.gz,release_output/*.zip"
+          artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*"
           tag: ${{ steps.version_info.outputs.build_version }}
           body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
           omitBodyDuringUpdate: true

+ 2 - 0
.gitignore

@@ -16,6 +16,8 @@ x64/
 build/
 [Bb]in/
 [Oo]bj/
+AppDir/
+publish_appimage/
 
 # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
 !packages/*/build/

+ 3 - 0
distribution/linux/appimage/AppRun

@@ -0,0 +1,3 @@
+#!/bin/sh
+CURRENTDIR="$(readlink -f "$(dirname "$0")")"
+exec "$CURRENTDIR"/usr/bin/Ryujinx.sh "$@"

+ 33 - 0
distribution/linux/appimage/build-appimage.sh

@@ -0,0 +1,33 @@
+#!/bin/sh
+set -eu
+
+ROOTDIR="$(readlink -f "$(dirname "$0")")"/../../../
+cd "$ROOTDIR"
+
+BUILDDIR=${BUILDDIR:-publish}
+OUTDIR=${OUTDIR:-publish_appimage}
+UFLAG=${UFLAG:-"gh-releases-zsync|GreemDev|ryujinx|latest|*-x64.AppImage.zsync"}
+
+rm -rf AppDir
+mkdir -p AppDir/usr/bin
+
+cp distribution/linux/Ryujinx.desktop AppDir/Ryujinx.desktop
+cp distribution/linux/appimage/AppRun AppDir/AppRun
+cp src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png AppDir/Ryujinx.svg
+
+
+cp -r "$BUILDDIR"/* AppDir/usr/bin/
+
+# Ensure necessary bins are set as executable
+chmod +x AppDir/AppRun AppDir/usr/bin/Ryujinx*
+
+mkdir -p "$OUTDIR"
+
+appimagetool --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 21 \
+    -u "$UFLAG" \
+    AppDir "$OUTDIR"/Ryujinx.AppImage
+
+# Move zsync file needed for delta updates
+if [ "$RELEASE" = "1" ]; then
+    mv ./*.AppImage.zsync "$OUTDIR"
+fi