opentubex-nightly #50
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 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: 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: 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 |