From e40c8f3e3ea1a3d925298fa342efd3d8b868b64b Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 30 Jan 2025 20:59:58 -0800 Subject: [PATCH] Improve build speed --- .github/actions/build/action.yml | 188 ++++++++ .github/actions/package/action.yml | 26 +- .github/workflows/{build.yml => build_v5.yml} | 162 +++---- .github/workflows/deploy.yml | 253 +++++----- build.sh | 455 ------------------ 5 files changed, 412 insertions(+), 672 deletions(-) create mode 100644 .github/actions/build/action.yml rename .github/workflows/{build.yml => build_v5.yml} (63%) delete mode 100755 build.sh 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