diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml
new file mode 100644
index 000000000..b24ef0b6a
--- /dev/null
+++ b/.github/actions/build/action.yml
@@ -0,0 +1,188 @@
+name: Build Backend
+description: Builds the backend and packages it
+
+inputs:
+ branch:
+ description: "Branch name for this build"
+ required: true
+ version:
+ description: "Version number to build"
+ required: true
+ framework:
+ description: ".net framework used for the build"
+ required: true
+ runtime:
+ description: "Run time to build for"
+ required: true
+ package_tests:
+ description: "True if tests should be packaged for later testing steps"
+
+runs:
+ using: "composite"
+ steps:
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+
+ - name: Setup Environment Variables
+ id: variables
+ shell: bash
+ run: |
+ DOTNET_VERSION=$(jq -r '.sdk.version' global.json)
+
+ echo "SDK_PATH=${{ env.DOTNET_ROOT }}/sdk/${DOTNET_VERSION}" >> "$GITHUB_ENV"
+ echo "SONARR_VERSION=${{ inputs.version }}" >> "$GITHUB_ENV"
+ echo "BRANCH=${{ inputs.branch }}" >> "$GITHUB_ENV"
+
+ if [ "$RUNNER_OS" == "Windows" ]; then
+ echo "NUGET_PACKAGES=D:\nuget\packages" >> "$GITHUB_ENV"
+ fi
+
+ - name: Enable Extra Platforms In SDK
+ if: ${{ inputs.runtime == 'freebsd-x64' }}
+ shell: bash
+ run: |
+ BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
+
+ if grep -q freebsd-x64 "$BUNDLEDVERSIONS"; then
+ echo "Extra platforms already enabled"
+ else
+ echo "Enabling extra platform support"
+ sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' "$BUNDLEDVERSIONS"
+ fi
+
+ if grep -qv freebsd-x64 src/Directory.Build.props; then
+ sed -i'' -e "s^\(.*\)^\1;freebsd-x64^g" src/Directory.Build.props
+ fi
+
+ - name: Update Version Number
+ shell: bash
+ run: |
+ if [ "$SONARR_VERSION" != "" ]; then
+ echo "Updating version info to: $SONARR_VERSION"
+ sed -i'' -e "s/[0-9.*]\+<\/AssemblyVersion>/$SONARR_VERSION<\/AssemblyVersion>/g" src/Directory.Build.props
+ sed -i'' -e "s/[\$()A-Za-z-]\+<\/AssemblyConfiguration>/${BRANCH}<\/AssemblyConfiguration>/g" src/Directory.Build.props
+ sed -i'' -e "s/10.0.0.0<\/string>/$SONARR_VERSION<\/string>/g" distribution/macOS/Sonarr.app/Contents/Info.plist
+ fi
+
+ - name: Build Backend
+ shell: bash
+ run: |
+ runtime="${{ inputs.runtime }}"
+ platform=Windows
+ slnFile=src/Sonarr.sln
+ targetingWindows=false
+
+ IFS='-' read -ra SPLIT <<< "$runtime"
+
+ if [ "${SPLIT[0]}" == "win" ]; then
+ platform=Windows
+ targetingWindows=true
+ else
+ platform=Posix
+ fi
+
+ rm -rf _output
+ rm -rf _tests
+
+ echo "Building Sonarr for $runtime, Platform: $platform"
+
+ dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$runtime -p:EnableWindowsTargeting=true -t:PublishAllRids
+
+ - name: Package
+ shell: bash
+ run: |
+ framework="${{ inputs.framework }}"
+ runtime="${{ inputs.runtime }}"
+
+ IFS='-' read -ra SPLIT <<< "$runtime"
+
+ case "${SPLIT[0]}" in
+ linux|freebsd*)
+ folder=_artifacts/$runtime/$framework/Sonarr
+
+ echo "Packaging files"
+ rm -rf $folder
+ mkdir -p $folder
+ cp -r _output/$framework/$runtime/publish/* $folder
+ cp -r _output/Sonarr.Update/$framework/$runtime/publish $folder/Sonarr.Update
+ cp LICENSE.md $folder
+
+ echo "Removing Service helpers"
+ rm -f $folder/ServiceUninstall.*
+ rm -f $folder/ServiceInstall.*
+
+ echo "Removing Sonarr.Windows"
+ rm $folder/Sonarr.Windows.*
+
+ echo "Adding Sonarr.Mono to UpdatePackage"
+ cp $folder/Sonarr.Mono.* $folder/Sonarr.Update
+ cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update
+ cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update
+ ;;
+ win)
+ folder=_artifacts/$runtime/$framework/Sonarr
+
+ echo "Packaging files"
+ rm -rf $folder
+ mkdir -p $folder
+ cp -r _output/$framework/$runtime/publish/* $folder
+ cp -r _output/Sonarr.Update/$framework/$runtime/publish $folder/Sonarr.Update
+ cp LICENSE.md $folder
+ cp -r _output/$framework-windows/$runtime/publish/* $folder
+
+ echo "Removing Sonarr.Mono"
+ rm -f $folder/Sonarr.Mono.*
+ rm -f $folder/Mono.Posix.NETStandard.*
+ rm -f $folder/libMonoPosixHelper.*
+
+ echo "Adding Sonarr.Windows to UpdatePackage"
+ cp $folder/Sonarr.Windows.* $folder/Sonarr.Update
+
+ ;;
+ osx)
+ folder=_artifacts/$runtime/$framework/Sonarr
+
+ echo "Packaging files"
+ rm -rf $folder
+ mkdir -p $folder
+ cp -r _output/$framework/$runtime/publish/* $folder
+ cp -r _output/Sonarr.Update/$framework/$runtime/publish $folder/Sonarr.Update
+ cp LICENSE.md $folder
+
+ echo "Removing Service helpers"
+ rm -f $folder/ServiceUninstall.*
+ rm -f $folder/ServiceInstall.*
+
+ echo "Removing Sonarr.Windows"
+ rm $folder/Sonarr.Windows.*
+
+ echo "Adding Sonarr.Mono to UpdatePackage"
+ cp $folder/Sonarr.Mono.* $folder/Sonarr.Update
+ cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update
+ cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update
+ ;;
+ esac
+
+ - name: Package Tests
+ if: ${{ inputs.package_tests }}
+ shell: bash
+ run: |
+ framework="${{ inputs.framework }}"
+ runtime="${{ inputs.runtime }}"
+
+ cp test.sh "_tests/$framework/$runtime/publish"
+
+ rm -f _tests/$framework/$runtime/*.log.config
+
+ - name: Upload Test Artifacts
+ if: ${{ inputs.package_tests }}
+ uses: ./.github/actions/publish-test-artifact
+ with:
+ framework: ${{ inputs.framework }}
+ runtime: ${{ inputs.runtime }}
+
+ - name: Upload Artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: build-${{ inputs.runtime }}
+ path: _artifacts/**/*
diff --git a/.github/actions/package/action.yml b/.github/actions/package/action.yml
index 99c4d4ff1..2031a45c6 100644
--- a/.github/actions/package/action.yml
+++ b/.github/actions/package/action.yml
@@ -2,34 +2,34 @@ name: Package
description: Packages binaries for deployment
inputs:
- platform:
- description: 'Binary platform'
+ runtime:
+ description: "Binary runtime"
required: true
- framework:
- description: '.net framework'
+ framework:
+ description: ".net framework"
required: true
artifact:
- description: 'Binary artifact'
+ description: "Binary artifact"
required: true
branch:
- description: 'Git branch used for this build'
+ description: "Git branch used for this build"
required: true
major_version:
- description: 'Sonarr major version'
+ description: "Sonarr major version"
required: true
version:
- description: 'Sonarr version'
+ description: "Sonarr version"
required: true
runs:
- using: 'composite'
+ using: "composite"
steps:
- name: Download Artifact
uses: actions/download-artifact@v4
with:
name: ${{ inputs.artifact }}
path: _output
-
+
- name: Download UI Artifact
uses: actions/download-artifact@v4
with:
@@ -49,7 +49,7 @@ runs:
run: $GITHUB_ACTION_PATH/package.sh
- name: Create Windows Installer (x64)
- if: ${{ inputs.platform == 'windows' }}
+ if: ${{ inputs.runtime == 'win-x64' }}
working-directory: distribution/windows/setup
shell: cmd
run: |
@@ -58,7 +58,7 @@ runs:
build.bat
- name: Create Windows Installer (x86)
- if: ${{ inputs.platform == 'windows' }}
+ if: ${{ inputs.runtime == 'win-x86' }}
working-directory: distribution/windows/setup
shell: cmd
run: |
@@ -69,7 +69,7 @@ runs:
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
- name: release_${{ inputs.platform }}
+ name: release-${{ inputs.runtime }}
compression-level: 0
if-no-files-found: error
path: |
diff --git a/.github/workflows/build.yml b/.github/workflows/build_v5.yml
similarity index 63%
rename from .github/workflows/build.yml
rename to .github/workflows/build_v5.yml
index 21d70664a..44ff469b2 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build_v5.yml
@@ -3,13 +3,12 @@ name: Build
on:
push:
branches:
- - develop
- - main
+ - v5-develop
+ - v5-main
paths-ignore:
- "src/Sonarr.Api.*/openapi.json"
pull_request:
branches:
- - develop
- v5-develop
paths-ignore:
- "src/NzbDrone.Core/Localization/Core/**"
@@ -22,89 +21,77 @@ concurrency:
env:
FRAMEWORK: net8.0
RAW_BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
- SONARR_MAJOR_VERSION: 4
- VERSION: 4.0.13
+ SONARR_MAJOR_VERSION: 5
+ VERSION: 5.0.0
jobs:
- backend:
- runs-on: windows-latest
+ prepare:
+ runs-on: ubuntu-latest
outputs:
framework: ${{ steps.variables.outputs.framework }}
major_version: ${{ steps.variables.outputs.major_version }}
version: ${{ steps.variables.outputs.version }}
+ branch: ${{ steps.variables.outputs.branch }}
steps:
- - name: Check out
- uses: actions/checkout@v4
-
- - name: Setup .NET
- uses: actions/setup-dotnet@v4
-
- name: Setup Environment Variables
id: variables
shell: bash
run: |
- # Add 800 to the build number because GitHub won't let us pick an arbitrary starting point
- SONARR_VERSION="${{ env.VERSION }}.$((${{ github.run_number }}+800))"
- DOTNET_VERSION=$(jq -r '.sdk.version' global.json)
-
- echo "SDK_PATH=${{ env.DOTNET_ROOT }}/sdk/${DOTNET_VERSION}" >> "$GITHUB_ENV"
- echo "SONARR_VERSION=$SONARR_VERSION" >> "$GITHUB_ENV"
- echo "BRANCH=${RAW_BRANCH_NAME//\//-}" >> "$GITHUB_ENV"
-
echo "framework=${{ env.FRAMEWORK }}" >> "$GITHUB_OUTPUT"
echo "major_version=${{ env.SONARR_MAJOR_VERSION }}" >> "$GITHUB_OUTPUT"
- echo "version=$SONARR_VERSION" >> "$GITHUB_OUTPUT"
+ echo "version=${{ env.VERSION }}.$((${{ github.run_number }}))" >> "$GITHUB_OUTPUT"
+ echo "branch=${RAW_BRANCH_NAME//\//-}" >> "$GITHUB_OUTPUT"
- - name: Enable Extra Platforms In SDK
- shell: bash
- run: ./build.sh --enable-extra-platforms-in-sdk
-
- - name: Build Backend
- shell: bash
- run: ./build.sh --backend --enable-extra-platforms --packages
-
- # Test Artifacts
-
- - name: Publish win-x64 Test Artifact
- uses: ./.github/actions/publish-test-artifact
- with:
- framework: ${{ env.FRAMEWORK }}
- runtime: win-x64
-
- - name: Publish linux-x64 Test Artifact
- uses: ./.github/actions/publish-test-artifact
- with:
- framework: ${{ env.FRAMEWORK }}
- runtime: linux-x64
-
- - name: Publish osx-arm64 Test Artifact
- uses: ./.github/actions/publish-test-artifact
- with:
- framework: ${{ env.FRAMEWORK }}
- runtime: osx-arm64
+ backend:
+ needs: prepare
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - runtime: freebsd-x64
+ package_tests: false
+ os: ubuntu-latest
+ - runtime: linux-arm
+ package_tests: false
+ os: ubuntu-latest
+ - runtime: linux-arm64
+ package_tests: false
+ os: ubuntu-latest
+ - runtime: linux-musl-arm64
+ package_tests: false
+ os: ubuntu-latest
+ - runtime: linux-musl-x64
+ package_tests: false
+ os: ubuntu-latest
+ - runtime: linux-x64
+ package_tests: true
+ os: ubuntu-latest
+ - runtime: osx-arm64
+ package_tests: true
+ os: ubuntu-latest
+ - runtime: osx-x64
+ package_tests: false
+ os: ubuntu-latest
+ - runtime: win-x64
+ package_tests: true
+ os: ubuntu-latest
+ - runtime: win-x86
+ package_tests: false
+ os: ubuntu-latest
- # Build Artifacts (grouped by OS)
+ runs-on: ${{ matrix.os }}
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
- - name: Publish FreeBSD Artifact
- uses: actions/upload-artifact@v4
- with:
- name: build_freebsd
- path: _artifacts/freebsd-*/**/*
- - name: Publish Linux Artifact
- uses: actions/upload-artifact@v4
- with:
- name: build_linux
- path: _artifacts/linux-*/**/*
- - name: Publish macOS Artifact
- uses: actions/upload-artifact@v4
- with:
- name: build_macos
- path: _artifacts/osx-*/**/*
- - name: Publish Windows Artifact
- uses: actions/upload-artifact@v4
+ - name: Build
+ uses: ./.github/actions/build
with:
- name: build_windows
- path: _artifacts/win-*/**/*
+ branch: ${{ needs.prepare.outputs.branch }}
+ version: ${{ needs.prepare.outputs.version }}
+ framework: ${{ needs.prepare.outputs.framework }}
+ runtime: ${{ matrix.runtime }}
+ package_tests: ${{ matrix.package_tests }}
frontend:
runs-on: ubuntu-latest
@@ -179,7 +166,7 @@ jobs:
use_postgres: true
integration_test:
- needs: backend
+ needs: [prepare, backend]
strategy:
fail-fast: false
matrix:
@@ -188,18 +175,18 @@ jobs:
- os: ubuntu-latest
artifact: tests-linux-x64
filter: TestCategory!=ManualTest&TestCategory!=WINDOWS&TestCategory=IntegrationTest
- binary_artifact: build_linux
- binary_path: linux-x64/${{ needs.backend.outputs.framework }}/Sonarr
+ binary_artifact: build-linux-x64
+ binary_path: linux-x64/${{ needs.prepare.outputs.framework }}/Sonarr
- os: macos-latest
artifact: tests-osx-arm64
filter: TestCategory!=ManualTest&TestCategory!=WINDOWS&TestCategory=IntegrationTest
- binary_artifact: build_macos
- binary_path: osx-arm64/${{ needs.backend.outputs.framework }}/Sonarr
+ binary_artifact: build-osx-arm64
+ binary_path: osx-arm64/${{ needs.prepare.outputs.framework }}/Sonarr
- os: windows-latest
artifact: tests-win-x64
filter: TestCategory!=ManualTest&TestCategory!=LINUX&TestCategory=IntegrationTest
- binary_artifact: build_windows
- binary_path: win-x64/${{ needs.backend.outputs.framework }}/Sonarr
+ binary_artifact: build-win-x64
+ binary_path: win-x64/${{ needs.prepare.outputs.framework }}/Sonarr
runs-on: ${{ matrix.os }}
steps:
- name: Check out
@@ -217,20 +204,29 @@ jobs:
binary_path: ${{ matrix.binary_path }}
deploy:
- if: ${{ github.ref_name == 'develop' || github.ref_name == 'main' }}
- needs: [backend, frontend, unit_test, unit_test_postgres, integration_test]
+ if: ${{ github.ref_name == 'v5-develop' || github.ref_name == 'v5-main' }}
+ needs:
+ [
+ prepare,
+ backend,
+ frontend,
+ unit_test,
+ unit_test_postgres,
+ integration_test,
+ ]
secrets: inherit
uses: ./.github/workflows/deploy.yml
with:
- framework: ${{ needs.backend.outputs.framework }}
+ framework: ${{ needs.prepare.outputs.framework }}
branch: ${{ github.ref_name }}
- major_version: ${{ needs.backend.outputs.major_version }}
- version: ${{ needs.backend.outputs.version }}
+ major_version: ${{ needs.prepare.outputs.major_version }}
+ version: ${{ needs.prepare.outputs.version }}
notify:
name: Discord Notification
needs:
[
+ prepare,
backend,
frontend,
unit_test,
@@ -238,7 +234,7 @@ jobs:
integration_test,
deploy,
]
- if: ${{ !cancelled() && (github.ref_name == 'develop' || github.ref_name == 'main') }}
+ if: ${{ !cancelled() && (github.ref_name == 'v5-develop' || github.ref_name == 'v5-main') }}
env:
STATUS: ${{ contains(needs.*.result, 'failure') && 'failure' || 'success' }}
runs-on: ubuntu-latest
@@ -254,5 +250,5 @@ jobs:
embed-url: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
embed-description: |
**Branch** ${{ github.ref }}
- **Build** ${{ needs.backend.outputs.version }}
+ **Build** ${{ needs.prepare.outputs.version }}
embed-color: ${{ env.STATUS == 'success' && '3066993' || '15158332' }}
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 4fa5b54ee..e560a406b 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -3,20 +3,20 @@ name: Deploy
on:
workflow_call:
inputs:
- framework:
- description: '.net framework'
+ framework:
+ description: ".net framework"
type: string
required: true
branch:
- description: 'Git branch used for this build'
+ description: "Git branch used for this build"
type: string
required: true
major_version:
- description: 'Sonarr major version'
+ description: "Sonarr major version"
type: string
required: true
version:
- description: 'Sonarr version'
+ description: "Sonarr version"
type: string
required: true
secrets:
@@ -27,31 +27,42 @@ jobs:
package:
strategy:
matrix:
- platform: [freebsd, linux, macos, windows]
include:
- - platform: freebsd
+ - runtime: freebsd-x64
os: ubuntu-latest
- - platform: linux
+ - runtime: linux-arm
os: ubuntu-latest
- - platform: macos
+ - runtime: linux-arm64
os: ubuntu-latest
- - platform: windows
+ - runtime: linux-musl-arm64
+ os: ubuntu-latest
+ - runtime: linux-musl-x64
+ os: ubuntu-latest
+ - runtime: linux-x64
+ os: ubuntu-latest
+ - runtime: osx-arm64
+ os: ubuntu-latest
+ - runtime: osx-x64
+ os: ubuntu-latest
+ - runtime: win-x64
+ os: windows-latest
+ - runtime: win-x86
os: windows-latest
runs-on: ${{ matrix.os }}
steps:
- - name: Check out
- uses: actions/checkout@v4
-
- - name: Package
- uses: ./.github/actions/package
- with:
- framework: ${{ inputs.framework }}
- platform: ${{ matrix.platform }}
- artifact: build_${{ matrix.platform }}
- branch: ${{ inputs.branch }}
- major_version: ${{ inputs.major_version }}
- version: ${{ inputs.version }}
+ - name: Check out
+ uses: actions/checkout@v4
+
+ - name: Package
+ uses: ./.github/actions/package
+ with:
+ framework: ${{ inputs.framework }}
+ runtime: ${{ matrix.runtime }}
+ artifact: build-${{ matrix.runtime }}
+ branch: ${{ inputs.branch }}
+ major_version: ${{ inputs.major_version }}
+ version: ${{ inputs.version }}
release:
needs: package
@@ -59,102 +70,102 @@ jobs:
permissions:
contents: write
steps:
- - name: Check out
- uses: actions/checkout@v4
-
- - name: Download release artifacts
- uses: actions/download-artifact@v4
- with:
- path: _artifacts
- pattern: release_*
- merge-multiple: true
-
- - name: Get Previous Release
- id: previous-release
- uses: cardinalby/git-get-release-action@v1
- env:
- GITHUB_TOKEN: ${{ github.token }}
- with:
- latest: true
- prerelease: ${{ inputs.branch != 'main' }}
-
- - name: Generate Release Notes
- id: generate-release-notes
- uses: actions/github-script@v7
- with:
- github-token: ${{ github.token }}
- result-encoding: string
- script: |
- const { data } = await github.rest.repos.generateReleaseNotes({
- owner: context.repo.owner,
- repo: context.repo.repo,
- tag_name: 'v${{ inputs.version }}',
- target_commitish: '${{ github.sha }}',
- previous_tag_name: '${{ steps.previous-release.outputs.tag_name }}',
- })
- return data.body
-
- - name: Create release
- uses: ncipollo/release-action@v1
- with:
- artifacts: _artifacts/Sonarr.*
- commit: ${{ github.sha }}
- generateReleaseNotes: false
- body: ${{ steps.generate-release-notes.outputs.result }}
- name: ${{ inputs.version }}
- prerelease: ${{ inputs.branch != 'main' }}
- skipIfReleaseExists: true
- tag: v${{ inputs.version }}
-
- - name: Publish to Services
- shell: bash
- working-directory: _artifacts
- run: |
- branch=${{ inputs.branch }}
- version=${{ inputs.version }}
- lastCommit=${{ github.sha }}
-
- hashes="["
-
- addHash() {
- path=$1
- os=$2
- arch=$3
- type=$4
-
- local hash=$(sha256sum *.$version.$path | awk '{ print $1; }')
- echo "{ \""Os\"": \""$os\"", \""Arch\"": \""$arch\"", \""Type\"": \""$type\"", \""Hash\"": \""$hash\"" }"
- }
-
- hashes="$hashes $(addHash "linux-arm.tar.gz" "linux" "arm" "archive")"
- hashes="$hashes, $(addHash "linux-arm64.tar.gz" "linux" "arm64" "archive")"
- hashes="$hashes, $(addHash "linux-x64.tar.gz" "linux" "x64" "archive")"
- # hashes="$hashes, $(addHash "linux-x86.tar.gz" "linux" "x86" "archive")"
-
- # hashes="$hashes, $(addHash "linux-musl-arm.tar.gz" "linuxmusl" "arm" "archive")"
- hashes="$hashes, $(addHash "linux-musl-arm64.tar.gz" "linuxmusl" "arm64" "archive")"
- hashes="$hashes, $(addHash "linux-musl-x64.tar.gz" "linuxmusl" "x64" "archive")"
-
- hashes="$hashes, $(addHash "osx-arm64.tar.gz" "osx" "arm64" "archive")"
- hashes="$hashes, $(addHash "osx-x64.tar.gz" "osx" "x64" "archive")"
-
- hashes="$hashes, $(addHash "osx-arm64-app.zip" "osx" "arm64" "installer")"
- hashes="$hashes, $(addHash "osx-x64-app.zip" "osx" "x64" "installer")"
-
- hashes="$hashes, $(addHash "win-x64.zip" "windows" "x64" "archive")"
- hashes="$hashes, $(addHash "win-x86.zip" "windows" "x86" "archive")"
-
- hashes="$hashes, $(addHash "win-x64-installer.exe" "windows" "x64" "installer")"
- hashes="$hashes, $(addHash "win-x86-installer.exe" "windows" "x86" "installer")"
-
- hashes="$hashes, $(addHash "freebsd-x64.tar.gz" "freebsd" "x64" "archive")"
-
- hashes="$hashes ]"
-
- json="{\""branch\"":\""$branch\"", \""version\"":\""$version\"", \""lastCommit\"":\""$lastCommit\"", \""hashes\"":$hashes, \""gitHubRelease\"":true}"
- url="https://services.sonarr.tv/v1/update"
-
- echo "Publishing update $version ($branch) to: $url"
- echo "$json"
-
- curl -H "Content-Type: application/json" -H "X-Api-Key: ${{ secrets.SERVICES_API_KEY }}" -X POST -d "$json" --fail-with-body $url
+ - name: Check out
+ uses: actions/checkout@v4
+
+ - name: Download release artifacts
+ uses: actions/download-artifact@v4
+ with:
+ path: _artifacts
+ pattern: release-*
+ merge-multiple: true
+
+ - name: Get Previous Release
+ id: previous-release
+ uses: cardinalby/git-get-release-action@v1
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+ with:
+ latest: true
+ prerelease: ${{ inputs.branch != 'main' }}
+
+ - name: Generate Release Notes
+ id: generate-release-notes
+ uses: actions/github-script@v7
+ with:
+ github-token: ${{ github.token }}
+ result-encoding: string
+ script: |
+ const { data } = await github.rest.repos.generateReleaseNotes({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ tag_name: 'v${{ inputs.version }}',
+ target_commitish: '${{ github.sha }}',
+ previous_tag_name: '${{ steps.previous-release.outputs.tag_name }}',
+ })
+ return data.body
+
+ - name: Create release
+ uses: ncipollo/release-action@v1
+ with:
+ artifacts: _artifacts/Sonarr.*
+ commit: ${{ github.sha }}
+ generateReleaseNotes: false
+ body: ${{ steps.generate-release-notes.outputs.result }}
+ name: ${{ inputs.version }}
+ prerelease: ${{ inputs.branch != 'main' }}
+ skipIfReleaseExists: true
+ tag: v${{ inputs.version }}
+
+ - name: Publish to Services
+ shell: bash
+ working-directory: _artifacts
+ run: |
+ branch=${{ inputs.branch }}
+ version=${{ inputs.version }}
+ lastCommit=${{ github.sha }}
+
+ hashes="["
+
+ addHash() {
+ path=$1
+ os=$2
+ arch=$3
+ type=$4
+
+ local hash=$(sha256sum *.$version.$path | awk '{ print $1; }')
+ echo "{ \""Os\"": \""$os\"", \""Arch\"": \""$arch\"", \""Type\"": \""$type\"", \""Hash\"": \""$hash\"" }"
+ }
+
+ hashes="$hashes $(addHash "linux-arm.tar.gz" "linux" "arm" "archive")"
+ hashes="$hashes, $(addHash "linux-arm64.tar.gz" "linux" "arm64" "archive")"
+ hashes="$hashes, $(addHash "linux-x64.tar.gz" "linux" "x64" "archive")"
+ # hashes="$hashes, $(addHash "linux-x86.tar.gz" "linux" "x86" "archive")"
+
+ # hashes="$hashes, $(addHash "linux-musl-arm.tar.gz" "linuxmusl" "arm" "archive")"
+ hashes="$hashes, $(addHash "linux-musl-arm64.tar.gz" "linuxmusl" "arm64" "archive")"
+ hashes="$hashes, $(addHash "linux-musl-x64.tar.gz" "linuxmusl" "x64" "archive")"
+
+ hashes="$hashes, $(addHash "osx-arm64.tar.gz" "osx" "arm64" "archive")"
+ hashes="$hashes, $(addHash "osx-x64.tar.gz" "osx" "x64" "archive")"
+
+ hashes="$hashes, $(addHash "osx-arm64-app.zip" "osx" "arm64" "installer")"
+ hashes="$hashes, $(addHash "osx-x64-app.zip" "osx" "x64" "installer")"
+
+ hashes="$hashes, $(addHash "win-x64.zip" "windows" "x64" "archive")"
+ hashes="$hashes, $(addHash "win-x86.zip" "windows" "x86" "archive")"
+
+ hashes="$hashes, $(addHash "win-x64-installer.exe" "windows" "x64" "installer")"
+ hashes="$hashes, $(addHash "win-x86-installer.exe" "windows" "x86" "installer")"
+
+ hashes="$hashes, $(addHash "freebsd-x64.tar.gz" "freebsd" "x64" "archive")"
+
+ hashes="$hashes ]"
+
+ json="{\""branch\"":\""$branch\"", \""version\"":\""$version\"", \""lastCommit\"":\""$lastCommit\"", \""hashes\"":$hashes, \""gitHubRelease\"":true}"
+ url="https://services.sonarr.tv/v1/update"
+
+ echo "Publishing update $version ($branch) to: $url"
+ echo "$json"
+
+ curl -H "Content-Type: application/json" -H "X-Api-Key: ${{ secrets.SERVICES_API_KEY }}" -X POST -d "$json" --fail-with-body $url
diff --git a/build.sh b/build.sh
deleted file mode 100755
index 29908e8cf..000000000
--- a/build.sh
+++ /dev/null
@@ -1,455 +0,0 @@
-#! /usr/bin/env bash
-set -e
-
-outputFolder='_output'
-testPackageFolder='_tests'
-artifactsFolder="_artifacts";
-framework="${FRAMEWORK:=net8.0}"
-
-ProgressStart()
-{
- echo "::group::$1"
- echo "Start '$1'"
-}
-
-ProgressEnd()
-{
- echo "Finish '$1'"
- echo "::endgroup::"
-}
-
-UpdateVersionNumber()
-{
- if [ "$SONARR_VERSION" != "" ]; then
- echo "Updating version info to: $SONARR_VERSION"
- sed -i'' -e "s/[0-9.*]\+<\/AssemblyVersion>/$SONARR_VERSION<\/AssemblyVersion>/g" src/Directory.Build.props
- sed -i'' -e "s/[\$()A-Za-z-]\+<\/AssemblyConfiguration>/${BRANCH}<\/AssemblyConfiguration>/g" src/Directory.Build.props
- sed -i'' -e "s/10.0.0.0<\/string>/$SONARR_VERSION<\/string>/g" distribution/macOS/Sonarr.app/Contents/Info.plist
- fi
-}
-
-EnableExtraPlatformsInSDK()
-{
- BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
- if grep -q freebsd-x64 "$BUNDLEDVERSIONS"; then
- echo "Extra platforms already enabled"
- else
- echo "Enabling extra platform support"
- sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' "$BUNDLEDVERSIONS"
- fi
-}
-
-EnableExtraPlatforms()
-{
- if grep -qv freebsd-x64 src/Directory.Build.props; then
- sed -i'' -e "s^\(.*\)^\1;freebsd-x64^g" src/Directory.Build.props
- fi
-}
-
-LintUI()
-{
- ProgressStart 'ESLint'
- yarn lint
- ProgressEnd 'ESLint'
-
- ProgressStart 'Stylelint'
- yarn stylelint
- ProgressEnd 'Stylelint'
-}
-
-Build()
-{
- ProgressStart 'Build'
-
- rm -rf $outputFolder
- rm -rf $testPackageFolder
-
- slnFile=src/Sonarr.sln
-
- if [ $os = "windows" ]; then
- platform=Windows
- else
- platform=Posix
- fi
-
- dotnet clean $slnFile -c Debug
- dotnet clean $slnFile -c Release
-
- if [[ -z "$RID" || -z "$FRAMEWORK" ]];
- then
- dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids
- else
- dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids
- fi
-
- ProgressEnd 'Build'
-}
-
-YarnInstall()
-{
- ProgressStart 'yarn install'
- yarn install --frozen-lockfile --network-timeout 120000
- ProgressEnd 'yarn install'
-}
-
-RunWebpack()
-{
- ProgressStart 'Running webpack'
- yarn run build --env production
- ProgressEnd 'Running webpack'
-}
-
-PackageFiles()
-{
- local folder="$1"
- local framework="$2"
- local runtime="$3"
-
- rm -rf $folder
- mkdir -p $folder
- cp -r $outputFolder/$framework/$runtime/publish/* $folder
- cp -r $outputFolder/Sonarr.Update/$framework/$runtime/publish $folder/Sonarr.Update
-
- if [ "$FRONTEND" = "YES" ];
- then
- cp -r $outputFolder/UI $folder
- fi
-
- echo "Adding LICENSE"
- cp LICENSE.md $folder
-}
-
-PackageLinux()
-{
- local framework="$1"
- local runtime="$2"
-
- ProgressStart "Creating $runtime Package for $framework"
-
- local folder=$artifactsFolder/$runtime/$framework/Sonarr
-
- PackageFiles "$folder" "$framework" "$runtime"
-
- echo "Removing Service helpers"
- rm -f $folder/ServiceUninstall.*
- rm -f $folder/ServiceInstall.*
-
- echo "Removing Sonarr.Windows"
- rm $folder/Sonarr.Windows.*
-
- echo "Adding Sonarr.Mono to UpdatePackage"
- cp $folder/Sonarr.Mono.* $folder/Sonarr.Update
- if [ "$framework" = "$framework" ]; then
- cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update
- cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update
- fi
-
- ProgressEnd "Creating $runtime Package for $framework"
-}
-
-PackageMacOS()
-{
- local framework="$1"
- local runtime="$2"
-
- ProgressStart "Creating $runtime Package for $framework"
-
- local folder=$artifactsFolder/$runtime/$framework/Sonarr
-
- PackageFiles "$folder" "$framework" "$runtime"
-
- echo "Removing Service helpers"
- rm -f $folder/ServiceUninstall.*
- rm -f $folder/ServiceInstall.*
-
- echo "Removing Sonarr.Windows"
- rm $folder/Sonarr.Windows.*
-
- echo "Adding Sonarr.Mono to UpdatePackage"
- cp $folder/Sonarr.Mono.* $folder/Sonarr.Update
- if [ "$framework" = "$framework" ]; then
- cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update
- cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update
- fi
-
- ProgressEnd "Creating $runtime Package for $framework"
-}
-
-PackageMacOSApp()
-{
- local framework="$1"
- local runtime="$2"
-
- ProgressStart "Creating $runtime App Package for $framework"
-
- local folder=$artifactsFolder/$runtime-app/$framework
-
- rm -rf $folder
- mkdir -p $folder
- cp -r distribution/macOS/Sonarr.app $folder
- mkdir -p $folder/Sonarr.app/Contents/MacOS
-
- echo "Copying Binaries"
- cp -r $artifactsFolder/$runtime/$framework/Sonarr/* $folder/Sonarr.app/Contents/MacOS
-
- echo "Removing Update Folder"
- rm -r $folder/Sonarr.app/Contents/MacOS/Sonarr.Update
-
- ProgressEnd "Creating $runtime App Package for $framework"
-}
-
-PackageWindows()
-{
- local framework="$1"
- local runtime="$2"
-
- ProgressStart "Creating Windows Package for $framework"
-
- local folder=$artifactsFolder/$runtime/$framework/Sonarr
-
- PackageFiles "$folder" "$framework" "$runtime"
- cp -r $outputFolder/$framework-windows/$runtime/publish/* $folder
-
- echo "Removing Sonarr.Mono"
- rm -f $folder/Sonarr.Mono.*
- rm -f $folder/Mono.Posix.NETStandard.*
- rm -f $folder/libMonoPosixHelper.*
-
- echo "Adding Sonarr.Windows to UpdatePackage"
- cp $folder/Sonarr.Windows.* $folder/Sonarr.Update
-
- ProgressEnd "Creating Windows Package for $framework"
-}
-
-Package()
-{
- local framework="$1"
- local runtime="$2"
- local SPLIT
-
- IFS='-' read -ra SPLIT <<< "$runtime"
-
- case "${SPLIT[0]}" in
- linux|freebsd*)
- PackageLinux "$framework" "$runtime"
- ;;
- win)
- PackageWindows "$framework" "$runtime"
- ;;
- osx)
- PackageMacOS "$framework" "$runtime"
- ;;
- esac
-}
-
-PackageTests()
-{
- local framework="$1"
- local runtime="$2"
-
- ProgressStart "Creating $runtime Test Package for $framework"
-
- cp test.sh "$testPackageFolder/$framework/$runtime/publish"
-
- rm -f $testPackageFolder/$framework/$runtime/*.log.config
-
- ProgressEnd "Creating $runtime Test Package for $framework"
-}
-
-UploadTestArtifacts()
-{
- local framework="$1"
-
- ProgressStart 'Publishing Test Artifacts'
-
- # Tests
- for dir in $testPackageFolder/$framework/*
- do
- local runtime=$(basename "$dir")
- echo "##teamcity[publishArtifacts '$testPackageFolder/$framework/$runtime/publish/** => tests.$runtime.zip']"
- done
-
- ProgressEnd 'Publishing Test Artifacts'
-}
-
-UploadArtifacts()
-{
- local framework="$1"
-
- ProgressStart 'Publishing Artifacts'
-
- # Releases
- for dir in $artifactsFolder/*
- do
- local runtime=$(basename "$dir")
-
- echo "##teamcity[publishArtifacts '$artifactsFolder/$runtime/$framework/** => Sonarr.$BRANCH.$SONARR_VERSION.$runtime.zip']"
- done
-
- # Debian Package / Windows installer / macOS app
- echo "##teamcity[publishArtifacts 'distribution/** => distribution.zip']"
-
- ProgressEnd 'Publishing Artifacts'
-}
-
-UploadUIArtifacts()
-{
- local framework="$1"
-
- ProgressStart 'Publishing UI Artifacts'
-
- # UI folder
- echo "##teamcity[publishArtifacts '$outputFolder/UI/** => UI.zip']"
-
- ProgressEnd 'Publishing UI Artifacts'
-}
-
-# Use mono or .net depending on OS
-case "$(uname -s)" in
- CYGWIN*|MINGW32*|MINGW64*|MSYS*)
- # on windows, use dotnet
- os="windows"
- ;;
- *)
- # otherwise use mono
- os="posix"
- ;;
-esac
-
-POSITIONAL=()
-
-if [ $# -eq 0 ]; then
- echo "No arguments provided, building everything"
- BACKEND=YES
- FRONTEND=YES
- PACKAGES=YES
- LINT=YES
- ENABLE_EXTRA_PLATFORMS=NO
- ENABLE_EXTRA_PLATFORMS_IN_SDK=NO
-fi
-
-while [[ $# -gt 0 ]]
-do
-key="$1"
-
-case $key in
- --backend)
- BACKEND=YES
- shift # past argument
- ;;
- --enable-bsd|--enable-extra-platforms)
- ENABLE_EXTRA_PLATFORMS=YES
- shift # past argument
- ;;
- --enable-extra-platforms-in-sdk)
- ENABLE_EXTRA_PLATFORMS_IN_SDK=YES
- shift # past argument
- ;;
- -r|--runtime)
- RID="$2"
- shift # past argument
- shift # past value
- ;;
- -f|--framework)
- FRAMEWORK="$2"
- shift # past argument
- shift # past value
- ;;
- --frontend)
- FRONTEND=YES
- shift # past argument
- ;;
- --packages)
- PACKAGES=YES
- shift # past argument
- ;;
- --lint)
- LINT=YES
- shift # past argument
- ;;
- --all)
- BACKEND=YES
- FRONTEND=YES
- PACKAGES=YES
- LINT=YES
- shift # past argument
- ;;
- *) # unknown option
- POSITIONAL+=("$1") # save it in an array for later
- shift # past argument
- ;;
-esac
-done
-set -- "${POSITIONAL[@]}" # restore positional parameters
-
-if [ "$ENABLE_EXTRA_PLATFORMS_IN_SDK" = "YES" ];
-then
- EnableExtraPlatformsInSDK
-fi
-
-if [ "$BACKEND" = "YES" ];
-then
- UpdateVersionNumber
- if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
- then
- EnableExtraPlatforms
- fi
-
- Build
-
- if [[ -z "$RID" || -z "$FRAMEWORK" ]];
- then
- PackageTests "$framework" "win-x64"
- PackageTests "$framework" "win-x86"
- PackageTests "$framework" "linux-x64"
- PackageTests "$framework" "linux-musl-x64"
- PackageTests "$framework" "osx-x64"
- if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
- then
- PackageTests "$framework" "freebsd-x64"
- fi
- else
- PackageTests "$FRAMEWORK" "$RID"
- fi
-
- UploadTestArtifacts "$framework"
-fi
-
-if [ "$FRONTEND" = "YES" ];
-then
- YarnInstall
-
- if [ "$LINT" = "YES" ];
- then
- LintUI
- fi
-
- RunWebpack
- UploadUIArtifacts
-fi
-
-if [ "$PACKAGES" = "YES" ];
-then
- UpdateVersionNumber
-
- if [[ -z "$RID" || -z "$FRAMEWORK" ]];
- then
- Package "$framework" "win-x64"
- Package "$framework" "win-x86"
- Package "$framework" "linux-x64"
- Package "$framework" "linux-musl-x64"
- Package "$framework" "linux-arm64"
- Package "$framework" "linux-musl-arm64"
- Package "$framework" "linux-arm"
- Package "$framework" "osx-x64"
- Package "$framework" "osx-arm64"
- if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
- then
- Package "$framework" "freebsd-x64"
- fi
- else
- Package "$FRAMEWORK" "$RID"
- fi
-
- UploadArtifacts "$framework"
-fi