New: Set up CI with Azure Pipelines (#897)

* Set up CI with Azure Pipelines

[skip ci]

* Remove Travis, Build Multiple Environments

* Change Task Type to Bash

* Checkout submodules

* Remove Appveyor Tests, Add Azure Tests

* Oops Forget Steps

* bad name

* test script fixes

* add tests to build job

* fixup tests

* name test runs

* fpcalc and artifacts

* Try to fix installer

* Publish separately

* Try publish

* Another go at artifacts

* Tidy up

* Add sentry, assembly info patching and bump version

* Only patch one AssemblyInfo; set node version 10

* Try pipeline artifacts again

* Tidy up - pipeline artifact seems to be way forward

* Fix installer publish

* first go at test job seperation

* job names and depends/consitions for tests

* pusblish single file test artifact

* pipeline artifact for test

* blitz the pattern filter

* windows test jobs

* mac tests, checkout on test jobs

* try to download build artifact to test job

* download and extract artifact

* Set LD_LIBRARY_PATH and print some sqlite debug info on mac tests

* fixup! tests

* integration test fixes

* fixup! integration test fixes

* fixup! integration test fixes

* more fixup

* use bash cp

* test fixups

* mkdir before copy

* linux works! add osx integration tests

* im tooo tired

* coverage attempt

* coverage seperate stage

* windows paths for integration test

* switch coverage to windows where opencover actually works

* fix test script

* one last go

* Simplify installer, try to fix name

* Try to parallelize backend and frontend build

* Try adding a matrix

* Try matrix jobs not stages

* Try to fix package step

* Remove opencover install

* Try to fix tests

* coverage fixes

* revert build.sh changes

* triggers so we don't double build

* Publish coverage package so we can debug

* try coverage no build, output artifact

* use the full pipeline workspace from build job

* fix automation tests for new ui

* Assorted fix attempts

* Another go

* MacOS debug

* Tidy up, try to fix mac

* Fix mac fpcalc, add mac integration tests

* Add cross platform automation tests

* Fix packages

* Try to fix Automation tests

* Don't wait on the installer to create standard packages

* Fixes

* delete logentries reference

* run automation tests in headless mode

* try install firefox mac

* Revert "try install firefox mac"

This reverts commit 4684bb1901.

* test sonarcloud prepare outputs

* basic analyze and upload

* don't limit fetch depth on analyze

* manual scanner do front and backend?

* full analyize with tests, coverage

* should depend on tests, coverage

* no need for condition on coverage

* Fix up build numbering

* Try to fix sonar

* Separate coverage calculation and publication

* Try to fix coverage upload
pull/914/head
Qstick 5 years ago committed by GitHub
parent 72947029f4
commit 6932046c5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

3
.gitattributes vendored

@ -1,6 +1,9 @@
# Auto detect text files and perform LF normalization
*text eol=lf
# Explicitly set bash scripts to have unix endings
*.sh text eol=lf
# Custom for Visual Studio
*.cs diff=csharp
*.sln merge=union

2
.gitignore vendored

@ -122,6 +122,8 @@ _rawPackage/
_dotTrace*
_tests/
*.Result.xml
coverage*.xml
coverage*.json
setup/Output/
*.~is

@ -1,35 +0,0 @@
language: csharp
os:
- linux
- osx
addons:
apt:
packages:
- dos2unix
- libchromaprint-tools
update: true
homebrew:
packages:
- yarn
- dos2unix
update: true
solution: src/Lidarr.sln
before_install:
- nvm install 10
- nvm use 10
- curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0
- export PATH=$HOME/.yarn/bin:$PATH
cache:
yarn: true
directories:
- node_modules
script:
- ./build.sh
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./test.sh Mac Unit; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./test.sh Linux Unit; fi

@ -1,7 +1,6 @@
# Lidarr
[![Build status](https://ci.appveyor.com/api/projects/status/tpm5mj5milne88nc?svg=true)](https://ci.appveyor.com/project/lidarr/lidarr)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/4e6d014aee9542189b4abb0b1439980f)](https://www.codacy.com/app/Lidarr/Lidarr?utm_source=github.com&utm_medium=referral&utm_content=lidarr/Lidarr&utm_campaign=Badge_Grade)
[![Build Status](https://dev.azure.com/Lidarr/Lidarr/_apis/build/status/lidarr.Lidarr?branchName=develop)](https://dev.azure.com/Lidarr/Lidarr/_build/latest?definitionId=1&branchName=develop)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/lidarr.svg)](https://github.com/lidarr/Lidarr/wiki/Docker)
![Github Downloads](https://img.shields.io/github/downloads/lidarr/lidarr/total.svg)
[![Backers on Open Collective](https://opencollective.com/lidarr/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/lidarr/sponsors/badge.svg)](#sponsors)

@ -1,43 +0,0 @@
#! /bin/bash
artifactsFolder="./_artifacts";
artifactsFolderWindows=$artifactsFolder/windows
artifactsFolderLinux=$artifactsFolder/linux
artifactsFolderMacOS=$artifactsFolder/macos
artifactsFolderMacOSApp=$artifactsFolder/macos-app
PublishArtifacts()
{
7z a $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.windows.zip $artifactsFolderWindows/*
7z a $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.osx-app.zip $artifactsFolderMacOSApp/*
7z a -ttar $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.osx.tar $artifactsFolderMacOS/*
7z a -tgzip $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.osx.tar.gz $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.osx.tar
rm -f $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.osx.tar
7z a -ttar $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.linux.tar $artifactsFolderLinux/*
7z a -tgzip $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.linux.tar.gz $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.linux.tar
rm -f $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.linux.tar
if [ "${CI_WINDOWS}" = "True" ]; then
./setup/inno/ISCC.exe "./setup/lidarr.iss"
cp ./setup/output/Lidarr.*windows.exe $artifactsFolder/Lidarr.${APPVEYOR_REPO_BRANCH}.${APPVEYOR_BUILD_VERSION}.windows-installer.exe
fi
}
PublishSourceMaps()
{
# Only create release on develop
# Secure SENTRY_AUTH_TOKEN will only be decoded on branch builds, not PRs
if [ "${CI_WINDOWS}" = "True" ] && [ "${APPVEYOR_REPO_BRANCH}" = "develop" ] && [ ! -z "${SENTRY_AUTH_TOKEN}" ]; then
echo "Uploading source maps to sentry"
yarn sentry-cli releases new --finalize -p lidarr -p lidarr-ui -p lidarr-update "${APPVEYOR_BUILD_VERSION}-debug"
yarn sentry-cli releases -p lidarr-ui files "${APPVEYOR_BUILD_VERSION}-debug" upload-sourcemaps _output/UI/ --rewrite
yarn sentry-cli releases set-commits --auto "${APPVEYOR_BUILD_VERSION}-debug"
yarn sentry-cli releases deploys "${APPVEYOR_BUILD_VERSION}-debug" new -e nightly
fi
}
PublishArtifacts
PublishSourceMaps

@ -1,72 +1,3 @@
version: '0.6.2.{build}'
image:
- Visual Studio 2017
- Ubuntu1804
assembly_info:
patch: true
file: 'src\NzbDrone.Common\Properties\SharedAssemblyInfo.cs'
assembly_version: '{version}'
assembly_file_version: '{version}'
assembly_informational_version: '{version}-rc1'
environment:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
nodejs_version: "10"
SENTRY_AUTH_TOKEN:
secure: dIzaGkyqP8JefC+GyXH2RtBHCufpzegoJnxvwGenCsMZNgaVbnoNo4ZMnPY2WYpstCcdXmZb7hbPYmu4FRkKQ8xDQ34YNGlKRKnlFuOQoq8=
SENTRY_ORG: "lidarr"
install:
- git submodule update --init --recursive
- cmd: powershell Install-Product node $env:nodejs_version
- cmd: powershell Set-Service SCardSvr -StartupType Manual
- sh: nvm install $nodejs_version
- sh: sudo apt update
- sh: sudo apt install -y libchromaprint-tools
build_script:
- cmd: C:\msys64\usr\bin\bash -lc "cd \"$APPVEYOR_BUILD_FOLDER\" && exec ./build.sh
- sh: ./build.sh
after_build:
- cmd: C:\msys64\usr\bin\bash -lc "cd \"$APPVEYOR_BUILD_FOLDER\" && exec ./appveyor-package.sh
- sh: ./appveyor-package.sh
- ps: Get-ChildItem .\_artifacts\*.zip | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
- ps: Get-ChildItem .\_artifacts\*.exe | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
- ps: Get-ChildItem .\_artifacts\*.tar.gz | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
test_script:
- node --version
- yarn --version
- cmd: C:\msys64\usr\bin\bash -lc "cd \"$APPVEYOR_BUILD_FOLDER\" && exec ./test.sh Windows Unit
- sh: ./test.sh Linux Unit
- sh: find "$APPVEYOR_BUILD_FOLDER" -type f -name 'myresults.xml' -print0 | xargs -0 -I '{}' curl -F 'file=@{}' "https://ci.appveyor.com/api/testresults/nunit3/$APPVEYOR_JOB_ID"
cache:
- node_modules -> package.json
pull_requests:
do_not_increment_build_number: true
skip_branch_with_pr: true
on_failure:
- ps: Get-ChildItem .\_artifacts\*.zip | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
- ps: Get-ChildItem .\_artifacts\*.exe | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
- ps: Get-ChildItem .\_artifacts\*.tar.gz | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
only_commits:
skip_commits:
files:
- src/
- osx/
- gulp/
- logo/
- setup/
- frontend/
- appveyor.yml
- build.sh
- test.sh
- package.json
- appveyor-package.sh
- '**/**'

@ -0,0 +1,506 @@
# 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: '0.6.2'
minorVersion: $[counter('minorVersion', 1076)]
lidarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(lidarrVersion)'
windowsInstaller: 'Lidarr.$(buildName).windows-installer.exe'
windowsZip: 'Lidarr.$(buildName).windows.zip'
macOsApp: 'Lidarr.$(buildName).osx-app.zip'
macOsTar: 'Lidarr.$(buildName).osx.tar.gz'
linuxTar: 'Lidarr.$(buildName).linux.tar.gz'
sentryOrg: 'lidarr'
trigger:
branches:
include:
- develop
pr:
- develop
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: 'vs2017-win2016'
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:LIDARRVERSION)"
displayName: Set Build Name
- checkout: self
submodules: true
fetchDepth: 1
- task: Assembly-Info-NetFramework@2
displayName: Patch AssemblyInfo
inputs:
Path: '$(Build.SourcesDirectory)'
FileNames: 'src/NzbDrone.Common/Properties/SharedAssemblyInfo.cs'
InsertAttributes: false
FileEncoding: 'auto'
WriteBOM: false
VersionNumber: '$(lidarrVersion)'
FileVersionNumber: '$(lidarrVersion)'
InformationalVersion: '$(lidarrVersion)-rc1'
- bash: ./build.sh --only-backend
displayName: Build Lidarr Backend
- publish: $(outputFolder)
artifact: '$(osName)Backend'
displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: $(Build.SourcesDirectory)
artifact: 'CoverageBuild'
displayName: Publish Coverage Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: $(testsFolder)
artifact: '$(osName)Tests'
displayName: Publish Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Build_Frontend
displayName: Build Frontend
dependsOn: []
jobs:
- job: Frontend
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
Mac:
osName: 'Mac'
imageName: 'macos-10.13'
Windows:
osName: 'Windows'
imageName: 'vs2017-win2016'
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 --only-frontend
displayName: Build Lidarr Frontend
env:
FORCE_COLOR: 0
- publish: $(outputFolder)
artifact: '$(osName)Frontend'
displayName: Publish Frontend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Package
dependsOn:
- Build_Backend
- Build_Frontend
jobs:
- job: Windows_Installer
displayName: Create Installer
pool:
vmImage: 'vs2017-win2016'
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 --only-packages
displayName: Create Packages
- bash: |
./setup/inno/ISCC.exe "./setup/lidarr.iss"
cp ./setup/output/Lidarr.*windows.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/${WINDOWSINSTALLER}
displayName: Create Windows installer
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'WindowsInstaller'
displayName: Publish Installer
- job: Other_Packages
displayName: Create Standard Packages
pool:
vmImage: 'ubuntu-16.04'
steps:
- bash: sudo apt install dos2unix
- 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 --only-packages
displayName: Create Packages
- bash: |
chmod a+x $(artifactsFolder)/macos/Lidarr/fpcalc
chmod a+x $(artifactsFolder)/macos-app/Lidarr.app/Contents/MacOS/fpcalc
displayName: Make fpcalc Executable
- task: ArchiveFiles@2
displayName: Create Windows zip
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/$(windowsZip)'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/windows
- task: ArchiveFiles@2
displayName: Create MacOS app
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/$(macOsApp)'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos-app
- task: ArchiveFiles@2
displayName: Create MacOS tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/$(macOsTar)'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos
- task: ArchiveFiles@2
displayName: Create Linux tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/$(linuxTar)'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages'
displayName: Publish Packages
- bash: |
echo "Uploading source maps to sentry"
yarn sentry-cli releases new --finalize -p lidarr -p lidarr-ui -p lidarr-update "${LIDARRVERSION}-debug"
yarn sentry-cli releases -p lidarr-ui files "${LIDARRVERSION}-debug" upload-sourcemaps _output/UI/ --rewrite
yarn sentry-cli releases set-commits --auto "${LIDARRVERSION}-debug"
yarn sentry-cli releases deploys "${LIDARRVERSION}-debug" new -e nightly
displayName: Publish Sentry Source Maps
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
env:
SENTRY_AUTH_TOKEN: $(sentryAuthToken)
- stage: Unit_Test
displayName: Unit Tests
dependsOn: Build_Backend
condition: succeeded()
jobs:
- job: Unit
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
Mac:
osName: 'Mac'
imageName: 'macos-10.13'
Windows:
osName: 'Windows'
imageName: 'vs2017-win2016'
pool:
vmImage: $(imageName)
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: WindowsTests
targetPath: $(testsFolder)
- 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'))
- powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- bash: |
chmod a+x _tests/fpcalc
export DYLD_FALLBACK_LIBRARY_PATH=${BUILD_SOURCESDIRECTORY}/_tests
displayName: Make fpcalc Executable
condition: and(succeeded(), eq(variables['osName'], 'Mac'))
- task: Bash@3
displayName: Run Tests
env:
DYLD_FALLBACK_LIBRARY_PATH: $(Build.SourcesDirectory)/_tests
TEST_DIR: $(Build.SourcesDirectory)/_tests
inputs:
targetType: 'filePath'
filePath: '$(testsFolder)/test.sh'
arguments: '$(osName) Unit Test'
- publish: TestResult.xml
artifact: 'TestResult'
displayName: Publish Test Result
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- task: PublishTestResults@2
displayName: Publish Test Results
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(osName) Unit Tests'
- stage: Integration_Automation
displayName: Integration / Automation
dependsOn: Package
jobs:
- job: Integration
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
pattern: 'Lidarr.**.linux.tar.gz'
# Mac:
# osName: 'Mac'
# imageName: 'macos-10.13'
# pattern: 'Lidarr.**.osx.tar.gz'
Windows:
osName: 'Windows'
imageName: 'vs2017-win2016'
pattern: 'Lidarr.**.windows.zip'
pool:
vmImage: $(imageName)
steps:
- script: |
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'))
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: WindowsTests
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/Lidarr/. ./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: '$(osName) Integration Tests'
displayName: Publish Test Results
- job: Automation
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
pattern: 'Lidarr.**.linux.tar.gz'
Mac:
osName: 'Mac'
imageName: 'macos-10.13'
pattern: 'Lidarr.**.osx.tar.gz'
Windows:
osName: 'Windows'
imageName: 'vs2017-win2016'
pattern: 'Lidarr.**.windows.zip'
pool:
vmImage: $(imageName)
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: WindowsTests
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/Lidarr/. ./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'
displayName: Publish Test Results
- stage: Coverage
dependsOn: Build_Backend
condition: succeeded()
jobs:
- job: Windows_Coverage
displayName: Windows
pool:
vmImage: 'vs2017-win2016'
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: CoverageBuild
targetPath: $(Build.SourcesDirectory)
- task: Bash@3
displayName: Coverage Unit Tests
inputs:
targetType: 'filePath'
filePath: ./test.sh
arguments: Windows Unit Coverage
- publish: ./_tests/CoverageResults
artifact: 'CoverageResults'
displayName: Publish Coverage Result Artifact
- stage: Coverage_Upload
dependsOn: Coverage
condition: succeeded()
displayName: Coverage Upload
jobs:
- job: Upload
pool:
vmImage: 'vs2017-win2016'
steps:
- checkout: self
fetchDepth: 1
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: CoverageResults
targetPath: 'CoverageResults'
- task: PublishCodeCoverageResults@1
displayName: Publish Coverage Results
inputs:
codeCoverageTool: 'cobertura'
summaryFileLocation: './CoverageResults/coverage.cobertura.xml'
- stage: Analyze
dependsOn:
- Coverage
- Unit_Test
displayName: Analyze
jobs:
- job: Analyze
pool:
vmImage: vs2017-win2016
steps:
- checkout: self
submodules: true
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: CoverageResults
targetPath: $(Build.SourcesDirectory)/CoverageResults
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: TestResult
targetPath: $(Build.SourcesDirectory)/TestResults
- task: SonarCloudPrepare@1
env:
SONAR_SCANNER_OPTS: ''
inputs:
SonarCloud: 'SonarCloud'
organization: 'lidarr'
scannerMode: 'CLI'
configMode: 'manual'
cliProjectKey: 'lidarr_Lidarr'
cliProjectName: 'Lidarr'
cliSources: '.'
extraProperties: |
sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResults/**/TestResult.xml
- task: SonarCloudAnalyze@1

@ -145,26 +145,6 @@ RunGulp()
ProgressEnd 'Running gulp'
}
CreateMdbs()
{
local path=$1
if [ $runtime = "dotnet" ] ; then
local pdbFiles=( $(find $path -name "*.pdb") )
for filename in "${pdbFiles[@]}"
do
if [ -e ${filename%.pdb}.dll ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.dll
fi
if [ -e ${filename%.pdb}.exe ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.exe
fi
done
echo "Removing PDBs"
find $path -name "*.pdb" -exec rm "{}" \;
fi
}
PackageMono()
{
ProgressStart 'Creating Mono Package'
@ -174,9 +154,6 @@ PackageMono()
echo "Copying Binaries"
cp -r $outputFolder $outputFolderLinux
echo "Creating MDBs"
CreateMdbs $outputFolderLinux
echo "Removing Service helpers"
rm -f $outputFolderLinux/ServiceUninstall.*
rm -f $outputFolderLinux/ServiceInstall.*
@ -268,10 +245,7 @@ PackageTests()
cp $outputFolder/*.dll $testPackageFolder
cp $outputFolder/*.exe $testPackageFolder
cp $outputFolder/fpcalc $testPackageFolder
cp ./*.sh $testPackageFolder
echo "Creating MDBs for tests"
CreateMdbs $testPackageFolder
cp ./test.sh $testPackageFolder
rm -f $testPackageFolder/*.log.config
@ -283,8 +257,8 @@ PackageTests()
echo "Copying CurlSharp libraries"
cp $sourceFolder/ExternalModules/CurlSharp/libs/i386/* $testPackageFolder
echo "Copying dylibs"
cp -r $outputFolderMacOS/*.dylib $testPackageFolder
echo "Adding sqlite dylibs"
cp $sourceFolder/Libraries/Sqlite/*.dylib $testPackageFolder
ProgressEnd 'Creating Test Package'
}
@ -338,11 +312,51 @@ case "$(uname -s)" in
;;
esac
Build
RunGulp
PackageMono
PackageMacOS
PackageMacOSApp
PackageTests
CleanupWindowsPackage
PackageArtifacts
POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--only-backend)
ONLY_BACKEND=YES
shift # past argument
;;
--only-frontend)
ONLY_FRONTEND=YES
shift # past argument
;;
--only-packages)
ONLY_PACKAGES=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
# Only build backend if we haven't set only-frontend or only-packages
if [ -z "$ONLY_FRONTEND" ] && [ -z "$ONLY_PACKAGES" ];
then
Build
PackageTests
fi
# Only build frontend if we haven't set only-backend or only-packages
if [ -z "$ONLY_BACKEND" ] && [ -z "$ONLY_PACKAGES" ];
then
RunGulp
fi
# Only package if we haven't set only-backend or only-frontend
if [ -z "$ONLY_BACKEND" ] && [ -z "$ONLY_FRONTEND" ];
then
PackageMono
PackageMacOS
PackageMacOSApp
CleanupWindowsPackage
PackageArtifacts
fi

@ -6,7 +6,7 @@
"build": "gulp build",
"start": "gulp watch",
"watch": "gulp watch",
"clean": "rimraf ./_output/UI",
"clean": "git clean -fXd",
"eslint": "esprint check",
"eslint-fix": "eslint --fix frontend/** ",
"stylelint-linux": "stylelint $(find frontend -name '*.css') --config frontend/.stylelintrc",
@ -114,7 +114,6 @@
"redux-thunk": "2.3.0",
"require-nocache": "1.0.0",
"reselect": "4.0.0",
"rimraf": "2.6.3",
"run-sequence": "2.2.1",
"signalr": "2.4.1",
"streamqueue": "1.1.2",

@ -7,9 +7,9 @@
#define ForumsURL "https://forums.lidarr.audio/"
#define AppExeName "Lidarr.exe"
#define BaseVersion "0.6.2"
#define BuildNumber GetEnv('APPVEYOR_BUILD_NUMBER')
#define BuildVersion GetEnv('APPVEYOR_BUILD_VERSION')
#define BranchName GetEnv('APPVEYOR_REPO_BRANCH')
#define BuildNumber GetEnv('MINORVERSION')
#define BuildVersion GetEnv('LIDARRVERSION')
#define BranchName GetEnv('BUILD_SOURCEBRANCHNAME')
[Setup]
; NOTE: The value of AppId uniquely identifies this application.

@ -34,7 +34,9 @@ namespace NzbDrone.Automation.Test
[OneTimeSetUp]
public void SmokeTestSetup()
{
driver = new FirefoxDriver();
var options = new FirefoxOptions();
options.AddArguments("--headless");
driver = new FirefoxDriver(options);
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger());
_runner.KillAll();
@ -45,7 +47,7 @@ namespace NzbDrone.Automation.Test
var page = new PageBase(driver);
page.WaitForNoSpinner();
driver.ExecuteScript("window.NzbDrone.NameViews = true;");
driver.ExecuteScript("window.Lidarr.NameViews = true;");
GetPageErrors().Should().BeEmpty();
}

@ -1,4 +1,4 @@
using FluentAssertions;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Automation.Test.PageModel;
using OpenQA.Selenium;
@ -21,7 +21,7 @@ namespace NzbDrone.Automation.Test
{
page.ArtistNavIcon.Click();
page.WaitForNoSpinner();
page.FindByClass("iv-artist-index-artistindexlayout").Should().NotBeNull();
page.Find(By.CssSelector("div[class*='ArtistIndex']")).Should().NotBeNull();
}
[Test]
@ -30,7 +30,7 @@ namespace NzbDrone.Automation.Test
page.CalendarNavIcon.Click();
page.WaitForNoSpinner();
page.FindByClass("iv-calendar-calendarlayout").Should().NotBeNull();
page.Find(By.CssSelector("div[class*='CalendarPage']")).Should().NotBeNull();
}
[Test]
@ -39,7 +39,9 @@ namespace NzbDrone.Automation.Test
page.ActivityNavIcon.Click();
page.WaitForNoSpinner();
page.FindByClass("iv-activity-activitylayout").Should().NotBeNull();
page.Find(By.LinkText("Queue")).Should().NotBeNull();
page.Find(By.LinkText("History")).Should().NotBeNull();
page.Find(By.LinkText("Blacklist")).Should().NotBeNull();
}
[Test]
@ -48,7 +50,8 @@ namespace NzbDrone.Automation.Test
page.WantedNavIcon.Click();
page.WaitForNoSpinner();
page.FindByClass("iv-wanted-missing-missinglayout").Should().NotBeNull();
page.Find(By.LinkText("Missing")).Should().NotBeNull();
page.Find(By.LinkText("Cutoff Unmet")).Should().NotBeNull();
}
[Test]
@ -57,20 +60,20 @@ namespace NzbDrone.Automation.Test
page.SystemNavIcon.Click();
page.WaitForNoSpinner();
page.FindByClass("iv-system-systemlayout").Should().NotBeNull();
page.Find(By.CssSelector("div[class*='Health']")).Should().NotBeNull();
}
[Test]
public void add_series_page()
public void add_artist_page()
{
page.ArtistNavIcon.Click();
page.WaitForNoSpinner();
page.Find(By.LinkText("Add Artist")).Click();
page.Find(By.LinkText("Add New")).Click();
page.WaitForNoSpinner();
page.FindByClass("iv-addartist-addartistlayout").Should().NotBeNull();
page.Find(By.CssSelector("input[class*='AddNewArtist-searchInput']")).Should().NotBeNull();
}
}
}
}

@ -85,8 +85,14 @@
<PackageReference Include="NUnit">
<Version>3.11.0</Version>
</PackageReference>
<PackageReference Include="Selenium.Firefox.WebDriver">
<Version>0.24.0</Version>
</PackageReference>
<PackageReference Include="Selenium.Support">
<Version>3.2.0</Version>
<Version>3.141.0</Version>
</PackageReference>
<PackageReference Include="Selenium.WebDriver">
<Version>3.141.0</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

@ -1,4 +1,4 @@
using System;
using System;
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;
@ -47,16 +47,16 @@ namespace NzbDrone.Automation.Test.PageModel
});
}
public IWebElement ArtistNavIcon => FindByClass("x-artist-nav");
public IWebElement ArtistNavIcon => Find(By.LinkText("Artist"));
public IWebElement CalendarNavIcon => FindByClass("x-calendar-nav");
public IWebElement CalendarNavIcon => Find(By.LinkText("Calendar"));
public IWebElement ActivityNavIcon => FindByClass("x-activity-nav");
public IWebElement ActivityNavIcon => Find(By.LinkText("Activity"));
public IWebElement WantedNavIcon => FindByClass("x-wanted-nav");
public IWebElement WantedNavIcon => Find(By.LinkText("Wanted"));
public IWebElement SettingNavIcon => FindByClass("x-settings-nav");
public IWebElement SettingNavIcon => Find(By.LinkText("Settings"));
public IWebElement SystemNavIcon => FindByClass("x-system-nav");
public IWebElement SystemNavIcon => Find(By.PartialLinkText("System"));
}
}
}

@ -236,10 +236,6 @@
<Project>{74420a79-cc16-442c-8b1e-7c1b913844f0}</Project>
<Name>CurlSharp</Name>
</ProjectReference>
<ProjectReference Include="..\LogentriesNLog\LogentriesNLog.csproj">
<Project>{9DC31DE3-79FF-47A8-96B4-6BA18F6BB1CB}</Project>
<Name>LogentriesNLog</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="DotNet4.SocksProxy">
@ -270,4 +266,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

@ -1,37 +1,63 @@
#! /bin/bash
PLATFORM=$1
TYPE=$2
COVERAGE=$3
WHERE="cat != ManualTest"
TEST_DIR="."
TEST_PATTERN="*Test.dll"
ASSEMBLIES=""
TEST_LOG_FILE="TestLog.txt"
echo "test dir: $TEST_DIR"
if [ -z "$TEST_DIR" ]; then
TEST_DIR="."
fi
if [ -d "$TEST_DIR/_tests" ]; then
TEST_DIR="$TEST_DIR/_tests"
fi
COVERAGE_RESULT_DIRECTORY="$TEST_DIR/CoverageResults/"
rm -f "$TEST_LOG_FILE"
# Uncomment to log test output to a file instead of the console
export LIDARR_TESTS_LOG_OUTPUT="File"
if [[ -z "${APPVEYOR}" ]]; then
NUNIT="$TEST_DIR/NUnit.ConsoleRunner.3.7.0/tools/nunit3-console.exe"
NUNIT_COMMAND="$NUNIT"
NUNIT_PARAMS="--workers=1"
elif [ "$PLATFORM" = "Windows" ]; then
NUNIT="nunit3-console"
NUNIT_COMMAND="$NUNIT"
NUNIT_PARAMS="--result=myresults.xml;format=AppVeyor --workers=1"
unset TMP
unset TEMP
else
NUNIT="$TEST_DIR/NUnit.ConsoleRunner.3.7.0/tools/nunit3-console.exe"
NUNIT_COMMAND="$NUNIT"
NUNIT_PARAMS="--result=myresults.xml --workers=1"
unset TMP
unset TEMP
NUNIT="$TEST_DIR/NUnit.ConsoleRunner.3.7.0/tools/nunit3-console.exe"
NUNIT_COMMAND="$NUNIT"
NUNIT_PARAMS="--workers=1"
if [ "$PLATFORM" = "Mac" ]; then
#set up environment
if [[ -x '/opt/local/bin/mono' ]]; then
# Macports and mono-supplied installer path
export PATH="/opt/local/bin:$PATH"
elif [[ -x '/usr/local/bin/mono' ]]; then
# Homebrew-supplied path to mono
export PATH="/usr/local/bin:$PATH"
fi
echo $TEST_DIR
export DYLD_FALLBACK_LIBRARY_PATH="$TEST_DIR"
if [ -e /Library/Frameworks/Mono.framework ]; then
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$MONO_FRAMEWORK_PATH/lib"
fi
if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then
export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"
fi
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$HOME/lib:/usr/local/lib:/lib:/usr/lib"
echo $LD_LIBRARY_PATH
echo $DYLD_LIBRARY_PATH
echo $DYLD_FALLBACK_LIBRARY_PATH
# To debug which libraries are being loaded:
# export DYLD_PRINT_LIBRARIES=YES
fi
if [ "$PLATFORM" = "Windows" ]; then
@ -61,16 +87,27 @@ for i in `find $TEST_DIR -name "$TEST_PATTERN"`;
do ASSEMBLIES="$ASSEMBLIES $i"
done
$NUNIT_COMMAND --where "$WHERE" $NUNIT_PARAMS $ASSEMBLIES;
EXIT_CODE=$?
if [ "$EXIT_CODE" -ge 0 ]; then
if [[ -z "${APPVEYOR}" ]]; then
echo "Failed tests: $EXIT_CODE"
if [ "$COVERAGE" = "Coverage" ]; then
if [ "$PLATFORM" = "Windows" ] || [ "$PLATFORM" = "Linux" ]; then
dotnet tool install coverlet.console --tool-path="$TEST_DIR/coverlet/"
mkdir $COVERAGE_RESULT_DIRECTORY
OPEN_COVER="$TEST_DIR/coverlet/coverlet"
$OPEN_COVER "$TEST_DIR/" --verbosity "detailed" --format "cobertura" --format "opencover" --output "$COVERAGE_RESULT_DIRECTORY" --exclude "[Lidarr.*.Test]*" --exclude "[Lidarr.Test.*]*" --exclude "[Marr.Data]*" --exclude "[MonoTorrent]*" --exclude "[CurlSharp]*" --target "$NUNIT" --targetargs "$NUNIT_PARAMS --where=\"$WHERE\" $ASSEMBLIES";
EXIT_CODE=$?
else
echo "Failed tests: $EXIT_CODE"
appveyor AddMessage "Failed tests: $EXIT_CODE"
echo "Coverage only supported on Windows and Linux"
exit 3
fi
elif [ "$COVERAGE" = "Test" ] ; then
$NUNIT_COMMAND --where "$WHERE" $NUNIT_PARAMS $ASSEMBLIES;
EXIT_CODE=$?
else
echo "Run Type must be provided as third argument: Coverage or Test"
exit 3
fi
if [ "$EXIT_CODE" -ge 0 ]; then
echo "Failed tests: $EXIT_CODE"
exit 0
else
exit $EXIT_CODE

Loading…
Cancel
Save