ci: build AppImage with linuxdeploy #525
This file contains hidden or 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: Build for Linux | |
| on: | |
| # Enable manual run | |
| workflow_dispatch: | |
| push: | |
| tags: | |
| - "**" | |
| branches: | |
| - "**" | |
| paths: | |
| - .github/workflows/linux.yml | |
| - appimage/AppImageBuilder.yml | |
| jobs: | |
| build-linux: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| arch: | |
| - runs-on: ubuntu-latest | |
| cache-name: saber | |
| target-platform: linux-x64 | |
| flutter-output-folder: build/linux/x64/release/bundle | |
| archive-suffix: x86_64 | |
| linuxdeploy-exe: linuxdeploy-x86_64.AppImage | |
| - runs-on: ubuntu-24.04-arm | |
| cache-name: saberarm64 | |
| target-platform: linux-arm64 | |
| flutter-output-folder: build/linux/arm64/release/bundle | |
| archive-suffix: arm64 | |
| linuxdeploy-exe: linuxdeploy-aarch64.AppImage | |
| runs-on: ${{ matrix.arch.runs-on }} | |
| permissions: | |
| contents: write | |
| timeout-minutes: 20 | |
| name: Build Linux (${{ matrix.arch.target-platform }}) | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v6 | |
| - uses: "./.github/shared_workflows/install_apt_dependencies" | |
| - name: Setup cache | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| .dart_tool/ | |
| build/ | |
| linux/flutter/ephemeral/ | |
| macos/Flutter/ephemeral/ | |
| windows/flutter/ephemeral/ | |
| .flutter-plugins-dependencies | |
| key: ${{ runner.OS }}-${{ matrix.arch.cache-name }}-${{ hashFiles('**/pubspec.lock') }}-${{ hashFiles('**/*.dart') }} | |
| restore-keys: | | |
| ${{ runner.OS }}-${{ matrix.arch.cache-name }}- | |
| - name: Setup Flutter | |
| uses: adil192/setup-flutter-submodule@v1 | |
| with: | |
| flutter-path: submodules/flutter | |
| - name: Disable Flutter CLI animations | |
| run: flutter config --no-cli-animations | |
| - run: flutter pub get | |
| - name: Remove proprietary dependencies | |
| run: ./patches/remove_proprietary_dependencies.sh | |
| - name: Remove development dependencies | |
| run: ./patches/remove_dev_dependencies.sh | |
| - name: Build Linux (${{ matrix.arch.target-platform }}) | |
| run: | | |
| flutter build linux \ | |
| --target-platform ${{ matrix.arch.target-platform }} \ | |
| - name: Compress Flutter build | |
| id: compress | |
| run: | | |
| buildName=$(grep -oP "(?<=buildName = ').*(?=')" lib/data/version.dart) | |
| archiveName="Saber_v${buildName}_Linux_${{ matrix.arch.archive-suffix }}.tar.gz" | |
| echo "archiveName=$archiveName" >> $GITHUB_OUTPUT | |
| mkdir -p AppDir | |
| mv ${{ matrix.arch.flutter-output-folder }}/* AppDir | |
| chmod +x AppDir/saber | |
| install -Dm644 flatpak/com.adilhanney.saber.metainfo.xml -t AppDir/share/metainfo/ | |
| install -Dm644 assets/icon/icon_linux.svg AppDir/share/icons/hicolor/scalable/apps/com.adilhanney.saber.svg | |
| install -Dm644 flatpak/com.adilhanney.saber.desktop -t AppDir/share/applications/ | |
| tar -C AppDir -czvf $archiveName . | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: Saber-Archive-${{ matrix.arch.archive-suffix }} | |
| path: ${{ steps.compress.outputs.archiveName }} | |
| - name: Upload to GitHub release | |
| uses: svenstaro/upload-release-action@v2 | |
| if: ${{ startsWith(github.ref, 'refs/tags/') }} | |
| with: | |
| repo_token: ${{ secrets.GITHUB_TOKEN }} | |
| file: ${{ steps.compress.outputs.archiveName }} | |
| # Now build AppImage | |
| - name: Install FUSE | |
| run: | | |
| sudo add-apt-repository universe | |
| sudo apt-get install libfuse2t64 | |
| - name: Prepare AppDir for AppImage | |
| run: | | |
| rm -rf linux/AppImage/AppDir/ | |
| # Copy flutter bundle into AppDir/usr/bin/ | |
| mkdir -p linux/AppImage/AppDir/usr/bin/ | |
| cp -R AppDir/* linux/AppImage/AppDir/usr/bin/ | |
| # Move share folder to usr/share | |
| mv linux/AppImage/AppDir/usr/bin/share linux/AppImage/AppDir/usr/ | |
| # Set environment variables for linuxdeploy | |
| echo "LD_LIBRARY_PATH=$(pwd)/linux/AppImage/AppDir/usr/bin/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV | |
| echo 'UPDATE_INFORMATION=gh-releases-zsync|saber-notes|saber|latest|Saber-*-${{ matrix.arch.archive-suffix }}.AppImage.zsync' >> $GITHUB_ENV | |
| - name: Install linuxdeploy | |
| working-directory: linux/AppImage | |
| run: | | |
| wget https://github.com/linuxdeploy/linuxdeploy/releases/latest/download/${{ matrix.arch.linuxdeploy-exe }} | |
| chmod +x ${{ matrix.arch.linuxdeploy-exe }} | |
| - name: Build AppImage | |
| working-directory: linux/AppImage | |
| run: ./${{ matrix.arch.linuxdeploy-exe }} --appdir AppDir --output appimage | |
| - run: tree linux/AppImage -L 3 | |
| - name: Rename AppImage | |
| run: | | |
| buildName=$(grep -oP "(?<=buildName = ').*(?=')" lib/data/version.dart) | |
| mv linux/AppImage/Saber-*.AppImage linux/AppImage/Saber-${buildName}-${{ matrix.arch.archive-suffix }}.AppImage | |
| mv linux/AppImage/Saber-*.AppImage.zsync linux/AppImage/Saber-${buildName}-${{ matrix.arch.archive-suffix }}.AppImage.zsync | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: AppImage artifact (${{ matrix.arch.target-platform }}) | |
| path: linux/AppImage/Saber-*.AppImage* | |
| - name: Upload to GitHub release | |
| uses: svenstaro/upload-release-action@v2 | |
| if: ${{ startsWith(github.ref, 'refs/tags/') }} | |
| with: | |
| repo_token: ${{ secrets.GITHUB_TOKEN }} | |
| file: linux/AppImage/Saber-*.AppImage* | |
| file_glob: true |