|
@@ -2,9 +2,11 @@ name: $(Date:yyyyMMdd)$(Rev:.r)
|
|
|
|
|
|
variables:
|
|
|
- name: TestProjects
|
|
|
- value: 'tests/**/*Tests.csproj'
|
|
|
+ value: "tests/**/*Tests.csproj"
|
|
|
- name: RestoreBuildProjects
|
|
|
- value: 'Jellyfin.Server/Jellyfin.Server.csproj'
|
|
|
+ value: "Jellyfin.Server/Jellyfin.Server.csproj"
|
|
|
+ - name: DotNetSdkVersion
|
|
|
+ value: 3.1.100
|
|
|
|
|
|
pr:
|
|
|
autoCancel: true
|
|
@@ -13,234 +15,26 @@ trigger:
|
|
|
batch: true
|
|
|
|
|
|
jobs:
|
|
|
- - job: main_build
|
|
|
- displayName: Main Build
|
|
|
- pool:
|
|
|
- vmImage: ubuntu-latest
|
|
|
- strategy:
|
|
|
- matrix:
|
|
|
- Release:
|
|
|
- BuildConfiguration: Release
|
|
|
- Debug:
|
|
|
- BuildConfiguration: Debug
|
|
|
- maxParallel: 2
|
|
|
- steps:
|
|
|
- - checkout: self
|
|
|
- clean: true
|
|
|
- submodules: true
|
|
|
- persistCredentials: true
|
|
|
-
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: "Clone Web Client (Master, Release, or Tag)"
|
|
|
- condition: and(succeeded(), or(contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- script: 'git clone --single-branch --branch $(Build.SourceBranchName) --depth=1 https://github.com/jellyfin/jellyfin-web.git $(Agent.TempDirectory)/jellyfin-web'
|
|
|
-
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: "Clone Web Client (PR)"
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest'))
|
|
|
- inputs:
|
|
|
- script: 'git clone --single-branch --branch $(System.PullRequest.TargetBranch) --depth 1 https://github.com/jellyfin/jellyfin-web.git $(Agent.TempDirectory)/jellyfin-web'
|
|
|
-
|
|
|
- - task: NodeTool@0
|
|
|
- displayName: 'Install Node'
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- versionSpec: '10.x'
|
|
|
-
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: "Build Web Client"
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- script: yarn install
|
|
|
- workingDirectory: $(Agent.TempDirectory)/jellyfin-web
|
|
|
-
|
|
|
- - task: CopyFiles@2
|
|
|
- displayName: 'Copy Web Client'
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- sourceFolder: $(Agent.TempDirectory)/jellyfin-web/dist # Optional
|
|
|
- contents: '**'
|
|
|
- targetFolder: $(Build.SourcesDirectory)/MediaBrowser.WebDashboard/jellyfin-web
|
|
|
- cleanTargetFolder: true # Optional
|
|
|
- overWrite: true # Optional
|
|
|
- flattenFolders: false # Optional
|
|
|
-
|
|
|
- - task: UseDotNet@2
|
|
|
- displayName: 'Update DotNet'
|
|
|
- inputs:
|
|
|
- packageType: sdk
|
|
|
- version: 3.1.100
|
|
|
-
|
|
|
- - task: DotNetCoreCLI@2
|
|
|
- displayName: 'Publish Server'
|
|
|
- inputs:
|
|
|
- command: publish
|
|
|
- publishWebProjects: false
|
|
|
- projects: '$(RestoreBuildProjects)'
|
|
|
- arguments: '--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)'
|
|
|
- zipAfterPublish: false
|
|
|
-
|
|
|
- - task: PublishPipelineArtifact@0
|
|
|
- displayName: 'Publish Artifact Naming'
|
|
|
- condition: and(eq(variables['BuildConfiguration'], 'Release'), succeeded())
|
|
|
- inputs:
|
|
|
- targetPath: '$(build.artifactstagingdirectory)/Jellyfin.Server/Emby.Naming.dll'
|
|
|
- artifactName: 'Jellyfin.Naming'
|
|
|
-
|
|
|
- - task: PublishPipelineArtifact@0
|
|
|
- displayName: 'Publish Artifact Controller'
|
|
|
- condition: and(eq(variables['BuildConfiguration'], 'Release'), succeeded())
|
|
|
- inputs:
|
|
|
- targetPath: '$(build.artifactstagingdirectory)/Jellyfin.Server/MediaBrowser.Controller.dll'
|
|
|
- artifactName: 'Jellyfin.Controller'
|
|
|
-
|
|
|
- - task: PublishPipelineArtifact@0
|
|
|
- displayName: 'Publish Artifact Model'
|
|
|
- condition: and(eq(variables['BuildConfiguration'], 'Release'), succeeded())
|
|
|
- inputs:
|
|
|
- targetPath: '$(build.artifactstagingdirectory)/Jellyfin.Server/MediaBrowser.Model.dll'
|
|
|
- artifactName: 'Jellyfin.Model'
|
|
|
-
|
|
|
- - task: PublishPipelineArtifact@0
|
|
|
- displayName: 'Publish Artifact Common'
|
|
|
- condition: and(eq(variables['BuildConfiguration'], 'Release'), succeeded())
|
|
|
- inputs:
|
|
|
- targetPath: '$(build.artifactstagingdirectory)/Jellyfin.Server/MediaBrowser.Common.dll'
|
|
|
- artifactName: 'Jellyfin.Common'
|
|
|
-
|
|
|
- - job: main_test
|
|
|
- displayName: Main Test
|
|
|
- pool:
|
|
|
- vmImage: windows-latest
|
|
|
- steps:
|
|
|
- - checkout: self
|
|
|
- clean: true
|
|
|
- submodules: true
|
|
|
- persistCredentials: false
|
|
|
-
|
|
|
- - task: DotNetCoreCLI@2
|
|
|
- displayName: Build
|
|
|
- inputs:
|
|
|
- command: build
|
|
|
- publishWebProjects: false
|
|
|
- projects: '$(TestProjects)'
|
|
|
- arguments: '--configuration $(BuildConfiguration)'
|
|
|
- zipAfterPublish: false
|
|
|
-
|
|
|
- - task: VisualStudioTestPlatformInstaller@1
|
|
|
- inputs:
|
|
|
- packageFeedSelector: 'nugetOrg' # Options: nugetOrg, customFeed, netShare
|
|
|
- versionSelector: 'latestPreRelease' # Required when packageFeedSelector == NugetOrg || PackageFeedSelector == CustomFeed# Options: latestPreRelease, latestStable, specificVersion
|
|
|
- - task: VSTest@2
|
|
|
- inputs:
|
|
|
- testSelector: 'testAssemblies' # Options: testAssemblies, testPlan, testRun
|
|
|
- testAssemblyVer2: | # Required when testSelector == TestAssemblies
|
|
|
- **\bin\$(BuildConfiguration)\**\*tests.dll
|
|
|
- **\bin\$(BuildConfiguration)\**\*test.dll
|
|
|
- !**\obj\**
|
|
|
- !**\xunit.runner.visualstudio.testadapter.dll
|
|
|
- !**\xunit.runner.visualstudio.dotnetcore.testadapter.dll
|
|
|
- searchFolder: '$(System.DefaultWorkingDirectory)'
|
|
|
- runInParallel: True # Optional
|
|
|
- runTestsInIsolation: True # Optional
|
|
|
- codeCoverageEnabled: True # Optional
|
|
|
- configuration: 'Debug' # Optional
|
|
|
- publishRunAttachments: true # Optional
|
|
|
- testRunTitle: $(Agent.JobName)
|
|
|
- otherConsoleOptions: '/platform:x64 /Framework:.NETCoreApp,Version=v3.1 /logger:console;verbosity="normal"'
|
|
|
-
|
|
|
- - job: main_build_win
|
|
|
- displayName: Publish Windows
|
|
|
- pool:
|
|
|
- vmImage: windows-latest
|
|
|
- strategy:
|
|
|
- matrix:
|
|
|
- Release:
|
|
|
- BuildConfiguration: Release
|
|
|
- maxParallel: 2
|
|
|
- steps:
|
|
|
- - checkout: self
|
|
|
- clean: true
|
|
|
- submodules: true
|
|
|
- persistCredentials: true
|
|
|
-
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: "Clone Web Client (Master, Release, or Tag)"
|
|
|
- condition: and(succeeded(), or(contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master'), contains(variables['Build.SourceBranch'], 'tag')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- script: 'git clone --single-branch --branch $(Build.SourceBranchName) --depth=1 https://github.com/jellyfin/jellyfin-web.git $(Agent.TempDirectory)/jellyfin-web'
|
|
|
-
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: "Clone Web Client (PR)"
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest'))
|
|
|
- inputs:
|
|
|
- script: 'git clone --single-branch --branch $(System.PullRequest.TargetBranch) --depth 1 https://github.com/jellyfin/jellyfin-web.git $(Agent.TempDirectory)/jellyfin-web'
|
|
|
-
|
|
|
- - task: NodeTool@0
|
|
|
- displayName: 'Install Node'
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- versionSpec: '10.x'
|
|
|
-
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: "Build Web Client"
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- script: yarn install
|
|
|
- workingDirectory: $(Agent.TempDirectory)/jellyfin-web
|
|
|
-
|
|
|
- - task: CopyFiles@2
|
|
|
- displayName: 'Copy Web Client'
|
|
|
- condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')) ,eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
|
|
|
- inputs:
|
|
|
- sourceFolder: $(Agent.TempDirectory)/jellyfin-web/dist # Optional
|
|
|
- contents: '**'
|
|
|
- targetFolder: $(Build.SourcesDirectory)/MediaBrowser.WebDashboard/jellyfin-web
|
|
|
- cleanTargetFolder: true # Optional
|
|
|
- overWrite: true # Optional
|
|
|
- flattenFolders: false # Optional
|
|
|
-
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: 'Clone UX Repository'
|
|
|
- inputs:
|
|
|
- script: git clone --depth=1 https://github.com/jellyfin/jellyfin-ux $(Agent.TempDirectory)\jellyfin-ux
|
|
|
-
|
|
|
- - task: PowerShell@2
|
|
|
- displayName: 'Build NSIS Installer'
|
|
|
- inputs:
|
|
|
- targetType: 'filePath' # Optional. Options: filePath, inline
|
|
|
- filePath: ./deployment/windows/build-jellyfin.ps1 # Required when targetType == FilePath
|
|
|
- arguments: -InstallFFMPEG -InstallNSSM -MakeNSIS -InstallTrayApp -UXLocation $(Agent.TempDirectory)\jellyfin-ux -InstallLocation $(build.artifactstagingdirectory)
|
|
|
- errorActionPreference: 'stop' # Optional. Options: stop, continue, silentlyContinue
|
|
|
- workingDirectory: $(Build.SourcesDirectory) # Optional
|
|
|
-
|
|
|
- - task: CopyFiles@2
|
|
|
- displayName: 'Copy NSIS Installer'
|
|
|
- inputs:
|
|
|
- sourceFolder: $(Build.SourcesDirectory)/deployment/windows/ # Optional
|
|
|
- contents: 'jellyfin*.exe'
|
|
|
- targetFolder: $(System.ArtifactsDirectory)/setup
|
|
|
- cleanTargetFolder: true # Optional
|
|
|
- overWrite: true # Optional
|
|
|
- flattenFolders: true # Optional
|
|
|
-
|
|
|
- - task: PublishPipelineArtifact@0
|
|
|
- displayName: 'Publish Artifact Setup'
|
|
|
- condition: and(eq(variables['BuildConfiguration'], 'Release'), succeeded())
|
|
|
- inputs:
|
|
|
- targetPath: '$(build.artifactstagingdirectory)/setup'
|
|
|
- artifactName: 'Jellyfin Server Setup'
|
|
|
-
|
|
|
- - job: dotnet_compat
|
|
|
- displayName: Compatibility Check
|
|
|
- pool:
|
|
|
- vmImage: ubuntu-latest
|
|
|
- dependsOn: main_build
|
|
|
- # only execute for pull requests
|
|
|
- condition: and(succeeded(), variables['System.PullRequest.PullRequestNumber'])
|
|
|
- strategy:
|
|
|
- matrix:
|
|
|
+ - template: azure-pipelines-main.yml
|
|
|
+ parameters:
|
|
|
+ LinuxImage: 'ubuntu-latest'
|
|
|
+ RestoreBuildProjects: $(RestoreBuildProjects)
|
|
|
+
|
|
|
+ - template: azure-pipelines-test.yml
|
|
|
+ parameters:
|
|
|
+ ImageNames:
|
|
|
+ Linux: 'ubuntu-latest'
|
|
|
+ Windows: 'windows-latest'
|
|
|
+ macOS: 'macos-latest'
|
|
|
+
|
|
|
+ - template: azure-pipelines-windows.yml
|
|
|
+ parameters:
|
|
|
+ WindowsImage: 'windows-latest'
|
|
|
+ TestProjects: $(TestProjects)
|
|
|
+
|
|
|
+ - template: azure-pipelines-compat.yml
|
|
|
+ parameters:
|
|
|
+ Packages:
|
|
|
Naming:
|
|
|
NugetPackageName: Jellyfin.Naming
|
|
|
AssemblyFileName: Emby.Naming.dll
|
|
@@ -253,74 +47,4 @@ jobs:
|
|
|
Common:
|
|
|
NugetPackageName: Jellyfin.Common
|
|
|
AssemblyFileName: MediaBrowser.Common.dll
|
|
|
- maxParallel: 2
|
|
|
- steps:
|
|
|
- - checkout: none
|
|
|
-
|
|
|
- - task: UseDotNet@2
|
|
|
- displayName: 'Update DotNet'
|
|
|
- inputs:
|
|
|
- packageType: sdk
|
|
|
- version: 3.1.100
|
|
|
-
|
|
|
- - task: DownloadPipelineArtifact@2
|
|
|
- displayName: 'Download New Assembly Build Artifact'
|
|
|
- inputs:
|
|
|
- source: 'current' # Options: current, specific
|
|
|
- artifact: '$(NugetPackageName)' # Optional
|
|
|
- path: '$(System.ArtifactsDirectory)/new-artifacts'
|
|
|
- runVersion: 'latest' # Required when source == Specific. Options: latest, latestFromBranch, specific
|
|
|
-
|
|
|
- - task: CopyFiles@2
|
|
|
- displayName: 'Copy New Assembly Build Artifact'
|
|
|
- inputs:
|
|
|
- sourceFolder: $(System.ArtifactsDirectory)/new-artifacts # Optional
|
|
|
- contents: '**/*.dll'
|
|
|
- targetFolder: $(System.ArtifactsDirectory)/new-release
|
|
|
- cleanTargetFolder: true # Optional
|
|
|
- overWrite: true # Optional
|
|
|
- flattenFolders: true # Optional
|
|
|
-
|
|
|
- - task: DownloadPipelineArtifact@2
|
|
|
- displayName: 'Download Reference Assembly Build Artifact'
|
|
|
- inputs:
|
|
|
- source: 'specific' # Options: current, specific
|
|
|
- artifact: '$(NugetPackageName)' # Optional
|
|
|
- path: '$(System.ArtifactsDirectory)/current-artifacts'
|
|
|
- project: '$(System.TeamProjectId)' # Required when source == Specific
|
|
|
- pipeline: '$(System.DefinitionId)' # Required when source == Specific
|
|
|
- runVersion: 'latestFromBranch' # Required when source == Specific. Options: latest, latestFromBranch, specific
|
|
|
- runBranch: 'refs/heads/$(System.PullRequest.TargetBranch)' # Required when source == Specific && runVersion == LatestFromBranch
|
|
|
-
|
|
|
- - task: CopyFiles@2
|
|
|
- displayName: 'Copy Reference Assembly Build Artifact'
|
|
|
- inputs:
|
|
|
- sourceFolder: $(System.ArtifactsDirectory)/current-artifacts # Optional
|
|
|
- contents: '**/*.dll'
|
|
|
- targetFolder: $(System.ArtifactsDirectory)/current-release
|
|
|
- cleanTargetFolder: true # Optional
|
|
|
- overWrite: true # Optional
|
|
|
- flattenFolders: true # Optional
|
|
|
-
|
|
|
- - task: DownloadGitHubRelease@0
|
|
|
- displayName: 'Download ABI Compatibility Check Tool'
|
|
|
- inputs:
|
|
|
- connection: Jellyfin Release Download
|
|
|
- userRepository: EraYaN/dotnet-compatibility
|
|
|
- defaultVersionType: 'latest' # Options: latest, specificVersion, specificTag
|
|
|
- itemPattern: '**-ci.zip' # Optional
|
|
|
- downloadPath: '$(System.ArtifactsDirectory)'
|
|
|
-
|
|
|
- - task: ExtractFiles@1
|
|
|
- displayName: 'Extract ABI Compatibility Check Tool'
|
|
|
- inputs:
|
|
|
- archiveFilePatterns: '$(System.ArtifactsDirectory)/*-ci.zip'
|
|
|
- destinationFolder: $(System.ArtifactsDirectory)/tools
|
|
|
- cleanDestinationFolder: true
|
|
|
-
|
|
|
- # The `--warnings-only` switch will swallow the return code and not emit any errors.
|
|
|
- - task: CmdLine@2
|
|
|
- displayName: 'Execute ABI Compatibility Check Tool'
|
|
|
- inputs:
|
|
|
- script: 'dotnet tools/CompatibilityCheckerCLI.dll current-release/$(AssemblyFileName) new-release/$(AssemblyFileName) --azure-pipelines --warnings-only'
|
|
|
- workingDirectory: $(System.ArtifactsDirectory) # Optional
|
|
|
+ LinuxImage: 'ubuntu-latest'
|