Files
jellyfin-plugin-floatplane/.gitea/workflows/release.yaml
claude 91434b1d4f
All checks were successful
release / build-release (push) Successful in 1m21s
CI: version master builds as <build.yaml version>.<run>; bump to 0.2.0
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-25 16:37:22 +01:00

186 lines
8.6 KiB
YAML

name: release
# Bygger Jellyfin-pluginen (AnyCPU .NET 8 -> samma DLL for x64 och Pi5/arm64),
# kor testerna och publicerar en release pa Gitea:
# - varje push till master -> rullande release "latest"
# - tagg vX.Y.Z -> versionerad release (plugin-version X.Y.Z.0)
# - workflow_dispatch -> valfri tag (tom = latest)
# Assets: floatplane_<ver>.zip (+.md5), manifest.json (Jellyfins plugin-
# repository-format) och install.sh. manifest.json laddas ALLTID upp
# till "latest" sa att URL:en nedan alltid pekar pa nyaste versionen:
# https://gitea.brasse-pc.eu/brasse/jellyfin-plugin-floatplane/releases/download/latest/manifest.json
#
# Kors pa brasse-linux01-runnern (label linux-amd64, catthehacker/ubuntu:act-latest).
# Bygget ar IL-only sa arkitekturen spelar ingen roll, men Pi5:n ska inte
# belastas med byggen. .NET-SDK:t installeras med dotnet-install.sh eftersom
# runner-imagen saknar dotnet (och dotnet/sdk-imagen saknar node for actions).
on:
push:
branches: [master]
tags: ["v*"]
workflow_dispatch:
inputs:
tag:
description: "Release-tag (lamna tom for 'latest')"
required: false
env:
DOTNET_CLI_TELEMETRY_OPTOUT: "1"
DOTNET_NOLOGO: "1"
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: "1"
REPO_URL: https://gitea.brasse-pc.eu/brasse/jellyfin-plugin-floatplane
jobs:
build-release:
runs-on: linux-amd64
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Installera verktyg (zip, jq, curl)
run: |
set -euo pipefail
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends zip jq curl ca-certificates >/dev/null
git config --global --add safe.directory '*'
- name: Cache NuGet-paket
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: nuget-
- name: Installera .NET 8 SDK
run: |
set -euo pipefail
curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
bash /tmp/dotnet-install.sh --channel 8.0 --install-dir "$HOME/.dotnet"
echo "$HOME/.dotnet" >> "$GITHUB_PATH"
echo "DOTNET_ROOT=$HOME/.dotnet" >> "$GITHUB_ENV"
"$HOME/.dotnet/dotnet" --version
- name: Bestam release-tag och plugin-version
id: t
run: |
set -euo pipefail
case "$GITHUB_REF" in
refs/tags/*) T="$GITHUB_REF_NAME" ;;
*) T="${{ inputs.tag }}"; [ -z "$T" ] && T="latest" ;;
esac
# Jellyfin kraver en fyrdelad System.Version: vX.Y.Z -> X.Y.Z.0, annars <build.yaml-version>.<run>
case "$T" in
v[0-9]*.[0-9]*.[0-9]*) V="${T#v}.0" ;;
*) BASE=$(sed -n 's/^version: *"\([0-9]*\.[0-9]*\.[0-9]*\)\.[0-9]*"/\1/p' build.yaml); V="${BASE:-0.1.0}.${{ github.run_number }}" ;;
esac
echo "tag=$T" >> "$GITHUB_OUTPUT"
echo "version=$V" >> "$GITHUB_OUTPUT"
echo "bygger release: $T (plugin-version $V)"
- name: Tester
run: |
set -euo pipefail
if [ -d Jellyfin.Plugin.Floatplane.Tests ]; then
dotnet test Jellyfin.Plugin.Floatplane.Tests -c Release --nologo
else
echo "inget testprojekt annu - hoppar over"
fi
- name: Paketera (zip + meta.json + manifest.json)
env:
TAG: ${{ steps.t.outputs.tag }}
VERSION: ${{ steps.t.outputs.version }}
run: |
set -euo pipefail
scripts/package.sh "$VERSION" "$REPO_URL/releases/download/$TAG"
ls -la build
cat build/manifest.json
- name: Skapa/uppdatera Gitea-release + ladda upp assets
env:
REPO: ${{ github.repository }}
TAG: ${{ steps.t.outputs.tag }}
VERSION: ${{ steps.t.outputs.version }}
TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
# gitea-d finns bara pa Pi5:ns dockernat; harifran anvands publika adressen
API=http://gitea-d:3000/api/v1
curl -sf -m 5 "$API/version" >/dev/null 2>&1 || API=https://gitea.brasse-pc.eu/api/v1
echo "API: $API"
auth() { curl -s -H "Authorization: token $TOKEN" "$@"; }
ZIP="floatplane_${VERSION}.zip"
cp build/manifest.json build/manifest.json.keep
BODY="Jellyfin Floatplane plugin $TAG (version $VERSION, commit ${GITHUB_SHA:0:10}).
Byggd for Jellyfin 10.10.x (.NET 8, targetAbi 10.10.0.0). En DLL for x64 och arm64 (Pi5).
Installera via plugin-repository (rekommenderat):
Jellyfin Dashboard -> Plugins -> Repositories -> + -> URL:
$REPO_URL/releases/download/latest/manifest.json
Sedan Plugins -> Catalog -> Floatplane -> Install, starta om Jellyfin.
Manuell installation pa en host med linuxserver/jellyfin-containern:
curl -fsSL $REPO_URL/releases/download/$TAG/install.sh | sh
(TAG=... JELLYFIN_CONFIG_DIR=... JELLYFIN_CONTAINER=... och --dry-run stods, se skriptet.)
Efter installation: Dashboard -> Plugins -> Floatplane -> klistra in sails.sid-cookien."
# --- release for TAG -------------------------------------------------
if [ "$TAG" = "latest" ]; then
# rullande release: ta bort den gamla sa att taggen foljer master
rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty')
[ -n "$rid" ] && auth -X DELETE "$API/repos/$REPO/releases/$rid" -o /dev/null
auth -X DELETE "$API/repos/$REPO/tags/$TAG" -o /dev/null || true
JSON=$(jq -n --arg t "$TAG" --arg c "$GITHUB_SHA" --arg n "latest ($VERSION)" --arg b "$BODY" \
'{tag_name:$t, target_commitish:$c, name:$n, body:$b, prerelease:true}')
else
JSON=$(jq -n --arg t "$TAG" --arg n "$TAG ($VERSION)" --arg b "$BODY" '{tag_name:$t, name:$n, body:$b}')
fi
RESP=$(auth -X POST "$API/repos/$REPO/releases" -H 'Content-Type: application/json' -d "$JSON")
rid=$(echo "$RESP" | jq -r '.id // empty')
[ -z "$rid" ] && rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty')
[ -n "$rid" ] && [ "$rid" != "null" ] || { echo "kunde inte skapa release: $RESP"; exit 1; }
echo "release id: $rid"
upload() { # upload <release-id> <asset-name> <local-file>
local r="$1" name="$2" file="$3" aid
aid=$(auth "$API/repos/$REPO/releases/$r/assets" | jq -r ".[] | select(.name==\"$name\") | .id")
if [ -n "$aid" ] && [ "$aid" != "null" ]; then
auth -X DELETE "$API/repos/$REPO/releases/$r/assets/$aid" -o /dev/null
fi
echo "laddar upp $name -> release $r ..."
auth -X POST "$API/repos/$REPO/releases/$r/assets?name=$name" -F "attachment=@$file" -o /dev/null -w " -> HTTP %{http_code}\n"
}
upload "$rid" "$ZIP" "build/$ZIP"
upload "$rid" "$ZIP.md5" "build/$ZIP.md5"
upload "$rid" "manifest.json" "build/manifest.json"
upload "$rid" "install.sh" "install.sh"
upload "$rid" "thumb.png" "build/thumb.png"
echo "klart: https://gitea.brasse-pc.eu/$REPO/releases/tag/$TAG"
# --- manifest.json aven till "latest" vid taggad release --------------
# Repository-URL:en i Jellyfin pekar pa latest/manifest.json; den ska
# alltid lista den nyaste versionen. sourceUrl i manifestet pekar redan
# pa den versionerade releasen, sa zippen behover inte dubbleras.
if [ "$TAG" != "latest" ]; then
lid=$(auth "$API/repos/$REPO/releases/tags/latest" | jq -r '.id // empty')
if [ -z "$lid" ] || [ "$lid" = "null" ]; then
LJSON=$(jq -n --arg c "$GITHUB_SHA" --arg n "latest ($VERSION)" --arg b "$BODY" \
'{tag_name:"latest", target_commitish:$c, name:$n, body:$b, prerelease:true}')
lid=$(auth -X POST "$API/repos/$REPO/releases" -H 'Content-Type: application/json' -d "$LJSON" | jq -r '.id // empty')
fi
if [ -n "$lid" ] && [ "$lid" != "null" ]; then
upload "$lid" "manifest.json" "build/manifest.json.keep"
upload "$lid" "install.sh" "install.sh"
upload "$lid" "thumb.png" "build/thumb.png"
echo "manifest.json uppdaterat pa latest: $REPO_URL/releases/download/latest/manifest.json"
else
echo "::warning::kunde inte hitta/skapa latest-releasen for manifest.json"
fi
fi