From 5d156672e841a7f5bf61c5e422bc75bcf58bb9a6 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Fri, 4 Nov 2022 14:07:17 +0000 Subject: [PATCH] CI: Add AppImage Build (#452) --- .github/workflows/build.yml | 48 ++++++++++++----- .github/workflows/build_check.yml | 2 +- .../workflows/deploy_experimental_release.yml | 16 +++++- .github/workflows/deploy_stable_release.yml | 20 ++++--- dist/linux/appimage.sh | 50 ++++++++++++++++++ dist/linux/info.cemu.Cemu.png | Bin 0 -> 11984 bytes 6 files changed, 115 insertions(+), 21 deletions(-) create mode 100755 dist/linux/appimage.sh create mode 100644 dist/linux/info.cemu.Cemu.png diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 279fcea6..f5b1fe3b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,34 +22,36 @@ jobs: uses: actions/checkout@v3 with: submodules: "recursive" - + - name: Setup release mode parameters (for deploy) if: ${{ inputs.deploymode == 'release' }} run: | echo "BUILD_MODE=release" >> $GITHUB_ENV echo "BUILD_FLAGS=" >> $GITHUB_ENV echo "Build mode is release" + - name: Setup debug mode parameters (for continous build) if: ${{ inputs.deploymode != 'release' }} run: | echo "BUILD_MODE=debug" >> $GITHUB_ENV echo "BUILD_FLAGS=" >> $GITHUB_ENV echo "Build mode is debug" - + - name: Setup version for experimental if: ${{ inputs.experimentalversion != '' }} run: | echo "[INFO] Experimental version ${{ inputs.experimentalversion }}" echo "BUILD_FLAGS=${{ env.BUILD_FLAGS }} -DEXPERIMENTAL_VERSION=${{ inputs.experimentalversion }}" >> $GITHUB_ENV - + - name: "Install system dependencies" run: | sudo apt update -qq sudo apt install -y clang-12 cmake freeglut3-dev libgcrypt20-dev libgtk-3-dev libpulse-dev libsecret-1-dev libsystemd-dev nasm ninja-build + - name: "Bootstrap vcpkg" run: | bash ./dependencies/vcpkg/bootstrap-vcpkg.sh - + - name: 'Setup NuGet Credentials for vcpkg' shell: 'bash' run: | @@ -66,15 +68,12 @@ jobs: - name: "cmake" run: | - mkdir -p build - cd build - cmake .. ${{ env.BUILD_FLAGS }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_MODE }} -DCMAKE_C_COMPILER=/usr/bin/clang-12 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-12 -G Ninja -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja + cmake -S . -B build ${{ env.BUILD_FLAGS }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_MODE }} -DPORTABLE=OFF -DCMAKE_C_COMPILER=/usr/bin/clang-12 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-12 -G Ninja -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja - name: "Build Cemu" run: | - cd build - ninja - + cmake --build build + - name: Prepare artifact if: ${{ inputs.deploymode == 'release' }} run: mv bin/Cemu_release bin/Cemu @@ -85,8 +84,33 @@ jobs: with: name: cemu-bin-linux-x64 path: ./bin/Cemu - - + + build-appimage: + runs-on: ubuntu-20.04 + needs: build-ubuntu + steps: + - name: Checkout Upstream Repo + uses: actions/checkout@v3 + + - uses: actions/download-artifact@v3 + with: + name: cemu-bin-linux-x64 + path: bin + + - name: "Install system dependencies" + run: | + sudo apt update -qq + sudo apt install -y clang-12 cmake freeglut3-dev libgcrypt20-dev libgtk-3-dev libpulse-dev libsecret-1-dev libsystemd-dev nasm ninja-build + + - name: "Build AppImage" + run: dist/linux/appimage.sh + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: cemu-appimage-x64 + path: artifacts + build-windows: runs-on: windows-2022 steps: diff --git a/.github/workflows/build_check.yml b/.github/workflows/build_check.yml index 49ef79e9..7208db91 100644 --- a/.github/workflows/build_check.yml +++ b/.github/workflows/build_check.yml @@ -11,7 +11,7 @@ on: paths-ignore: - "*.md" branches: - - main + #- main jobs: build: diff --git a/.github/workflows/deploy_experimental_release.yml b/.github/workflows/deploy_experimental_release.yml index 8a5ee0e9..9296c1cc 100644 --- a/.github/workflows/deploy_experimental_release.yml +++ b/.github/workflows/deploy_experimental_release.yml @@ -13,13 +13,18 @@ jobs: runs-on: ubuntu-20.04 needs: call-release-build steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions/download-artifact@v3 with: name: cemu-bin-linux-x64 path: cemu-bin-linux-x64 + - uses: actions/download-artifact@v3 + with: + name: cemu-appimage-x64 + path: cemu-appimage-x64 + - uses: actions/download-artifact@v3 with: name: cemu-bin-windows-x64 @@ -53,7 +58,14 @@ jobs: mv cemu-bin-windows-x64/Cemu.exe ./${{ env.CEMU_FOLDER_NAME }}/Cemu.exe zip -9 -r upload/cemu-${{ env.CEMU_VERSION }}-windows-x64.zip ${{ env.CEMU_FOLDER_NAME }} rm -r ./${{ env.CEMU_FOLDER_NAME }} - + + - name: Create appimage + run: | + VERSION=${{ env.CEMU_VERSION }} + echo "Cemu Version is $VERSION" + ls cemu-appimage-x64 + mv cemu-appimage-x64/Cemu-*-x86_64.AppImage upload/Cemu-$VERSION-x86_64.AppImage + - name: Create release from linux-bin run: | ls ./ diff --git a/.github/workflows/deploy_stable_release.yml b/.github/workflows/deploy_stable_release.yml index 9e880218..5be31413 100644 --- a/.github/workflows/deploy_stable_release.yml +++ b/.github/workflows/deploy_stable_release.yml @@ -15,13 +15,18 @@ jobs: runs-on: ubuntu-20.04 needs: call-release-build steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions/download-artifact@v3 with: name: cemu-bin-linux-x64 path: cemu-bin-linux-x64 + - uses: actions/download-artifact@v3 + with: + name: cemu-appimage-x64 + path: cemu-appimage-x64 + - uses: actions/download-artifact@v3 with: name: cemu-bin-windows-x64 @@ -44,11 +49,7 @@ jobs: echo "Cemu CI version: $(./getversion)" echo "CEMU_FOLDER_NAME=Cemu_$(./getversion)" >> $GITHUB_ENV echo "CEMU_VERSION=$(./getversion)" >> $GITHUB_ENV - - - name: Create appimage - run: | - echo "to do" - + - name: Create release from windows-bin run: | ls ./ @@ -57,6 +58,13 @@ jobs: mv cemu-bin-windows-x64/Cemu.exe ./${{ env.CEMU_FOLDER_NAME }}/Cemu.exe zip -9 -r upload/cemu-${{ env.CEMU_VERSION }}-windows-x64.zip ${{ env.CEMU_FOLDER_NAME }} rm -r ./${{ env.CEMU_FOLDER_NAME }} + + - name: Create appimage + run: | + VERSION=${{ env.CEMU_VERSION }} + echo "Cemu Version is $VERSION" + ls cemu-appimage-x64 + mv cemu-appimage-x64/Cemu-*-x86_64.AppImage upload/Cemu-$VERSION-x86_64.AppImage - name: Create release from ubuntu-bin run: | diff --git a/dist/linux/appimage.sh b/dist/linux/appimage.sh new file mode 100755 index 00000000..7112c02a --- /dev/null +++ b/dist/linux/appimage.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +if [ -z "${GITHUB_WORKSPACE}" ]; then + export GITHUB_WORKSPACE="." +fi + +curl -sSfLO "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" +chmod a+x linuxdeploy*.AppImage +curl -sSfL https://github.com$(curl https://github.com/probonopd/go-appimage/releases/expanded_assets/continuous | grep "mkappimage-.*-x86_64.AppImage" | head -n 1 | cut -d '"' -f 2) -o mkappimage.AppImage +chmod a+x mkappimage.AppImage +curl -sSfLO "https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh" +chmod a+x linuxdeploy-plugin-gtk.sh + +if [[ ! -e /usr/lib/x86_64-linux-gnu ]]; then + sed -i 's#lib\/x86_64-linux-gnu#lib64#g' linuxdeploy-plugin-gtk.sh +fi + +mkdir -p AppDir/usr/ +cp dist/linux/{info.cemu.Cemu.desktop,info.cemu.Cemu.png} AppDir/ + +mkdir -p AppDir/usr/share/applications +mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps +mkdir -p AppDir/usr/lib + +cp -r bin AppDir/usr/ +cp /usr/lib/x86_64-linux-gnu/{libsepol.so.1,libffi.so.7,libpcre.so.3,libGLU.so.1} AppDir/usr/lib + +chmod +x AppDir/usr/bin/Cemu +#chmod +x AppDir/AppRun + +export UPD_INFO="gh-releases-zsync|cemu-project|Cemu|ci|Cemu.AppImage.zsync" +./linuxdeploy-x86_64.AppImage --appimage-extract-and-run\ + --appdir="$GITHUB_WORKSPACE"/AppDir/ \ + -d "$GITHUB_WORKSPACE"/AppDir/info.cemu.Cemu.desktop \ + -i "$GITHUB_WORKSPACE"/AppDir/info.cemu.Cemu.png \ + -e "$GITHUB_WORKSPACE"/AppDir/usr/bin/Cemu \ + --plugin gtk + +GITVERSION=$(git rev-parse --short HEAD) +echo $GITVERSION +if [[ -z ${GITVERSION} ]]; then + GITVERSION=experimental +fi + +echo "Cemu Version Cemu-${GITVERSION}" +rm AppDir/usr/lib/libwayland-client.so.0 +VERSION=${GITVERSION} ./mkappimage.AppImage --appimage-extract-and-run "$GITHUB_WORKSPACE"/AppDir + +mkdir -p "$GITHUB_WORKSPACE"/artifacts/ +mv Cemu-${GITVERSION}-x86_64.AppImage "$GITHUB_WORKSPACE"/artifacts/ diff --git a/dist/linux/info.cemu.Cemu.png b/dist/linux/info.cemu.Cemu.png new file mode 100644 index 0000000000000000000000000000000000000000..6f65507248160cd5f649d43be8295e90b5aa1622 GIT binary patch literal 11984 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 literal 0 HcmV?d00001