stoat-for-desktop/.github/workflows/build-appimage.yml

108 lines
4.0 KiB
YAML

name: Build AppImage
on:
workflow_dispatch:
release:
types: [published]
jobs:
build-appimage:
runs-on: ubuntu-latest
strategy:
matrix:
arch: [x64, arm64]
steps:
# 1. Checkout source code
- name: Checkout code
uses: actions/checkout@v4
# FIX #1: for packaging only, manual setup is often cleaner (let's not mess with electron-builder, that's the point).
# To satisfy request, we use a more robust dependency setup
# and rely on the standard ubuntu environment where possible.
# Note: There is no single "magic action" to package pre-built binaries
# without a recipe (which pkg2appimage failed to automate with Stoat), we keep the steps but make them robust.
# 2. Install dependencies
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y desktop-file-utils zsync libfuse2
# 3. Download appimagetool
- name: Download appimagetool
run: |
wget -c https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
chmod +x appimagetool-x86_64.AppImage
# FIX #2: The race condition is avoided by ensuring our primary build workflow uploads assets to a Draft release first, then publishes it.
# When the published event fires, the assets are already attached.
# I've added tag ${{ github.event.release.tag_name }} instead to the downloader to explicitly target the triggering release,
# ensuring we never accidentally download from a different version.
# 3. Download latest Linux binary release
- name: Download Latest Linux Zip (${{ matrix.arch }})
uses: robinraju/release-downloader@v1
with:
repository: "stoatchat/for-desktop"
tag: ${{ github.event.release.tag_name }}
fileName: "Stoat-linux-${{ matrix.arch }}-*.zip"
out-file-path: "."
# 4. Setup AppDir
- name: Setup AppDir
run: |
mkdir -p Stoat.AppDir
unzip Stoat-linux-${{ matrix.arch }}-*.zip
mv Stoat-linux-${{ matrix.arch }}/* Stoat.AppDir/
rmdir Stoat-linux-${{ matrix.arch }}
# 5. Create AppRun
- name: Create AppRun
run: |
cd Stoat.AppDir
ln -s stoat-desktop AppRun
chmod +x AppRun
# FIX #3: Use existing desktop file, after adjusting (since designed for flatpak.
# 6. Create .desktop
- name: Create Desktop File
run: |
cp chat.stoat.StoatDesktop.desktop Stoat.AppDir/stoat.desktop
sed -i 's|^Exec=.*|Exec=stoat-desktop %u|' Stoat.AppDir/stoat.desktop
sed -i 's|^Icon=.*|Icon=stoat|' Stoat.AppDir/stoat.desktop
# 7. Download and add icon
- name: Add Icon
run: |
wget -O Stoat.AppDir/stoat.png https://raw.githubusercontent.com/stoatchat/assets/bd432f2298901a8566a092636eef0c35a3a80fbc/desktop/icon.png
# 8. Build the AppImage
- name: Build AppImage
run: |
export ARCH=${{ matrix.arch }}
./appimagetool-x86_64.AppImage Stoat.AppDir
if [ "${{ matrix.arch }}" == "x64" ]; then
mv Stoat-x86_64.AppImage Stoat-linux-x86_64.AppImage
elif [ "${{ matrix.arch }}" == "arm64" ]; then
mv Stoat-aarch64.AppImage Stoat-linux-arm64.AppImage
fi
# 9. Upload the AppImage to the Release
- name: Upload to Release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
files: ${{ matrix.arch == 'x64' && 'Stoat-linux-x86_64.AppImage' || 'Stoat-linux-arm64.AppImage' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
#- name: Upload Artifact
#uses: actions/upload-artifact@v4
#with:
#name: Stoat-AppImage-${{ matrix.arch }}
# path: ${{ matrix.arch == 'x64' && 'Stoat-linux-x86_64.AppImage' || 'Stoat-linux-arm64.AppImage' }}
# if-no-files-found: error