diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1f2a5c620..f981cb711 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -82,7 +82,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 Prowlarr Backend - bash: | find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \; @@ -107,6 +118,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 @@ -218,7 +233,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 "Prowlarr" -exec chmod a+x {} \; @@ -293,6 +308,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)/Prowlarr.$(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 @@ -346,24 +369,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: 'Prowlarr.**.linux-core-x64.tar.gz' + FreebsdCore: + osName: 'Linux' + testName: 'FreebsdCore' + poolName: 'FreeBSD' + imageName: pool: + name: $(poolName) vmImage: $(imageName) steps: @@ -372,6 +405,7 @@ stages: displayName: 'Install .net core' inputs: version: $(dotnetVersion) + condition: ne(variables['poolName'], 'FreeBSD') - task: DownloadPipelineArtifact@2 displayName: Download Test Artifact inputs: @@ -472,17 +506,17 @@ stages: osName: 'Mac' testName: 'MacCore' imageName: 'macos-10.14' - pattern: 'Prowlarr.**.osx-core-x64.tar.gz' + pattern: 'Prowlarr.*.osx-core-x64.tar.gz' WindowsCore: osName: 'Windows' testName: 'WindowsCore' imageName: 'windows-2019' - pattern: 'Prowlarr.**.windows-core-x64.zip' + pattern: 'Prowlarr.*.windows-core-x64.zip' LinuxCore: osName: 'Linux' testName: 'LinuxCore' imageName: 'ubuntu-18.04' - pattern: 'Prowlarr.**.linux-core-x64.tar.gz' + pattern: 'Prowlarr.*.linux-core-x64.tar.gz' pool: vmImage: $(imageName) @@ -527,6 +561,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: 'Prowlarr.*.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/Prowlarr/. ./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 @@ -537,7 +617,8 @@ stages: testName: 'Musl Net Core' artifactName: LinuxMuslCoreTests containerImage: ghcr.io/servarr/testimages:alpine - pattern: 'Prowlarr.**.linux-musl-core-x64.tar.gz' + pattern: 'Prowlarr.*.linux-musl-core-x64.tar.gz' + pool: vmImage: 'ubuntu-18.04' @@ -596,17 +677,17 @@ stages: Linux: osName: 'Linux' imageName: 'ubuntu-18.04' - pattern: 'Prowlarr.**.linux-core-x64.tar.gz' + pattern: 'Prowlarr.*.linux-core-x64.tar.gz' failBuild: false Mac: osName: 'Mac' imageName: 'macos-10.14' - pattern: 'Prowlarr.**.osx-core-x64.tar.gz' + pattern: 'Prowlarr.*.osx-core-x64.tar.gz' failBuild: false Windows: osName: 'Windows' imageName: 'windows-2019' - pattern: 'Prowlarr.**.windows-core-x64.zip' + pattern: 'Prowlarr.*.windows-core-x64.zip' failBuild: false pool: diff --git a/build.sh b/build.sh index ae9a644f9..056f9e30c 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' @@ -207,7 +219,7 @@ Package() IFS='-' read -ra SPLIT <<< "$runtime" case "${SPLIT[0]}" in - linux) + linux|freebsd*) PackageLinux "$framework" "$runtime" ;; win) @@ -252,6 +264,7 @@ if [ $# -eq 0 ]; then FRONTEND=YES PACKAGES=YES LINT=YES + ENABLE_BSD=NO fi while [[ $# -gt 0 ]] @@ -263,6 +276,10 @@ case $key in BACKEND=YES shift # past argument ;; + --enable-bsd) + ENABLE_BSD=YES + shift # past argument + ;; -r|--runtime) RID="$2" shift # past argument @@ -303,6 +320,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 @@ -311,6 +332,10 @@ then PackageTests "net5.0" "linux-x64" PackageTests "net5.0" "linux-musl-x64" PackageTests "net5.0" "osx-x64" + if [ "$ENABLE_BSD" = "YES" ]; + then + PackageTests "net5.0" "freebsd-x64" + fi else PackageTests "$FRAMEWORK" "$RID" fi @@ -346,6 +371,10 @@ then Package "net5.0" "linux-musl-arm64" Package "net5.0" "linux-arm" Package "net5.0" "osx-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 48bad0510..0900f71c8 100644 --- a/src/NuGet.config +++ b/src/NuGet.config @@ -1,8 +1,11 @@ + - + + + diff --git a/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs b/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs index 7f58693e6..441d79efe 100644 --- a/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs +++ b/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs @@ -26,7 +26,6 @@ namespace NzbDrone.Core.Test.UpdateTests [Test] [Ignore("TODO No Updates On Server")] - [Platform(Exclude = "NetCore")] public void finds_update_when_version_lower() { UseRealHttp(); diff --git a/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs b/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs index 19f008757..5ca5e831e 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; @@ -178,9 +179,13 @@ namespace NzbDrone.Mono.Test.DiskProviderTests Syscall.stat(tempFile, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0644"); - Subject.SetPermissions(tempFile, "1664"); - 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, "1664"); + 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/Prowlarr.Mono.Test.csproj b/src/NzbDrone.Mono.Test/Prowlarr.Mono.Test.csproj index 20085f3f9..50d749852 100644 --- a/src/NzbDrone.Mono.Test/Prowlarr.Mono.Test.csproj +++ b/src/NzbDrone.Mono.Test/Prowlarr.Mono.Test.csproj @@ -8,7 +8,7 @@ - + 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/Prowlarr.Mono.csproj b/src/NzbDrone.Mono/Prowlarr.Mono.csproj index b08c5fe6e..bb883bc5c 100644 --- a/src/NzbDrone.Mono/Prowlarr.Mono.csproj +++ b/src/NzbDrone.Mono/Prowlarr.Mono.csproj @@ -3,7 +3,7 @@ net5.0 - + 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-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