Skip to content

Deploy Flatpak (Flathub) #8

Deploy Flatpak (Flathub)

Deploy Flatpak (Flathub) #8

# Deploy Flatpak (Flathub)
#
# AppStream release history (gui/*.metainfo.xml) is maintained manually for Flathub — not overwritten from CMake.
#
# Architecture: x86_64 (build verification) — Flathub itself builds both x86_64 + aarch64
# Output: Flatpak bundle published to Dropbox (rolling + versioned) until Flathub listing is live.
#
# Manifest is kept in sync with:
# https://github.com/ForWard-Technologies-LLC/flathub/blob/add-pylux/io.github.ForWard_Technologies_LLC.Pylux.yml
name: Deploy Flatpak (Flathub)
on:
workflow_dispatch:
workflow_call:
outputs:
chiaki_version:
description: Pylux version from CMakeLists.txt
value: ${{ jobs.build-and-verify.outputs.chiaki_version }}
flatpak_build_succeeded:
description: Whether the Flatpak CI verify build succeeded
value: ${{ jobs.build-and-verify.outputs.flatpak_build_succeeded }}
flatpak_url:
description: Dropbox direct URL for rolling flatpak bundle (dl=1)
value: ${{ jobs.build-and-verify.outputs.flatpak_url }}
flatpak_install_command:
description: Download and install the Dropbox-hosted bundle
value: ${{ jobs.build-and-verify.outputs.flatpak_install_command }}
flatpak_run_command:
description: Launch Pylux after install
value: ${{ jobs.build-and-verify.outputs.flatpak_run_command }}
concurrency:
group: deploy-flatpak-${{ github.ref }}
cancel-in-progress: true
jobs:
build-and-verify:
name: Build and verify Flatpak (x86_64)
runs-on: ubuntu-latest
outputs:
chiaki_version: ${{ steps.extract_version.outputs.version }}
flatpak_build_succeeded: ${{ steps.flatpak_build.outcome == 'success' }}
flatpak_url: ${{ steps.flatpak_dropbox.outputs.url }}
flatpak_install_command: ${{ steps.flatpak_install_cmd.outputs.install }}
flatpak_run_command: ${{ steps.flatpak_install_cmd.outputs.run }}
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.10
options: --privileged
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Extract version
id: extract_version
uses: ./.github/actions/extract-version
- name: Patch manifest to build from local checkout
run: |
sed -i '/^ - name: pylux/,/^ - name:\|^$/{
s| - type: git| - type: dir|
s| url:.*| path: ../../|
/commit:/d
}' scripts/flatpak/io.github.ForWard_Technologies_LLC.Pylux.yml
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
id: flatpak_build
with:
bundle: pylux-x64.flatpak
manifest-path: scripts/flatpak/io.github.ForWard_Technologies_LLC.Pylux.yml
cache-key: flatpak-builder-${{ github.sha }}
arch: x86_64
upload-artifact: "false"
- name: Publish Flatpak bundle to Dropbox
id: flatpak_dropbox
if: steps.flatpak_build.outcome == 'success'
uses: ./.github/actions/dropbox-publish
with:
file: pylux-x64.flatpak
latest-path: /pylux/linux/pylux${{ github.ref_name == 'release/beta' && '-beta' || '' }}-latest.flatpak
versioned-path: /pylux/linux/pylux-${{ env.CHIAKI_VERSION }}.flatpak
refresh-token: ${{ secrets.DROPBOX_REFRESH_TOKEN }}
app-key: ${{ secrets.DROPBOX_APP_KEY }}
app-secret: ${{ secrets.DROPBOX_APP_SECRET }}
- name: Flatpak install command
id: flatpak_install_cmd
if: steps.flatpak_dropbox.outcome == 'success'
run: |
if [ "${{ github.ref_name }}" = "release/beta" ]; then
BUNDLE="pylux-beta-latest.flatpak"
else
BUNDLE="pylux-latest.flatpak"
fi
URL="${{ steps.flatpak_dropbox.outputs.url }}"
INSTALL="curl -fsSL -o ${BUNDLE} \"${URL}\" && flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo && flatpak install --user -y ${BUNDLE}"
RUN="flatpak run io.github.ForWard_Technologies_LLC.Pylux"
echo "install=${INSTALL}" >> "$GITHUB_OUTPUT"
echo "run=${RUN}" >> "$GITHUB_OUTPUT"
- name: Build summary
if: always()
run: |
if [ "${{ github.ref_name }}" = "release/beta" ]; then
ROLLING_NAME="pylux-beta-latest.flatpak"
else
ROLLING_NAME="pylux-latest.flatpak"
fi
{
echo "## Pylux Flatpak — v${CHIAKI_VERSION:-?} (x86_64)"
echo ""
if [ "${{ steps.flatpak_build.outcome }}" = "success" ]; then
FP_SIZE=$(ls -lh pylux-x64.flatpak 2>/dev/null | awk '{print $5}')
echo "| Artifact | Size | Rolling download | Versioned archive |"
echo "| --- | --- | --- | --- |"
echo "| Flatpak bundle | ${FP_SIZE:-?} | [${ROLLING_NAME}](${{ steps.flatpak_dropbox.outputs.url }}) | \`/pylux/linux/pylux-${CHIAKI_VERSION}.flatpak\` |"
echo ""
if [ "${{ steps.flatpak_dropbox.outcome }}" = "success" ]; then
echo "### Install (until Flathub is approved)"
echo "Download and install from the local file (Flatpak cannot install directly from a Dropbox URL):"
echo ""
echo '```bash'
echo "${{ steps.flatpak_install_cmd.outputs.install }}"
echo '```'
echo ""
echo "### Run"
echo ""
echo '```bash'
echo "${{ steps.flatpak_install_cmd.outputs.run }}"
echo '```'
echo ""
echo "### Update an existing Dropbox install"
echo "Run the install command again when a new bundle is published. There is no \`flatpak update\` channel until the app is on Flathub."
else
echo "### Install"
echo "Dropbox publish did not succeed — no install one-liner. Fix the publish step above."
fi
echo ""
echo "### Once on Flathub"
echo "\`flatpak install flathub io.github.ForWard_Technologies_LLC.Pylux\` — then \`flatpak update\` works normally."
else
echo "Flatpak build step outcome: **${{ steps.flatpak_build.outcome }}**. Fix manifest or build errors above."
fi
} >> "$GITHUB_STEP_SUMMARY"
# TODO: Uncomment after Flathub submission is approved and flathub/io.github.ForWard_Technologies_LLC.Pylux exists.
# Also add a FLATHUB_TOKEN secret (PAT with write access to that repo).
#
# sync-to-flathub:
# name: Sync manifest to Flathub repo
# needs: build-and-verify
# runs-on: ubuntu-latest
#
# steps:
# - name: Checkout Pylux repo
# uses: actions/checkout@v4
# with:
# path: pylux
#
# - name: Checkout Flathub repo
# uses: actions/checkout@v4
# with:
# repository: flathub/io.github.ForWard_Technologies_LLC.Pylux
# token: ${{ secrets.FLATHUB_TOKEN }}
# path: flathub
#
# - name: Sync files to Flathub repo
# run: |
# PYLUX_COMMIT=$(cd pylux && git rev-parse HEAD)
#
# # Patch the commit hash in the manifest to match this exact build
# sed "s|commit: .*|commit: ${PYLUX_COMMIT}|" \
# pylux/scripts/flatpak/io.github.ForWard_Technologies_LLC.Pylux.yml > flathub/io.github.ForWard_Technologies_LLC.Pylux.yml
#
# cp pylux/scripts/flatpak/0001-vulkan-ignore-frames-without-hw-context.patch \
# flathub/0001-vulkan-ignore-frames-without-hw-context.patch
#
# - name: Commit and push to Flathub
# working-directory: flathub
# run: |
# git config user.name "github-actions[bot]"
# git config user.email "github-actions[bot]@users.noreply.github.com"
#
# if git diff --quiet && [ -z "$(git ls-files --others --exclude-standard)" ]; then
# echo "No changes to sync."
# exit 0
# fi
#
# git add -A
# git commit -m "Sync manifest from Pylux @ $(cd ../pylux && git rev-parse --short HEAD)"
# git push