diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index ba0489d1c..da6d74898 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -101,6 +101,10 @@ stages:
artifact: LinuxCoreTests
displayName: Publish Linux Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
+ - publish: '$(testsFolder)/netcoreapp3.1/linux-musl-x64/publish'
+ artifact: LinuxMuslCoreTests
+ displayName: Publish Linux Musl Test Package
+ condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/netcoreapp3.1/osx-x64/publish'
artifact: MacCoreTests
displayName: Publish MacOS Test Package
@@ -243,6 +247,14 @@ stages:
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/netcoreapp3.1
+ - task: ArchiveFiles@2
+ displayName: Create Linux Musl Core tar
+ inputs:
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-x64.tar.gz'
+ archiveType: 'tar'
+ tarCompression: 'gz'
+ includeRootFolder: false
+ rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create ARM32 Linux Core tar
inputs:
@@ -259,6 +271,14 @@ stages:
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/netcoreapp3.1
+ - task: ArchiveFiles@2
+ displayName: Create ARM64 Linux Musl Core tar
+ inputs:
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-arm64.tar.gz'
+ archiveType: 'tar'
+ tarCompression: 'gz'
+ includeRootFolder: false
+ rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/netcoreapp3.1
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages'
displayName: Publish Packages
@@ -384,16 +404,24 @@ stages:
matrix:
mono508:
testName: 'Mono 5.8'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-5.8
mono520:
testName: 'Mono 5.20'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-5.20
mono610:
testName: 'Mono 6.10'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-6.10
mono612:
testName: 'Mono 6.12'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-6.12
+ alpine:
+ testName: 'Musl Net Core'
+ artifactName: LinuxMuslCoreTests
+ containerImage: servarr/testimages:alpine
pool:
vmImage: 'ubuntu-18.04'
@@ -403,8 +431,6 @@ stages:
timeoutInMinutes: 10
steps:
- - bash: mono --version
- displayName: Check Mono version
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
@@ -414,10 +440,14 @@ stages:
displayName: Download Test Artifact
inputs:
buildType: 'current'
- artifactName: LinuxTests
+ artifactName: $(artifactName)
targetPath: $(testsFolder)
+ - bash: find ${TESTSFOLDER} -name "Radarr.Test.Dummy" -exec chmod a+x {} \;
+ displayName: Make Test Dummy Executable
+ condition: and(succeeded(), ne(variables['osName'], 'Windows'))
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
+ ls -lR ${TESTSFOLDER}
${TESTSFOLDER}/test.sh Linux Unit Test
displayName: Run Tests
- task: PublishTestResults@2
@@ -527,20 +557,29 @@ stages:
matrix:
mono508:
testName: 'Mono 5.8'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-5.8
+ pattern: 'Radarr.**.linux.tar.gz'
mono520:
testName: 'Mono 5.20'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-5.20
+ pattern: 'Radarr.**.linux.tar.gz'
mono610:
testName: 'Mono 6.10'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-6.10
+ pattern: 'Radarr.**.linux.tar.gz'
mono612:
testName: 'Mono 6.12'
+ artifactName: LinuxTests
containerImage: servarr/testimages:mono-6.12
-
- variables:
- pattern: 'Radarr.**.linux.tar.gz'
-
+ pattern: 'Radarr.**.linux.tar.gz'
+ alpine:
+ testName: 'Musl Net Core'
+ artifactName: LinuxCoreTests
+ containerImage: servarr/testimages:alpine
+ pattern: 'Radarr.**.linux-musl-core-x64.tar.gz'
pool:
vmImage: 'ubuntu-18.04'
@@ -549,8 +588,6 @@ stages:
timeoutInMinutes: 15
steps:
- - bash: mono --version
- displayName: Check Mono version
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
@@ -560,7 +597,7 @@ stages:
displayName: Download Test Artifact
inputs:
buildType: 'current'
- artifactName: LinuxTests
+ artifactName: $(artifactName)
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
diff --git a/build.sh b/build.sh
index 162dec096..24f7b2cab 100755
--- a/build.sh
+++ b/build.sh
@@ -319,6 +319,7 @@ then
then
PackageTests "netcoreapp3.1" "win-x64"
PackageTests "netcoreapp3.1" "linux-x64"
+ PackageTests "netcoreapp3.1" "linux-musl-x64"
PackageTests "netcoreapp3.1" "osx-x64"
PackageTests "net462" "linux-x64"
else
@@ -350,7 +351,9 @@ then
then
Package "netcoreapp3.1" "win-x64"
Package "netcoreapp3.1" "linux-x64"
+ Package "netcoreapp3.1" "linux-musl-x64"
Package "netcoreapp3.1" "linux-arm64"
+ Package "netcoreapp3.1" "linux-musl-arm64"
Package "netcoreapp3.1" "linux-arm"
Package "netcoreapp3.1" "osx-x64"
Package "net462" "linux-x64"
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index d54a6aaf5..c26b01298 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -6,8 +6,8 @@
AnyCPU
true
- win-x64;osx-x64;linux-x64;linux-arm;linux-arm64
- win-x64:net462;osx-x64:net462;linux-arm:net462;linux-arm64:net462
+ win-x64;osx-x64;linux-x64;linux-musl-x64;linux-arm;linux-arm64;linux-musl-arm64
+ win-x64:net462;osx-x64:net462;linux-arm:net462;linux-arm64:net462;linux-musl-x64:net462;linux-musl-arm64:net462
$(MSBuildThisFileDirectory)..\
diff --git a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs
index fddfdf00b..3658d5ede 100644
--- a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs
+++ b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.IO;
using System.Linq;
using NLog;
@@ -11,7 +12,7 @@ namespace NzbDrone.Common.EnvironmentInfo
public static Os Os { get; }
public static bool IsNotWindows => !IsWindows;
- public static bool IsLinux => Os == Os.Linux;
+ public static bool IsLinux => Os == Os.Linux || Os == Os.LinuxMusl || Os == Os.Bsd;
public static bool IsOsx => Os == Os.Osx;
public static bool IsWindows => Os == Os.Windows;
@@ -37,18 +38,7 @@ namespace NzbDrone.Common.EnvironmentInfo
case PlatformID.MacOSX:
case PlatformID.Unix:
{
- // Sometimes Mac OS reports itself as Unix
- if (Directory.Exists("/System/Library/CoreServices/") &&
- (File.Exists("/System/Library/CoreServices/SystemVersion.plist") ||
- File.Exists("/System/Library/CoreServices/ServerVersion.plist")))
- {
- Os = Os.Osx;
- }
- else
- {
- Os = Os.Linux;
- }
-
+ Os = GetPosixFlavour();
break;
}
}
@@ -92,6 +82,48 @@ namespace NzbDrone.Common.EnvironmentInfo
IsDocker = true;
}
}
+
+ private static Os GetPosixFlavour()
+ {
+ var output = RunAndCapture("uname", "-s");
+
+ if (output.StartsWith("Darwin"))
+ {
+ return Os.Osx;
+ }
+ else if (output.Contains("BSD"))
+ {
+ return Os.Bsd;
+ }
+ else
+ {
+ return IsMusl() ? Os.LinuxMusl : Os.Linux;
+ }
+ }
+
+ private static bool IsMusl()
+ {
+ var output = RunAndCapture("ldd", "/bin/ls");
+ return output.Contains("libc.musl");
+ }
+
+ private static string RunAndCapture(string filename, string args)
+ {
+ Process p = new Process();
+ p.StartInfo.FileName = filename;
+ p.StartInfo.Arguments = args;
+ p.StartInfo.UseShellExecute = false;
+ p.StartInfo.CreateNoWindow = true;
+ p.StartInfo.RedirectStandardOutput = true;
+
+ p.Start();
+
+ // To avoid deadlocks, always read the output stream first and then wait.
+ string output = p.StandardOutput.ReadToEnd();
+ p.WaitForExit(1000);
+
+ return output;
+ }
}
public interface IOsInfo
@@ -106,6 +138,8 @@ namespace NzbDrone.Common.EnvironmentInfo
{
Windows,
Linux,
- Osx
+ Osx,
+ LinuxMusl,
+ Bsd
}
}
diff --git a/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj b/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj
index 0c4b673d2..e559554e5 100644
--- a/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj
+++ b/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj
@@ -17,7 +17,7 @@
-->
-
+
@@ -28,5 +28,5 @@
PreserveNewest
-
+
diff --git a/src/NzbDrone.Mono/Radarr.Mono.csproj b/src/NzbDrone.Mono/Radarr.Mono.csproj
index 9161eab91..9316a0ede 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/Runtimes/linux-musl-x64/libMonoPosixHelper.so b/src/Runtimes/linux-musl-x64/libMonoPosixHelper.so
new file mode 100644
index 000000000..edcf49366
Binary files /dev/null and b/src/Runtimes/linux-musl-x64/libMonoPosixHelper.so differ