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_.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 0.1.0. case "$T" in v[0-9]*.[0-9]*.[0-9]*) V="${T#v}.0" ;; *) V="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 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