# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
variables :
outputFolder : './_output'
artifactsFolder : './_artifacts'
testsFolder : './_tests'
majorVersion : '3.0.0'
minorVersion : $[counter('minorVersion', 2000)]
radarrVersion : '$(majorVersion).$(minorVersion)'
buildName : '$(Build.SourceBranchName).$(radarrVersion)'
sentryOrg : 'radarr'
dotnetVersion : '3.1.x'
trigger :
branches :
include :
- develop
- aphrodite
pr :
- develop
- aphrodite
stages :
- stage : Build_Backend
displayName : Build Backend
jobs :
- job : Backend
strategy :
matrix :
Linux :
osName : 'Linux'
imageName : 'ubuntu-16.04'
Mac :
osName : 'Mac'
imageName : 'macos-10.13'
Windows :
osName : 'Windows'
imageName : 'windows-2019'
pool :
vmImage : $(imageName)
steps :
# Set the build name properly. The 'name' property won't recursively expand so hack here:
- powershell : Write-Host "##vso[build.updatebuildnumber]$($env:RADARRVERSION)"
displayName : Set Build Name
- checkout : self
submodules : true
fetchDepth : 1
- task : UseDotNet@2
displayName : 'Install .net core'
inputs :
version : $(dotnetVersion)
- bash : ./build.sh --backend
displayName : Build Radarr Backend
- bash : |
find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
find ${OUTPUTFOLDER} -depth -empty -type d -exec rm -r "{}" \;
find ${TESTSFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
find ${TESTSFOLDER} -depth -empty -type d -exec rm -r "{}" \;
ls -lR
displayName : Clean up intermediate output
- publish : $(outputFolder)
artifact : '$(osName)Backend'
displayName : Publish Backend
condition : and(succeeded(), eq(variables['osName'], 'Windows'))
- publish : '$(testsFolder)/netcoreapp3.1/win-x64/publish'
artifact : WindowsCoreTests
displayName : Publish Windows Test Package
condition : and(succeeded(), eq(variables['osName'], 'Windows'))
- publish : '$(testsFolder)/net462/linux-x64/publish'
artifact : LinuxTests
displayName : Publish Linux Mono Test Package
condition : and(succeeded(), eq(variables['osName'], 'Windows'))
- publish : '$(testsFolder)/netcoreapp3.1/linux-x64/publish'
artifact : LinuxCoreTests
displayName : Publish Linux Test Package
condition : and(succeeded(), eq(variables['osName'], 'Windows'))
- publish : '$(testsFolder)/netcoreapp3.1/osx-x64/publish'
artifact : MacCoreTests
displayName : Publish MacOS Test Package
condition : and(succeeded(), eq(variables['osName'], 'Windows'))
- stage : Build_Frontend
displayName : Frontend
dependsOn : [ ]
jobs :
- job : Build
strategy :
matrix :
Linux :
osName : 'Linux'
imageName : 'ubuntu-16.04'
Mac :
osName : 'Mac'
imageName : 'macos-10.13'
Windows :
osName : 'Windows'
imageName : 'windows-2019'
pool :
vmImage : $(imageName)
steps :
- task : NodeTool@0
displayName : Set Node.js version
inputs :
versionSpec : '10.x'
- checkout : self
submodules : true
fetchDepth : 1
- bash : ./build.sh --frontend
displayName : Build Radarr Frontend
env :
FORCE_COLOR : 0
- publish : $(outputFolder)
artifact : '$(osName)Frontend'
displayName : Publish Frontend
condition : and(succeeded(), eq(variables['osName'], 'Windows'))
- stage : Installer
dependsOn :
- Build_Backend
- Build_Frontend
jobs :
- job : Windows_Installer
displayName : Create Installer
pool :
vmImage : 'windows-2019'
steps :
- checkout : self
fetchDepth : 1
- task : DownloadPipelineArtifact@2
inputs :
buildType : 'current'
artifactName : WindowsBackend
targetPath : _output
displayName : Fetch Backend
- task : DownloadPipelineArtifact@2
inputs :
buildType : 'current'
artifactName : WindowsFrontend
targetPath : _output
displayName : Fetch Frontend
- bash : ./build.sh --packages
displayName : Create Packages
- bash : |
setup/inno/ISCC.exe setup/radarr.iss //DFramework=netcoreapp3.1
cp setup/output/Radarr.*windows.netcoreapp3.1.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x64-installer.exe
displayName : Create .NET Core Windows installer
- publish : $(Build.ArtifactStagingDirectory)
artifact : 'WindowsInstaller'
displayName : Publish Installer
- stage : Packages
dependsOn :
- Build_Backend
- Build_Frontend
jobs :
- job : Other_Packages
displayName : Create Standard Packages
pool :
vmImage : 'ubuntu-16.04'
steps :
- checkout : self
fetchDepth : 1
- task : DownloadPipelineArtifact@2
inputs :
buildType : 'current'
artifactName : WindowsBackend
targetPath : _output
displayName : Fetch Backend
- task : DownloadPipelineArtifact@2
inputs :
buildType : 'current'
artifactName : WindowsFrontend
targetPath : _output
displayName : Fetch Frontend
- bash : ./build.sh --packages
displayName : Create Packages
- bash : |
find . -name "Radarr" -exec chmod a+x {} \;
find . -name "Radarr.Update" -exec chmod a+x {} \;
displayName : Set executable bits
- task : ArchiveFiles@2
displayName : Create Windows Core zip
inputs :
archiveFile : '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
archiveType : 'zip'
includeRootFolder : false
rootFolderOrFile : $(artifactsFolder)/windows/netcoreapp3.1
- task : ArchiveFiles@2
displayName : Create MacOS Core app
inputs :
archiveFile : '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip'
archiveType : 'zip'
includeRootFolder : false
rootFolderOrFile : $(artifactsFolder)/macos-app/netcoreapp3.1
- task : ArchiveFiles@2
displayName : Create MacOS Core tar
inputs :
archiveFile : '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-core-x64.tar.gz'
archiveType : 'tar'
tarCompression : 'gz'
includeRootFolder : false
rootFolderOrFile : $(artifactsFolder)/macos/netcoreapp3.1
- task : ArchiveFiles@2
displayName : Create Linux Mono tar
inputs :
archiveFile : '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux.tar.gz'
archiveType : 'tar'
tarCompression : 'gz'
includeRootFolder : false
rootFolderOrFile : $(artifactsFolder)/linux-x64/net462
- task : ArchiveFiles@2
displayName : Create Linux Core tar
inputs :
archiveFile : '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-x64.tar.gz'
archiveType : 'tar'
tarCompression : 'gz'
includeRootFolder : false
rootFolderOrFile : $(artifactsFolder)/linux-x64/netcoreapp3.1
- task : ArchiveFiles@2
displayName : Create ARM32 Linux Core tar
inputs :
archiveFile : '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm.tar.gz'
archiveType : 'tar'
tarCompression : 'gz'
includeRootFolder : false
rootFolderOrFile : $(artifactsFolder)/linux-arm/netcoreapp3.1
- task : ArchiveFiles@2
displayName : Create ARM64 Linux Core tar
inputs :
archiveFile : '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm64.tar.gz'
archiveType : 'tar'
tarCompression : 'gz'
includeRootFolder : false
rootFolderOrFile : $(artifactsFolder)/linux-arm64/netcoreapp3.1
- publish : $(Build.ArtifactStagingDirectory)
artifact : 'Packages'
displayName : Publish Packages
- bash : |
echo "Uploading source maps to sentry"
curl -sL https://sentry.io/get-cli/ | bash
RELEASENAME="${RADARRVERSION}-${BUILD_SOURCEBRANCHNAME}"
sentry-cli releases new --finalize -p radarr -p radarr-ui -p radarr-update "${RELEASENAME}"
sentry-cli releases -p radarr-ui files "${RELEASENAME}" upload-sourcemaps _output/UI/ --rewrite
sentry-cli releases set-commits --auto "${RELEASENAME}"
sentry-cli releases deploys "${RELEASENAME}" new -e aphrodite
displayName : Publish Sentry Source Maps
condition : and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/aphrodite'))
env :
SENTRY_AUTH_TOKEN : $(sentryAuthToken)
SENTRY_ORG : $(sentryOrg)
- stage : Unit_Test
displayName : Unit Tests
dependsOn : Build_Backend
condition : succeeded()
jobs :
- job : Unit
displayName : Unit Native
strategy :
matrix :
MacCore :
osName : 'Mac'
testName : 'MacCore'
imageName : 'macos-10.13'
WindowsCore :
osName : 'Windows'
testName : 'WindowsCore'
imageName : 'windows-2019'
LinuxCore :
osName : 'Linux'
testName : 'LinuxCore'
imageName : 'ubuntu-16.04'
pattern : 'Radarr.**.linux-core-x64.tar.gz'
pool :
vmImage : $(imageName)
steps :
- checkout : none
- task : UseDotNet@2
displayName : 'Install .net core'
inputs :
version : $(dotnetVersion)
- task : DownloadPipelineArtifact@2
displayName : Download Test Artifact
inputs :
buildType : 'current'
artifactName : '$(testName)Tests'
targetPath : $(testsFolder)
- bash : |
wget https://mediaarea.net/repo/deb/repo-mediaarea_1.0-9_all.deb
sudo dpkg -i repo-mediaarea_1.0-9_all.deb
sudo apt-get update
sudo apt-get install -y libmediainfo-dev libmediainfo0v5 mediainfo
displayName : Install mediainfo
condition : and(succeeded(), eq(variables['osName'], 'Linux'))
- powershell : Set-Service SCardSvr -StartupType Manual
displayName : Enable Windows Test Service
condition : and(succeeded(), eq(variables['osName'], 'Windows'))
- bash : |
wget https://github.com/acoustid/chromaprint/releases/download/v1.4.3/chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz
sudo tar xf chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz --strip-components=1 --directory /usr/bin
displayName : Install fpcalc
condition : and(succeeded(), eq(variables['osName'], 'Linux'))
- bash : |
SYMLINK=5_18_1
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
echo "##vso[task.setvariable variable=MONOPREFIX;]$MONOPREFIX"
echo "##vso[task.setvariable variable=PKG_CONFIG_PATH;]$MONOPREFIX/lib/pkgconfig:$MONOPREFIX/share/pkgconfig:$PKG_CONFIG_PATH"
echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH"
displayName : Set Mono Version
condition : and(succeeded(), eq(variables['osName'], 'Mac'))
- bash : find ${TESTSFOLDER} -name "Radarr.Test.Dummy" -exec chmod a+x {} \;
displayName : Make Test Dummy Executable
- task : Bash@3
displayName : Run Tests
env :
TEST_DIR : $(Build.SourcesDirectory)/_tests
inputs :
targetType : 'filePath'
filePath : '$(testsFolder)/test.sh'
arguments : '$(osName) Unit Test'
- task : PublishTestResults@2
displayName : Publish Test Results
inputs :
testResultsFormat : 'NUnit'
testResultsFiles : '**/TestResult.xml'
testRunTitle : '$(testName) Unit Tests'
failTaskOnFailedTests : true
- job : Unit_Docker
displayName : Unit Docker
strategy :
matrix :
mono510 :
testName : 'Mono 5.10'
containerImage : radarr/testimages:mono-5.10
mono512 :
testName : 'Mono 5.12'
containerImage : radarr/testimages:mono-5.12
mono514 :
testName : 'Mono 5.14'
containerImage : radarr/testimages:mono-5.14
mono516 :
testName : 'Mono 5.16'
containerImage : radarr/testimages:mono-5.16
mono518 :
testName : 'Mono 5.18'
containerImage : radarr/testimages:mono-5.18
mono520 :
testName : 'Mono 5.20'
containerImage : radarr/testimages:mono-5.20
mono600 :
testName : 'Mono 6.0'
containerImage : radarr/testimages:mono-6.0
mono604 :
testName : 'Mono 6.4'
containerImage : radarr/testimages:mono-6.4
mono606 :
testName : 'Mono 6.6'
containerImage : radarr/testimages:mono-6.6
pool :
vmImage : 'ubuntu-16.04'
container : $[ variables['containerImage'] ]
timeoutInMinutes : 10
steps :
- bash : mono --version
displayName : Check Mono version
- task : UseDotNet@2
displayName : 'Install .net core'
inputs :
version : $(dotnetVersion)
- checkout : none
- task : DownloadPipelineArtifact@2
displayName : Download Test Artifact
inputs :
buildType : 'current'
artifactName : LinuxTests
targetPath : $(testsFolder)
- task : Bash@3
displayName : Run Tests
inputs :
targetType : 'filePath'
filePath : '$(testsFolder)/test.sh'
arguments : 'Linux Unit Test'
- task : PublishTestResults@2
displayName : Publish Test Results
inputs :
testResultsFormat : 'NUnit'
testResultsFiles : '**/TestResult.xml'
testRunTitle : '$(testName) Unit Tests'
failTaskOnFailedTests : true
- stage : Integration
displayName : Integration
dependsOn : Packages
jobs :
- job : Integration_Native
displayName : Integration Native
strategy :
matrix :
MacCore :
osName : 'Mac'
testName : 'MacCore'
imageName : 'macos-10.13'
pattern : 'Radarr.**.osx-core-x64.tar.gz'
WindowsCore :
osName : 'Windows'
testName : 'WindowsCore'
imageName : 'windows-2019'
pattern : 'Radarr.**.windows-core-x64.zip'
LinuxCore :
osName : 'Linux'
testName : 'LinuxCore'
imageName : 'ubuntu-16.04'
pattern : 'Radarr.**.linux-core-x64.tar.gz'
pool :
vmImage : $(imageName)
steps :
- bash : |
SYMLINK=5_18_1
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
echo "##vso[task.setvariable variable=MONOPREFIX;]$MONOPREFIX"
echo "##vso[task.setvariable variable=PKG_CONFIG_PATH;]$MONOPREFIX/lib/pkgconfig:$MONOPREFIX/share/pkgconfig:$PKG_CONFIG_PATH"
echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH"
displayName : Set Mono Version
condition : and(succeeded(), eq(variables['osName'], 'Mac'))
- task : UseDotNet@2
displayName : 'Install .net core'
inputs :
version : $(dotnetVersion)
- checkout : none
- task : DownloadPipelineArtifact@2
displayName : Download Test Artifact
inputs :
buildType : 'current'
artifactName : '$(testName)Tests'
targetPath : $(testsFolder)
- task : DownloadPipelineArtifact@2
displayName : Download Build Artifact
inputs :
buildType : 'current'
artifactName : Packages
itemPattern : '**/$(pattern)'
targetPath : $(Build.ArtifactStagingDirectory)
- task : ExtractFiles@1
inputs :
archiveFilePatterns : '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder : '$(Build.ArtifactStagingDirectory)/bin'
displayName : Extract Package
- bash : |
mkdir -p ./bin/
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Radarr/. ./bin/
displayName : Move Package Contents
- task : Bash@3
displayName : Run Integration Tests
inputs :
targetType : 'filePath'
filePath : '$(testsFolder)/test.sh'
arguments : $(osName) Integration Test
- task : PublishTestResults@2
inputs :
testResultsFormat : 'NUnit'
testResultsFiles : '**/TestResult.xml'
testRunTitle : '$(testName) Integration Tests'
failTaskOnFailedTests : true
displayName : Publish Test Results
- job : Integration_Docker
displayName : Integration Docker
strategy :
matrix :
mono510 :
testName : 'Mono 5.10'
containerImage : radarr/testimages:mono-5.10
mono512 :
testName : 'Mono 5.12'
containerImage : radarr/testimages:mono-5.12
mono514 :
testName : 'Mono 5.14'
containerImage : radarr/testimages:mono-5.14
mono516 :
testName : 'Mono 5.16'
containerImage : radarr/testimages:mono-5.16
mono518 :
testName : 'Mono 5.18'
containerImage : radarr/testimages:mono-5.18
mono520 :
testName : 'Mono 5.20'
containerImage : radarr/testimages:mono-5.20
mono600 :
testName : 'Mono 6.0'
containerImage : radarr/testimages:mono-6.0
mono604 :
testName : 'Mono 6.4'
containerImage : radarr/testimages:mono-6.4
mono606 :
testName : 'Mono 6.6'
containerImage : radarr/testimages:mono-6.6
variables :
pattern : 'Radarr.**.linux.tar.gz'
pool :
vmImage : 'ubuntu-16.04'
container : $[ variables['containerImage'] ]
timeoutInMinutes : 15
steps :
- bash : mono --version
displayName : Check Mono version
- task : UseDotNet@2
displayName : 'Install .net core'
inputs :
version : $(dotnetVersion)
- checkout : none
- task : DownloadPipelineArtifact@2
displayName : Download Test Artifact
inputs :
buildType : 'current'
artifactName : LinuxTests
targetPath : $(testsFolder)
- task : DownloadPipelineArtifact@2
displayName : Download Build Artifact
inputs :
buildType : 'current'
artifactName : Packages
itemPattern : '**/$(pattern)'
targetPath : $(Build.ArtifactStagingDirectory)
- task : ExtractFiles@1
inputs :
archiveFilePatterns : '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder : '$(Build.ArtifactStagingDirectory)/bin'
displayName : Extract Package
- bash : |
mkdir -p ./bin/
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Radarr/. ./bin/
ls -lR
displayName : Move Package Contents
- task : Bash@3
displayName : Run Integration Tests
inputs :
targetType : 'filePath'
filePath : '$(testsFolder)/test.sh'
arguments : Linux Integration Test
- task : PublishTestResults@2
inputs :
testResultsFormat : 'NUnit'
testResultsFiles : '**/TestResult.xml'
testRunTitle : '$(testName) Integration Tests'
failTaskOnFailedTests : true
displayName : Publish Test Results
- stage : Automation
displayName : Automation
dependsOn : Packages
jobs :
- job : Automation
strategy :
matrix :
Linux :
osName : 'Linux'
imageName : 'ubuntu-16.04'
pattern : 'Radarr.**.linux-core-x64.tar.gz'
failBuild : true
Mac :
osName : 'Mac'
imageName : 'macos-10.13' # Fails due to firefox not being installed on image
pattern : 'Radarr.**.osx-core-x64.tar.gz'
failBuild : false
Windows :
osName : 'Windows'
imageName : 'windows-2019'
pattern : 'Radarr.**.windows-core-x64.zip'
failBuild : true
pool :
vmImage : $(imageName)
steps :
- task : UseDotNet@2
displayName : 'Install .net core'
inputs :
version : $(dotnetVersion)
- checkout : none
- task : DownloadPipelineArtifact@2
displayName : Download Test Artifact
inputs :
buildType : 'current'
artifactName : '$(osName)CoreTests'
targetPath : $(testsFolder)
- task : DownloadPipelineArtifact@2
displayName : Download Build Artifact
inputs :
buildType : 'current'
artifactName : Packages
itemPattern : '**/$(pattern)'
targetPath : $(Build.ArtifactStagingDirectory)
- task : ExtractFiles@1
inputs :
archiveFilePatterns : '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder : '$(Build.ArtifactStagingDirectory)/bin'
displayName : Extract Package
- bash : |
mkdir -p ./bin/
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Radarr/. ./bin/
displayName : Move Package Contents
- bash : |
if [[ $OSNAME == "Mac" ]]; then
url=https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-macos.tar.gz
elif [[ $OSNAME == "Linux" ]]; then
url=https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-linux64.tar.gz
else
echo "Unhandled OS"
exit 1
fi
curl -s -L "$url" | tar -xz
chmod +x geckodriver
mv geckodriver _tests
displayName : Install Gecko Driver
condition : and(succeeded(), ne(variables['osName'], 'Windows'))
- bash : ls -lR
- task : Bash@3
displayName : Run Automation Tests
inputs :
targetType : 'filePath'
filePath : '$(testsFolder)/test.sh'
arguments : $(osName) Automation Test
- task : PublishTestResults@2
inputs :
testResultsFormat : 'NUnit'
testResultsFiles : '**/TestResult.xml'
testRunTitle : '$(osName) Automation Tests'
failTaskOnFailedTests : $(failBuild)
displayName : Publish Test Results
- stage : Analyze
dependsOn : [ ]
displayName : Analyze
jobs :
- job : Lint_Frontend
displayName : Lint Frontend
strategy :
matrix :
Linux :
osName : 'Linux'
imageName : 'ubuntu-16.04'
Windows :
osName : 'Windows'
imageName : 'windows-2019'
pool :
vmImage : $(imageName)
steps :
- task : NodeTool@0
displayName : Set Node.js version
inputs :
versionSpec : '10.x'
- checkout : self
submodules : true
fetchDepth : 1
- bash : ./build.sh --lint
displayName : Lint Radarr Frontend
env :
FORCE_COLOR : 0
# - job: Analyze_Frontend
# displayName: Frontend
# condition: eq(variables['system.pullrequest.isfork'], false)
# pool:
# vmImage: windows-2019
# steps:
# - checkout: self # Need history for Sonar analysis
# - task: SonarCloudPrepare@1
# env:
# SONAR_SCANNER_OPTS: ''
# inputs:
# SonarCloud: 'SonarCloud'
# organization: 'radarr'
# scannerMode: 'CLI'
# configMode: 'manual'
# cliProjectKey: 'radarr_Radarr.UI'
# cliProjectName: 'RadarrUI'
# cliProjectVersion: '$(radarrVersion)'
# cliSources: './frontend'
# - task: SonarCloudAnalyze@1
# - job: Analyze_Backend
# displayName: Backend
# condition: eq(variables['system.pullrequest.isfork'], false)
# pool:
# vmImage: windows-2019
# steps:
# - checkout: self # Need history for Sonar analysis
# submodules: true
# - task: UseDotNet@2
# displayName: 'Install .net core'
# inputs:
# version: $(dotnetVersion)
# - task: SonarCloudPrepare@1
# inputs:
# SonarCloud: 'SonarCloud'
# organization: 'radarr'
# scannerMode: 'MSBuild'
# projectKey: 'radarr_Radarr'
# projectName: 'Radarr'
# projectVersion: '$(radarrVersion)'
# extraProperties: |
# sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/**
# sonar.coverage.exclusions=**/Radarr.Api.V1/**/*,**/MonoTorrent/**/*,**/Marr.Data/**/*
# sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/_tests/CoverageResults/coverage.opencover.xml
# sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
# - task: DotNetCoreCLI@2
# displayName: Build backend
# inputs:
# command: 'build'
# projects: 'src/Radarr.Windows.sln'
# - task: Bash@3
# displayName: Coverage Unit Tests
# inputs:
# targetType: 'filePath'
# filePath: ./test.sh
# arguments: Windows Unit Coverage
# - task: PublishCodeCoverageResults@1
# displayName: Publish Coverage Results
# inputs:
# codeCoverageTool: 'cobertura'
# summaryFileLocation: './_tests/CoverageResults/coverage.cobertura.xml'
# - task: SonarCloudAnalyze@1