Skip to content

opentubex-nightly

opentubex-nightly #83

Workflow file for this run

name: Build and Release Flatpak
on:
workflow_dispatch:
inputs:
tag:
description: 'OpenTubeX release tag (e.g. v0.25.5-beta). Leave empty for latest.'
required: false
type: string
repository_dispatch:
types: [opentubex-release, opentubex-nightly]
permissions: {}
jobs:
prepare:
name: Prepare manifest
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
tag: ${{ steps.release.outputs.tag }}
version: ${{ steps.release.outputs.version }}
asset_version: ${{ steps.release.outputs.asset_version }}
channel: ${{ steps.release.outputs.channel }}
published_at: ${{ steps.release.outputs.published_at }}
steps:
- name: Check out flatpak manifest
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Check out OpenTubeX screenshot automation
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: OpenTubeX/OpenTubeX
ref: development
path: opentubex
persist-credentials: false
sparse-checkout: |
_scripts
docs/screenshots
- name: Resolve OpenTubeX release
id: release
env:
GH_TOKEN: ${{ github.token }}
INPUT_TAG: ${{ github.event.inputs.tag || github.event.client_payload.tag || '' }}
run: |
set -euo pipefail
if [ -n "$INPUT_TAG" ]; then
tag="$INPUT_TAG"
else
tag="$(gh api repos/OpenTubeX/OpenTubeX/releases/latest --jq .tag_name)"
fi
if [[ "$tag" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)-beta$ ]]; then
version="${BASH_REMATCH[1]}"
asset_version="${version}-beta"
channel=stable
elif [[ "$tag" =~ ^v([0-9]+\.[0-9]+\.[0-9]+-nightly-[0-9]+)$ ]]; then
version="${BASH_REMATCH[1]}"
asset_version="$version"
channel=nightly
else
echo "Expected a stable or nightly OpenTubeX tag, got: $tag" >&2
exit 1
fi
published_at="$(gh api "repos/OpenTubeX/OpenTubeX/releases/tags/${tag}" --jq .published_at | cut -dT -f1)"
{
echo "tag=${tag}"
echo "version=${version}"
echo "asset_version=${asset_version}"
echo "channel=${channel}"
echo "published_at=${published_at}"
} >> "$GITHUB_OUTPUT"
- name: Install yq
run: |
sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/download/v4.53.3/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
- name: Download portable archives
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
asset_version="${{ steps.release.outputs.asset_version }}"
tag="${{ steps.release.outputs.tag }}"
gh release download "$tag" \
--repo OpenTubeX/OpenTubeX \
--pattern "opentubex-${asset_version}-linux-x64-portable.zip"
gh release download "$tag" \
--repo OpenTubeX/OpenTubeX \
--pattern "opentubex-${asset_version}-linux-arm64-portable.zip"
- name: Update manifest checksums
env:
TAG: ${{ steps.release.outputs.tag }}
ASSET_VERSION: ${{ steps.release.outputs.asset_version }}
run: |
set -euo pipefail
sha256_x64="$(sha256sum "opentubex-${ASSET_VERSION}-linux-x64-portable.zip" | awk '{print $1}')"
sha256_arm64="$(sha256sum "opentubex-${ASSET_VERSION}-linux-arm64-portable.zip" | awk '{print $1}')"
yq -i "
.modules[0].sources[0].url = \"https://github.com/OpenTubeX/OpenTubeX/releases/download/${TAG}/opentubex-${ASSET_VERSION}-linux-x64-portable.zip\" |
.modules[0].sources[0].sha256 = \"${sha256_x64}\" |
.modules[0].sources[1].url = \"https://github.com/OpenTubeX/OpenTubeX/releases/download/${TAG}/opentubex-${ASSET_VERSION}-linux-arm64-portable.zip\" |
.modules[0].sources[1].sha256 = \"${sha256_arm64}\"
" org.opentubex.OpenTubeX.yml
- name: Remove downloaded archives
env:
ASSET_VERSION: ${{ steps.release.outputs.asset_version }}
run: |
set -euo pipefail
rm -f \
"opentubex-${ASSET_VERSION}-linux-x64-portable.zip" \
"opentubex-${ASSET_VERSION}-linux-arm64-portable.zip"
- name: Update AppStream release entry
env:
VERSION: ${{ steps.release.outputs.version }}
CHANNEL: ${{ steps.release.outputs.channel }}
PUBLISHED_AT: ${{ steps.release.outputs.published_at }}
TAG: ${{ steps.release.outputs.tag }}
run: |
set -euo pipefail
sudo apt-get update -qq
sudo apt-get install -y -qq xmlstarlet
appstream_version="$VERSION"
if [[ "$CHANNEL" == stable ]]; then
appstream_version="${VERSION}-beta"
fi
xmlstarlet ed -L \
-d "/component/releases/release[1]" \
-s "/component/releases" -t elem -n release -v "" \
-i "/component/releases/release[1]" -t attr -n version -v "${appstream_version}" \
-i "/component/releases/release[1]" -t attr -n date -v "${PUBLISHED_AT}" \
-s "/component/releases/release[1]" -t elem -n url -v "" \
-i "/component/releases/release[1]/url" -t attr -n type -v details \
-s "/component/releases/release[1]/url" -t text -n "" \
-v "https://github.com/OpenTubeX/OpenTubeX/releases/tag/${TAG}" \
org.opentubex.OpenTubeX.metainfo.xml
- name: Update AppStream screenshots
run: |
set -euo pipefail
node opentubex/_scripts/syncAppStreamScreenshots.mjs \
org.opentubex.OpenTubeX.metainfo.xml \
development
- name: Commit manifest updates
if: steps.release.outputs.channel == 'stable'
env:
TAG: ${{ steps.release.outputs.tag }}
run: |
set -euo pipefail
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add org.opentubex.OpenTubeX.yml org.opentubex.OpenTubeX.metainfo.xml
if git diff --cached --quiet; then
echo "Manifest already up to date for ${TAG}, skipping commit."
else
git commit --no-verify -m "Update manifest for ${TAG}"
git push
fi
- name: Upload prepared manifest
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: manifest
path: |
org.opentubex.OpenTubeX.yml
org.opentubex.OpenTubeX.desktop
org.opentubex.OpenTubeX.metainfo.xml
run.sh
build:
name: Build ${{ matrix.arch }}
needs: prepare
runs-on: ${{ matrix.runner }}
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-25.08
options: --privileged
permissions:
actions: read
strategy:
fail-fast: false
matrix:
include:
- arch: x86_64
runner: ubuntu-latest
- arch: aarch64
runner: ubuntu-24.04-arm
steps:
- name: Download prepared manifest
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: manifest
path: .
- name: Build Flatpak bundle
uses: flatpak/flatpak-github-actions/flatpak-builder@401fe28a8384095fc1531b9d320b292f0ee45adb # v6.7
with:
arch: ${{ matrix.arch }}
bundle: org.opentubex.OpenTubeX-${{ matrix.arch }}.flatpak
manifest-path: org.opentubex.OpenTubeX.yml
upload-artifact: false
keep-build-dirs: true
cache-key: flatpak-builder-${{ matrix.arch }}-${{ needs.prepare.outputs.tag }}
- name: Upload Flatpak bundle
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: flatpak-${{ matrix.arch }}
path: org.opentubex.OpenTubeX-${{ matrix.arch }}.flatpak
if-no-files-found: error
- name: Archive build directory
run: |
set -euo pipefail
mv flatpak_app "build-dir-${{ matrix.arch }}"
tar -cpf "build-dir-${{ matrix.arch }}.tar" "build-dir-${{ matrix.arch }}"
- name: Upload build directory
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: build-dir-${{ matrix.arch }}
path: build-dir-${{ matrix.arch }}.tar
if-no-files-found: error
release:
name: Publish GitHub release
needs: [prepare, build]
runs-on: ubuntu-latest
permissions:
contents: write
actions: read
steps:
- name: Download Flatpak bundles
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: flatpak-*
merge-multiple: true
- name: Rename bundles for release
env:
TAG: ${{ needs.prepare.outputs.tag }}
run: |
set -euo pipefail
mv org.opentubex.OpenTubeX-x86_64.flatpak \
"org.opentubex.OpenTubeX-${TAG}-x86_64.flatpak"
mv org.opentubex.OpenTubeX-aarch64.flatpak \
"org.opentubex.OpenTubeX-${TAG}-aarch64.flatpak"
- name: Create or update GitHub release
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
TAG: ${{ needs.prepare.outputs.tag }}
VERSION: ${{ needs.prepare.outputs.version }}
CHANNEL: ${{ needs.prepare.outputs.channel }}
run: |
set -euo pipefail
notes="Flatpak bundles for [OpenTubeX ${TAG}](https://github.com/OpenTubeX/OpenTubeX/releases/tag/${TAG}).
Install with:
\`\`\`bash
flatpak install --user ./org.opentubex.OpenTubeX-${TAG}-x86_64.flatpak
# or for ARM64:
flatpak install --user ./org.opentubex.OpenTubeX-${TAG}-aarch64.flatpak
\`\`\`"
if [[ "$CHANNEL" == nightly ]]; then
printf -v notes \
'> [!WARNING]\n> This nightly build is intended for testing only and may be unstable. Regular users should use the [latest non-prerelease](https://github.com/OpenTubeX/flatpak/releases/latest).\n\n%s' \
"$notes"
fi
if gh release view "$TAG" --repo "$GH_REPO" >/dev/null 2>&1; then
gh release upload "$TAG" \
"org.opentubex.OpenTubeX-${TAG}-x86_64.flatpak" \
"org.opentubex.OpenTubeX-${TAG}-aarch64.flatpak" \
--repo "$GH_REPO" \
--clobber
else
release_flags=()
if [[ "$CHANNEL" == nightly ]]; then
release_flags+=(--prerelease)
fi
gh release create "$TAG" \
"org.opentubex.OpenTubeX-${TAG}-x86_64.flatpak" \
"org.opentubex.OpenTubeX-${TAG}-aarch64.flatpak" \
--repo "$GH_REPO" \
--title "OpenTubeX ${VERSION} (Flatpak)" \
"${release_flags[@]}" \
--notes "$notes"
fi
publish-repo:
name: Publish OSTree remote
needs: [prepare, build]
runs-on: ubuntu-latest
concurrency:
group: opentubex-flatpak-repository
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-25.08
options: --privileged
permissions:
contents: write
actions: read
pages: write
id-token: write
steps:
- name: Check out flatpak manifest
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- name: Restore or initialize OSTree repo
run: |
set -euo pipefail
git config --global --add safe.directory "$GITHUB_WORKSPACE"
mkdir -p site
set +e
git ls-remote --exit-code --heads origin gh-pages >/dev/null
gh_pages_status=$?
set -e
if [[ "$gh_pages_status" -eq 0 ]]; then
git fetch --no-tags origin \
gh-pages:refs/remotes/origin/gh-pages
if ! git cat-file -e origin/gh-pages:repo/config 2>/dev/null; then
echo "The gh-pages branch exists but does not contain repo/config." >&2
exit 1
fi
git worktree add --detach gh-pages-tree origin/gh-pages
mv gh-pages-tree/repo site/repo
mkdir -p site/repo/refs/remotes site/repo/refs/mirrors
ostree fsck --repo=site/repo
elif [[ "$gh_pages_status" -eq 2 ]]; then
echo "No gh-pages branch exists; initializing the repository."
ostree init --repo=site/repo --mode=archive-z2
else
echo "Failed to check the gh-pages branch; refusing to initialize an empty repository." >&2
exit 1
fi
- name: Download x86_64 build directory
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: build-dir-x86_64
path: build-dir-x86_64
- name: Download aarch64 build directory
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: build-dir-aarch64
path: build-dir-aarch64
- name: Extract build directories
run: |
set -euo pipefail
tar -xpf build-dir-x86_64/build-dir-x86_64.tar
tar -xpf build-dir-aarch64/build-dir-aarch64.tar
- name: Import Flatpak signing key
env:
FLATPAK_GPG_PRIVATE_KEY: ${{ secrets.FLATPAK_GPG_PRIVATE_KEY }}
run: |
set -euo pipefail
echo "$FLATPAK_GPG_PRIVATE_KEY" | gpg --batch --import
gpg --list-secret-keys --with-fingerprint flatpak@opentubex.org
- name: Export builds into OSTree repo
env:
CHANNEL: ${{ needs.prepare.outputs.channel }}
FLATPAK_GPG_FINGERPRINT: FCB58AF1F41F6E3157A6496438960E78A4EE5B9C
run: |
set -euo pipefail
channels=("$CHANNEL")
if [[ "$CHANNEL" == stable ]]; then
channels+=(nightly)
fi
for channel in "${channels[@]}"; do
flatpak build-export --gpg-sign="$FLATPAK_GPG_FINGERPRINT" --arch=x86_64 \
site/repo build-dir-x86_64 "$channel"
flatpak build-export --gpg-sign="$FLATPAK_GPG_FINGERPRINT" --arch=aarch64 \
site/repo build-dir-aarch64 "$channel"
done
flatpak build-update-repo --gpg-sign="$FLATPAK_GPG_FINGERPRINT" \
--default-branch=stable site/repo
for channel in "${channels[@]}"; do
for arch in x86_64 aarch64; do
ref="app/org.opentubex.OpenTubeX/${arch}/${channel}"
if ! ostree rev-parse --repo=site/repo "$ref" >/dev/null 2>&1; then
echo "Refusing to publish a repository without $ref." >&2
exit 1
fi
done
done
ostree fsck --repo=site/repo
- name: Assemble GitHub Pages site
run: |
set -euo pipefail
cp pages/CNAME pages/code-blocks.js pages/opentubex.flatpakrepo \
pages/index.html pages/style.css pages/favicon.svg pages/favicon.ico site/
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4.1.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./site
cname: flatpak.opentubex.org
force_orphan: true