From 046bf6afe444dbf4da0787da92fe5d039083f05d Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 14 Dec 2025 10:53:24 +0100 Subject: [PATCH] ci pipelines --- .gitea/workflows/build.yaml | 63 ++++++++++++++++ .gitea/workflows/release.yaml | 130 ++++++++++++++++++++++++++++++++++ build.yaml | 4 +- 3 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 .gitea/workflows/build.yaml create mode 100644 .gitea/workflows/release.yaml diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..a3b2320 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -0,0 +1,63 @@ +name: 'Build Plugin' + +on: + push: + branches: + - master + paths-ignore: + - '**/*.md' + pull_request: + branches: + - master + paths-ignore: + - '**/*.md' + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.0.x' + + - name: Verify .NET installation + run: dotnet --version + + - name: Restore dependencies + run: dotnet restore Jellyfin.Plugin.JellyLMS.sln + + - name: Build solution + run: dotnet build Jellyfin.Plugin.JellyLMS.sln --configuration Release --no-restore --no-self-contained + + - name: Install JPRM + run: | + python3 -m venv /tmp/jprm-venv + /tmp/jprm-venv/bin/pip install jprm + + - name: Build Jellyfin Plugin + id: jprm + run: | + # Create artifacts directory for JPRM output + mkdir -p artifacts + + # Build plugin using JPRM + /tmp/jprm-venv/bin/jprm --verbosity=debug plugin build . + + # Find the generated zip file + ARTIFACT=$(find . -name "*.zip" -type f -print -quit) + echo "artifact=${ARTIFACT}" >> $GITHUB_OUTPUT + echo "Found artifact: ${ARTIFACT}" + + - name: Upload build artifact + uses: actions/upload-artifact@v3 + with: + name: jellylms-plugin + path: ${{ steps.jprm.outputs.artifact }} + retention-days: 30 + if-no-files-found: error diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml new file mode 100644 index 0000000..a72b67b --- /dev/null +++ b/.gitea/workflows/release.yaml @@ -0,0 +1,130 @@ +name: 'Release Plugin' + +on: + push: + tags: + - 'v*.*.*' + workflow_dispatch: + inputs: + version: + description: 'Version to release (e.g., v1.0.0)' + required: true + type: string + +jobs: + build-and-release: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.0.x' + + - name: Verify .NET installation + run: dotnet --version + + - name: Get version + id: get_version + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + VERSION="${{ github.event.inputs.version }}" + else + VERSION="${GITHUB_REF#refs/tags/}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "version_number=${VERSION#v}" >> $GITHUB_OUTPUT + echo "Building version: ${VERSION}" + + - name: Update build.yaml with version + run: | + VERSION="${{ steps.get_version.outputs.version_number }}" + sed -i "s/^version:.*/version: \"${VERSION}\"/" build.yaml + cat build.yaml + + - name: Restore dependencies + run: dotnet restore Jellyfin.Plugin.JellyLMS.sln + + - name: Build solution + run: dotnet build Jellyfin.Plugin.JellyLMS.sln --configuration Release --no-restore --no-self-contained + + - name: Install JPRM + run: | + python3 -m venv /tmp/jprm-venv + /tmp/jprm-venv/bin/pip install jprm + + - name: Build Jellyfin Plugin + id: jprm + run: | + # Create artifacts directory for JPRM output + mkdir -p artifacts + + # Build plugin using JPRM + /tmp/jprm-venv/bin/jprm --verbosity=debug plugin build ./ + + # Find the generated zip file + ARTIFACT=$(find . -name "*.zip" -type f -print -quit) + ARTIFACT_NAME=$(basename "${ARTIFACT}") + echo "artifact=${ARTIFACT}" >> $GITHUB_OUTPUT + echo "artifact_name=${ARTIFACT_NAME}" >> $GITHUB_OUTPUT + echo "Found artifact: ${ARTIFACT}" + + - name: Create Release + env: + GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Get repository information + REPO_OWNER="${{ github.repository_owner }}" + REPO_NAME="${{ github.event.repository.name }}" + GITEA_URL="${{ github.server_url }}" + + # Prepare release body + RELEASE_BODY="JellyLMS Jellyfin Plugin ${{ steps.get_version.outputs.version }}\n\nSee attached files for plugin installation." + RELEASE_BODY_JSON=$(echo -n "${RELEASE_BODY}" | jq -Rs .) + + # Create release using Gitea API + RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + "${GITEA_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases" \ + -d "{ + \"tag_name\": \"${{ steps.get_version.outputs.version }}\", + \"name\": \"Release ${{ steps.get_version.outputs.version }}\", + \"body\": ${RELEASE_BODY_JSON}, + \"draft\": false, + \"prerelease\": false + }") + + HTTP_CODE=$(echo "$RESPONSE" | tail -n1) + BODY=$(echo "$RESPONSE" | sed '$d') + + if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ]; then + RELEASE_ID=$(echo "$BODY" | jq -r '.id') + echo "Created release with ID: ${RELEASE_ID}" + else + echo "Failed to create release. HTTP ${HTTP_CODE}" + echo "$BODY" + exit 1 + fi + + # Upload plugin artifact + echo "Uploading plugin artifact..." + curl -f -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/zip" \ + --data-binary "@${{ steps.jprm.outputs.artifact }}" \ + "${GITEA_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/${RELEASE_ID}/assets?name=${{ steps.jprm.outputs.artifact_name }}" + + # Upload build.yaml + echo "Uploading build.yaml..." + curl -f -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/x-yaml" \ + --data-binary "@build.yaml" \ + "${GITEA_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/${RELEASE_ID}/assets?name=build.yaml" + + echo "Release created successfully!" + echo "View at: ${GITEA_URL}/${REPO_OWNER}/${REPO_NAME}/releases/tag/${{ steps.get_version.outputs.version }}" diff --git a/build.yaml b/build.yaml index 363d59e..923cf34 100644 --- a/build.yaml +++ b/build.yaml @@ -2,8 +2,8 @@ name: "JellyLMS" guid: "a5b8c9d0-1e2f-3a4b-5c6d-7e8f9a0b1c2d" version: "1.0.0.0" -targetAbi: "10.9.0.0" -framework: "net8.0" +targetAbi: "10.11.0.0" +framework: "net9.0" overview: "Bridge plugin to stream Jellyfin audio to Logitech Media Server (LMS) players" description: > JellyLMS enables Jellyfin to stream audio to LMS (Logitech Media Server) for