diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 16389b10e..8bf2d4e65 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -79,7 +79,18 @@ stages: displayName: 'Install .net core' inputs: version: $(dotnetVersion) - - bash: ./build.sh --backend + - bash: | + BUNDLEDVERSIONS=${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}/Microsoft.NETCoreSdk.BundledVersions.props + echo $BUNDLEDVERSIONS + grep osx-x64 $BUNDLEDVERSIONS + if grep -q freebsd-x64 $BUNDLEDVERSIONS; then + echo "BSD already enabled" + else + echo "Enabling BSD support" + sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' $BUNDLEDVERSIONS + fi + displayName: Enable FreeBSD Support + - bash: ./build.sh --backend --enable-bsd displayName: Build Radarr Backend - bash: | find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \; @@ -108,6 +119,10 @@ stages: artifact: LinuxMuslCoreTests displayName: Publish Linux Musl Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) + - publish: '$(testsFolder)/net5.0/freebsd-x64/publish' + artifact: FreebsdCoreTests + displayName: Publish FreeBSD Test Package + condition: and(succeeded(), eq(variables['osName'], 'Windows')) - publish: '$(testsFolder)/net5.0/osx-x64/publish' artifact: MacCoreTests displayName: Publish MacOS Test Package @@ -219,7 +234,7 @@ stages: artifactName: WindowsFrontend targetPath: _output displayName: Fetch Frontend - - bash: ./build.sh --packages + - bash: ./build.sh --packages --enable-bsd displayName: Create Packages - bash: | find . -name "Radarr" -exec chmod a+x {} \; @@ -302,6 +317,14 @@ stages: tarCompression: 'gz' includeRootFolder: false rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net5.0 + - task: ArchiveFiles@2 + displayName: Create FreeBSD Core Core tar + inputs: + archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).freebsd-core-x64.tar.gz' + archiveType: 'tar' + tarCompression: 'gz' + includeRootFolder: false + rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net5.0 - publish: $(Build.ArtifactStagingDirectory) artifact: 'Packages' displayName: Publish Packages @@ -355,24 +378,34 @@ stages: displayName: Unit Native dependsOn: Prepare condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) + workspace: + clean: all strategy: matrix: MacCore: osName: 'Mac' testName: 'MacCore' + poolName: 'Azure Pipelines' imageName: 'macos-10.14' WindowsCore: osName: 'Windows' testName: 'WindowsCore' + poolName: 'Azure Pipelines' imageName: 'windows-2019' LinuxCore: osName: 'Linux' testName: 'LinuxCore' + poolName: 'Azure Pipelines' imageName: 'ubuntu-18.04' - pattern: 'Radarr.**.linux-core-x64.tar.gz' + FreebsdCore: + osName: 'Linux' + testName: 'FreebsdCore' + poolName: 'FreeBSD' + imageName: pool: + name: $(poolName) vmImage: $(imageName) steps: @@ -381,6 +414,7 @@ stages: displayName: 'Install .net core' inputs: version: $(dotnetVersion) + condition: ne(variables['poolName'], 'FreeBSD') - task: DownloadPipelineArtifact@2 displayName: Download Test Artifact inputs: @@ -393,7 +427,7 @@ stages: sudo apt-get update sudo apt-get install -y --allow-unauthenticated libmediainfo-dev libmediainfo0v5 mediainfo displayName: Install mediainfo - condition: and(succeeded(), eq(variables['osName'], 'Linux')) + condition: and(succeeded(), eq(variables['testName'], 'LinuxCore')) - powershell: Set-Service SCardSvr -StartupType Manual displayName: Enable Windows Test Service condition: and(succeeded(), eq(variables['osName'], 'Windows')) @@ -508,17 +542,17 @@ stages: osName: 'Mac' testName: 'MacCore' imageName: 'macos-10.14' - pattern: 'Radarr.**.osx-core-x64.tar.gz' + pattern: 'Radarr.*.osx-core-x64.tar.gz' WindowsCore: osName: 'Windows' testName: 'WindowsCore' imageName: 'windows-2019' - pattern: 'Radarr.**.windows-core-x64.zip' + pattern: 'Radarr.*.windows-core-x64.zip' LinuxCore: osName: 'Linux' testName: 'LinuxCore' imageName: 'ubuntu-18.04' - pattern: 'Radarr.**.linux-core-x64.tar.gz' + pattern: 'Radarr.*.linux-core-x64.tar.gz' pool: vmImage: $(imageName) @@ -571,6 +605,52 @@ stages: failTaskOnFailedTests: true displayName: Publish Test Results + - job: Integration_FreeBSD + displayName: Integration Native FreeBSD + dependsOn: Prepare + condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) + workspace: + clean: all + variables: + pattern: 'Radarr.*.freebsd-core-x64.tar.gz' + pool: + name: 'FreeBSD' + + steps: + - checkout: none + - task: DownloadPipelineArtifact@2 + displayName: Download Test Artifact + inputs: + buildType: 'current' + artifactName: 'FreebsdCoreTests' + targetPath: $(testsFolder) + - task: DownloadPipelineArtifact@2 + displayName: Download Build Artifact + inputs: + buildType: 'current' + artifactName: Packages + itemPattern: '/$(pattern)' + targetPath: $(Build.ArtifactStagingDirectory) + - bash: | + mkdir -p ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin + tar xf ${BUILD_ARTIFACTSTAGINGDIRECTORY}/$(pattern) -C ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin + displayName: Extract Package + - bash: | + mkdir -p ./bin/ + cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Radarr/. ./bin/ + displayName: Move Package Contents + - bash: | + chmod a+x ${TESTSFOLDER}/test.sh + ${TESTSFOLDER}/test.sh Linux Integration Test + displayName: Run Integration Tests + - task: PublishTestResults@2 + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: '**/TestResult.xml' + testRunTitle: 'FreeBSD Integration Tests' + failTaskOnFailedTests: true + displayName: Publish Test Results + - job: Integration_Docker displayName: Integration Docker dependsOn: Prepare @@ -581,22 +661,22 @@ stages: testName: 'Mono 5.20' artifactName: LinuxTests containerImage: ghcr.io/servarr/testimages:mono-5.20 - pattern: 'Radarr.**.linux.tar.gz' + pattern: 'Radarr.*.linux.tar.gz' mono610: testName: 'Mono 6.10' artifactName: LinuxTests containerImage: ghcr.io/servarr/testimages:mono-6.10 - pattern: 'Radarr.**.linux.tar.gz' + pattern: 'Radarr.*.linux.tar.gz' mono612: testName: 'Mono 6.12' artifactName: LinuxTests containerImage: ghcr.io/servarr/testimages:mono-6.12 - pattern: 'Radarr.**.linux.tar.gz' + pattern: 'Radarr.*.linux.tar.gz' alpine: testName: 'Musl Net Core' artifactName: LinuxMuslCoreTests containerImage: ghcr.io/servarr/testimages:alpine - pattern: 'Radarr.**.linux-musl-core-x64.tar.gz' + pattern: 'Radarr.*.linux-musl-core-x64.tar.gz' pool: vmImage: 'ubuntu-18.04' @@ -655,17 +735,17 @@ stages: Linux: osName: 'Linux' imageName: 'ubuntu-18.04' - pattern: 'Radarr.**.linux-core-x64.tar.gz' + pattern: 'Radarr.*.linux-core-x64.tar.gz' failBuild: true Mac: osName: 'Mac' imageName: 'macos-10.14' - pattern: 'Radarr.**.osx-core-x64.tar.gz' + pattern: 'Radarr.*.osx-core-x64.tar.gz' failBuild: true Windows: osName: 'Windows' imageName: 'windows-2019' - pattern: 'Radarr.**.windows-core-x64.zip' + pattern: 'Radarr.*.windows-core-x64.zip' failBuild: true pool: diff --git a/build.sh b/build.sh index 79f85ea5e..38d384503 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#! /bin/bash +#! /usr/bin/env bash set -e outputFolder='_output' @@ -25,6 +25,18 @@ UpdateVersionNumber() fi } +EnableBsdSupport() +{ + #todo enable sdk with + #SDK_PATH=$(dotnet --list-sdks | grep -P '5\.\d\.\d+' | head -1 | sed 's/\(5\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g') + # BUNDLED_VERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props" + + if grep -qv freebsd-x64 src/Directory.Build.props; then + sed -i'' -e "s^\(.*\)^\1;freebsd-x64^g" src/Directory.Build.props + sed -i'' -e "s^\(.*\)^\1;freebsd-x64:net472^g" src/Directory.Build.props + fi +} + LintUI() { ProgressStart 'ESLint' @@ -212,7 +224,7 @@ Package() IFS='-' read -ra SPLIT <<< "$runtime" case "${SPLIT[0]}" in - linux) + linux|freebsd*) PackageLinux "$framework" "$runtime" ;; win) @@ -257,6 +269,7 @@ if [ $# -eq 0 ]; then FRONTEND=YES PACKAGES=YES LINT=YES + ENABLE_BSD=NO fi while [[ $# -gt 0 ]] @@ -268,6 +281,10 @@ case $key in BACKEND=YES shift # past argument ;; + --enable-bsd) + ENABLE_BSD=YES + shift # past argument + ;; -r|--runtime) RID="$2" shift # past argument @@ -308,6 +325,10 @@ set -- "${POSITIONAL[@]}" # restore positional parameters if [ "$BACKEND" = "YES" ]; then UpdateVersionNumber + if [ "$ENABLE_BSD" = "YES" ]; + then + EnableBsdSupport + fi Build if [[ -z "$RID" || -z "$FRAMEWORK" ]]; then @@ -317,6 +338,10 @@ then PackageTests "net5.0" "linux-musl-x64" PackageTests "net5.0" "osx-x64" PackageTests "net472" "linux-x64" + if [ "$ENABLE_BSD" = "YES" ]; + then + PackageTests "net5.0" "freebsd-x64" + fi else PackageTests "$FRAMEWORK" "$RID" fi @@ -353,6 +378,10 @@ then Package "net5.0" "linux-arm" Package "net5.0" "osx-x64" Package "net472" "linux-x64" + if [ "$ENABLE_BSD" = "YES" ]; + then + Package "net5.0" "freebsd-x64" + fi else Package "$FRAMEWORK" "$RID" fi diff --git a/src/NuGet.config b/src/NuGet.config index 1e62183de..21ffcbbda 100644 --- a/src/NuGet.config +++ b/src/NuGet.config @@ -1,9 +1,11 @@ + - + + + - diff --git a/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs b/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs index 7d7d13646..4b89d2f44 100644 --- a/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs +++ b/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs @@ -25,11 +25,11 @@ namespace NzbDrone.Core.Test.UpdateTests } [Test] - [Platform(Exclude = "NetCore")] public void finds_update_when_version_lower() { + NotBsd(); UseRealHttp(); - Subject.GetLatestUpdate("develop", new Version(0, 2)).Should().NotBeNull(); + Subject.GetLatestUpdate("develop", new Version(3, 0)).Should().NotBeNull(); } [Test] @@ -43,9 +43,11 @@ namespace NzbDrone.Core.Test.UpdateTests [Test] public void should_get_recent_updates() { + NotBsd(); + const string branch = "nightly"; UseRealHttp(); - var recent = Subject.GetRecentUpdates(branch, new Version(2, 0), null); + var recent = Subject.GetRecentUpdates(branch, new Version(3, 0), null); var recentWithChanges = recent.Where(c => c.Changes != null); recent.Should().NotBeEmpty(); diff --git a/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs b/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs index 0d076d1e1..cb804ecf4 100644 --- a/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs +++ b/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs @@ -8,6 +8,7 @@ using Mono.Unix.Native; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Test.DiskTests; using NzbDrone.Mono.Disk; @@ -80,7 +81,11 @@ namespace NzbDrone.Mono.Test.DiskProviderTests if (stat.st_mode != mode) { - Syscall.chmod(path, mode); + if (Syscall.chmod(path, mode) < 0) + { + var error = Stdlib.GetLastError(); + throw new LinuxPermissionsException("Error setting group: " + error); + } } } @@ -221,9 +226,13 @@ namespace NzbDrone.Mono.Test.DiskProviderTests Syscall.stat(tempFile, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0644"); - Subject.SetPermissions(tempFile, "1775", null); - Syscall.stat(tempFile, out fileStat); - NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("1664"); + if (OsInfo.Os != Os.Bsd) + { + // This is not allowed on BSD + Subject.SetPermissions(tempFile, "1775", null); + Syscall.stat(tempFile, out fileStat); + NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("1664"); + } } [Test] diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/FreebsdVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/FreebsdVersionAdapterFixture.cs new file mode 100644 index 000000000..1376316a6 --- /dev/null +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/FreebsdVersionAdapterFixture.cs @@ -0,0 +1,34 @@ +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Processes; +using NzbDrone.Mono.EnvironmentInfo.VersionAdapters; +using NzbDrone.Test.Common; + +namespace NzbDrone.Mono.Test.EnvironmentInfo +{ + [TestFixture] + [Platform("Linux")] + public class FreebsdVersionAdapterFixture : TestBase + { + [SetUp] + public void Setup() + { + if (OsInfo.Os != Os.Bsd) + { + throw new IgnoreException("BSD Only"); + } + + Mocker.SetConstant(Mocker.Resolve()); + } + + [Test] + public void should_get_version_info() + { + var info = Subject.Read(); + info.FullName.Should().NotBeNullOrWhiteSpace(); + info.Name.Should().NotBeNullOrWhiteSpace(); + info.Version.Should().NotBeNullOrWhiteSpace(); + } + } +} diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs index 5e36f93c9..e59b54ba4 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs @@ -14,6 +14,8 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo [SetUp] public void Setup() { + NotBsd(); + Mocker.SetConstant(Mocker.Resolve()); } diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs index 3a93a719b..0c3257657 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs @@ -19,6 +19,8 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters [Platform("Linux")] public void should_get_version_info_from_actual_linux() { + NotBsd(); + Mocker.SetConstant(Mocker.Resolve()); var info = Subject.Read(); info.FullName.Should().NotBeNullOrWhiteSpace(); diff --git a/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj b/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj index d5668ef5d..f8d111e77 100644 --- a/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj +++ b/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj @@ -10,7 +10,7 @@ See https://github.com/xamarin/XamarinComponents/issues/282 --> - + diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/FreebsdVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/FreebsdVersionAdapter.cs new file mode 100644 index 000000000..416bfd18c --- /dev/null +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/FreebsdVersionAdapter.cs @@ -0,0 +1,27 @@ +using System.Linq; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Processes; + +namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters +{ + public class FreebsdVersionAdapter : IOsVersionAdapter + { + private readonly IProcessProvider _processProvider; + + public FreebsdVersionAdapter(IProcessProvider processProvider) + { + _processProvider = processProvider; + } + + public OsVersionModel Read() + { + var output = _processProvider.StartAndCapture("freebsd-version"); + + var version = output.Standard.First().Content; + + return new OsVersionModel("FreeBSD", version, $"FreeBSD {version}"); + } + + public bool Enabled => OsInfo.Os == Os.Bsd; + } +} diff --git a/src/NzbDrone.Mono/Radarr.Mono.csproj b/src/NzbDrone.Mono/Radarr.Mono.csproj index e33156643..b111ef023 100644 --- a/src/NzbDrone.Mono/Radarr.Mono.csproj +++ b/src/NzbDrone.Mono/Radarr.Mono.csproj @@ -10,7 +10,7 @@ See https://github.com/xamarin/XamarinComponents/issues/282 --> - + diff --git a/src/NzbDrone.Test.Common/TestBase.cs b/src/NzbDrone.Test.Common/TestBase.cs index 6c49e294f..fa25c039f 100644 --- a/src/NzbDrone.Test.Common/TestBase.cs +++ b/src/NzbDrone.Test.Common/TestBase.cs @@ -174,6 +174,14 @@ namespace NzbDrone.Test.Common } } + protected void NotBsd() + { + if (OsInfo.Os == Os.Bsd) + { + throw new IgnoreException("Ignored on BSD"); + } + } + protected void WithTempAsAppPath() { Mocker.GetMock() diff --git a/src/Runtimes/linux-arm/Radarr.Core.dll.config b/src/Runtimes/linux-arm/Radarr.Core.dll.config deleted file mode 100644 index f40a271ce..000000000 --- a/src/Runtimes/linux-arm/Radarr.Core.dll.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/Runtimes/linux-arm64/Radarr.Core.dll.config b/src/Runtimes/linux-arm64/Radarr.Core.dll.config deleted file mode 100644 index f40a271ce..000000000 --- a/src/Runtimes/linux-arm64/Radarr.Core.dll.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/Runtimes/linux-musl-arm64/libMonoPosixHelper.so b/src/Runtimes/linux-musl-arm64/libMonoPosixHelper.so deleted file mode 100644 index ce9d41b94..000000000 Binary files a/src/Runtimes/linux-musl-arm64/libMonoPosixHelper.so and /dev/null differ diff --git a/src/Runtimes/linux-musl-x64/libMonoPosixHelper.so b/src/Runtimes/linux-musl-x64/libMonoPosixHelper.so deleted file mode 100644 index edcf49366..000000000 Binary files a/src/Runtimes/linux-musl-x64/libMonoPosixHelper.so and /dev/null differ