azure-pipelines-package.yml 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. jobs:
  2. - job: BuildPackage
  3. displayName: 'Build Packages'
  4. strategy:
  5. matrix:
  6. CentOS.amd64:
  7. BuildConfiguration: centos.amd64
  8. Fedora.amd64:
  9. BuildConfiguration: fedora.amd64
  10. Debian.amd64:
  11. BuildConfiguration: debian.amd64
  12. Debian.arm64:
  13. BuildConfiguration: debian.arm64
  14. Debian.armhf:
  15. BuildConfiguration: debian.armhf
  16. Ubuntu.amd64:
  17. BuildConfiguration: ubuntu.amd64
  18. Ubuntu.arm64:
  19. BuildConfiguration: ubuntu.arm64
  20. Ubuntu.armhf:
  21. BuildConfiguration: ubuntu.armhf
  22. Linux.amd64:
  23. BuildConfiguration: linux.amd64
  24. Linux.amd64-musl:
  25. BuildConfiguration: linux.amd64-musl
  26. Linux.arm64:
  27. BuildConfiguration: linux.arm64
  28. Linux.armhf:
  29. BuildConfiguration: linux.armhf
  30. Windows.amd64:
  31. BuildConfiguration: windows.amd64
  32. MacOS:
  33. BuildConfiguration: macos
  34. Portable:
  35. BuildConfiguration: portable
  36. pool:
  37. vmImage: 'ubuntu-latest'
  38. steps:
  39. - script: echo "##vso[task.setvariable variable=JellyfinVersion]$( awk -F '/' '{ print $NF }' <<<'$(Build.SourceBranch)' | sed 's/^v//' )"
  40. displayName: Set release version (stable)
  41. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  42. - script: 'docker build -f deployment/Dockerfile.$(BuildConfiguration) -t jellyfin-server-$(BuildConfiguration) deployment'
  43. displayName: 'Build Dockerfile'
  44. - script: 'docker image ls -a && docker run -v $(pwd)/deployment/dist:/dist -v $(pwd):/jellyfin -e IS_UNSTABLE="yes" -e BUILD_ID=$(Build.BuildNumber) jellyfin-server-$(BuildConfiguration)'
  45. displayName: 'Run Dockerfile (unstable)'
  46. condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
  47. - script: 'docker image ls -a && docker run -v $(pwd)/deployment/dist:/dist -v $(pwd):/jellyfin -e IS_UNSTABLE="no" -e BUILD_ID=$(Build.BuildNumber) jellyfin-server-$(BuildConfiguration)'
  48. displayName: 'Run Dockerfile (stable)'
  49. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  50. - task: PublishPipelineArtifact@1
  51. displayName: 'Publish Release'
  52. inputs:
  53. targetPath: '$(Build.SourcesDirectory)/deployment/dist'
  54. artifactName: 'jellyfin-server-$(BuildConfiguration)'
  55. - task: SSH@0
  56. displayName: 'Create target directory on repository server'
  57. inputs:
  58. sshEndpoint: repository
  59. runOptions: 'inline'
  60. inline: 'mkdir -p /srv/repository/incoming/azure/$(Build.BuildNumber)/$(BuildConfiguration)'
  61. - task: CopyFilesOverSSH@0
  62. displayName: 'Upload artifacts to repository server'
  63. inputs:
  64. sshEndpoint: repository
  65. sourceFolder: '$(Build.SourcesDirectory)/deployment/dist'
  66. contents: '**'
  67. targetFolder: '/srv/repository/incoming/azure/$(Build.BuildNumber)/$(BuildConfiguration)'
  68. - job: OpenAPISpec
  69. dependsOn: Test
  70. condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/master'),startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
  71. displayName: 'Push OpenAPI Spec to repository'
  72. pool:
  73. vmImage: 'ubuntu-latest'
  74. steps:
  75. - script: echo "##vso[task.setvariable variable=JellyfinVersion]$( awk -F '/' '{ print $NF }' <<<'$(Build.SourceBranch)' | sed 's/^v//' )"
  76. displayName: Set release version (stable)
  77. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  78. - task: DownloadPipelineArtifact@2
  79. displayName: 'Download OpenAPI Spec'
  80. inputs:
  81. source: 'current'
  82. artifact: "OpenAPI Spec"
  83. path: "$(System.ArtifactsDirectory)/openapispec"
  84. runVersion: "latest"
  85. - task: SSH@0
  86. displayName: 'Create target directory on repository server'
  87. inputs:
  88. sshEndpoint: repository
  89. runOptions: 'inline'
  90. inline: 'mkdir -p /srv/repository/incoming/azure/$(Build.BuildNumber)'
  91. - task: CopyFilesOverSSH@0
  92. displayName: 'Upload artifacts to repository server'
  93. inputs:
  94. sshEndpoint: repository
  95. sourceFolder: '$(System.ArtifactsDirectory)/openapispec'
  96. contents: 'openapi.json'
  97. targetFolder: '/srv/repository/incoming/azure/$(Build.BuildNumber)'
  98. - job: BuildDocker
  99. displayName: 'Build Docker'
  100. strategy:
  101. matrix:
  102. amd64:
  103. BuildConfiguration: amd64
  104. arm64:
  105. BuildConfiguration: arm64
  106. armhf:
  107. BuildConfiguration: armhf
  108. pool:
  109. vmImage: 'ubuntu-latest'
  110. variables:
  111. - name: JellyfinVersion
  112. value: 0.0.0
  113. steps:
  114. - script: echo "##vso[task.setvariable variable=JellyfinVersion]$( awk -F '/' '{ print $NF }' <<<'$(Build.SourceBranch)' | sed 's/^v//' )"
  115. displayName: Set release version (stable)
  116. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  117. - task: Docker@2
  118. displayName: 'Push Unstable Image'
  119. condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
  120. inputs:
  121. repository: 'jellyfin/jellyfin-server'
  122. command: buildAndPush
  123. buildContext: '.'
  124. Dockerfile: 'deployment/Dockerfile.docker.$(BuildConfiguration)'
  125. containerRegistry: Docker Hub
  126. tags: |
  127. unstable-$(Build.BuildNumber)-$(BuildConfiguration)
  128. unstable-$(BuildConfiguration)
  129. - task: Docker@2
  130. displayName: 'Push Stable Image'
  131. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  132. inputs:
  133. repository: 'jellyfin/jellyfin-server'
  134. command: buildAndPush
  135. buildContext: '.'
  136. Dockerfile: 'deployment/Dockerfile.docker.$(BuildConfiguration)'
  137. containerRegistry: Docker Hub
  138. tags: |
  139. stable-$(Build.BuildNumber)-$(BuildConfiguration)
  140. $(JellyfinVersion)-$(BuildConfiguration)
  141. - job: CollectArtifacts
  142. timeoutInMinutes: 20
  143. displayName: 'Collect Artifacts'
  144. continueOnError: true
  145. dependsOn:
  146. - BuildPackage
  147. - BuildDocker
  148. pool:
  149. vmImage: 'ubuntu-latest'
  150. steps:
  151. - task: SSH@0
  152. displayName: 'Update Unstable Repository'
  153. continueOnError: true
  154. condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
  155. inputs:
  156. sshEndpoint: repository
  157. runOptions: 'commands'
  158. commands: nohup sudo /srv/repository/collect-server.azure.sh /srv/repository/incoming/azure $(Build.BuildNumber) unstable &
  159. - task: SSH@0
  160. displayName: 'Update Stable Repository'
  161. continueOnError: true
  162. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  163. inputs:
  164. sshEndpoint: repository
  165. runOptions: 'commands'
  166. commands: nohup sudo /srv/repository/collect-server.azure.sh /srv/repository/incoming/azure $(Build.BuildNumber) $(Build.SourceBranch) &
  167. - job: PublishNuget
  168. displayName: 'Publish NuGet packages'
  169. pool:
  170. vmImage: 'ubuntu-latest'
  171. variables:
  172. - name: JellyfinVersion
  173. value: $[replace(variables['Build.SourceBranch'],'refs/tags/v','')]
  174. steps:
  175. - task: UseDotNet@2
  176. displayName: 'Use .NET 6.0 sdk'
  177. inputs:
  178. packageType: 'sdk'
  179. version: '6.0.x'
  180. - task: DotNetCoreCLI@2
  181. displayName: 'Build Stable Nuget packages'
  182. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  183. inputs:
  184. command: 'custom'
  185. projects: |
  186. Jellyfin.Data/Jellyfin.Data.csproj
  187. MediaBrowser.Common/MediaBrowser.Common.csproj
  188. MediaBrowser.Controller/MediaBrowser.Controller.csproj
  189. MediaBrowser.Model/MediaBrowser.Model.csproj
  190. Emby.Naming/Emby.Naming.csproj
  191. src/Jellyfin.Extensions/Jellyfin.Extensions.csproj
  192. custom: 'pack'
  193. arguments: -o $(Build.ArtifactStagingDirectory) -p:Version=$(JellyfinVersion)
  194. - task: DotNetCoreCLI@2
  195. displayName: 'Build Unstable Nuget packages'
  196. condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
  197. inputs:
  198. command: 'custom'
  199. projects: |
  200. Jellyfin.Data/Jellyfin.Data.csproj
  201. MediaBrowser.Common/MediaBrowser.Common.csproj
  202. MediaBrowser.Controller/MediaBrowser.Controller.csproj
  203. MediaBrowser.Model/MediaBrowser.Model.csproj
  204. Emby.Naming/Emby.Naming.csproj
  205. src/Jellyfin.Extensions/Jellyfin.Extensions.csproj
  206. custom: 'pack'
  207. arguments: '--version-suffix $(Build.BuildNumber) -o $(Build.ArtifactStagingDirectory) -p:Stability=Unstable'
  208. - task: PublishBuildArtifacts@1
  209. displayName: 'Publish Nuget packages'
  210. inputs:
  211. pathToPublish: $(Build.ArtifactStagingDirectory)
  212. artifactName: Jellyfin Nuget Packages
  213. - task: NuGetCommand@2
  214. displayName: 'Push Nuget packages to stable feed'
  215. condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
  216. inputs:
  217. command: 'push'
  218. packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg'
  219. nuGetFeedType: 'external'
  220. publishFeedCredentials: 'NugetOrg'
  221. allowPackageConflicts: true # This ignores an error if the version already exists
  222. - task: NuGetAuthenticate@0
  223. displayName: 'Authenticate to unstable Nuget feed'
  224. condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
  225. - task: NuGetCommand@2
  226. displayName: 'Push Nuget packages to unstable feed'
  227. condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
  228. inputs:
  229. command: 'push'
  230. packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg' # No symbols since Azure Artifact does not support it
  231. nuGetFeedType: 'internal'
  232. publishVstsFeed: '7cce6c46-d610-45e3-9fb7-65a6bfd1b671/a5746b79-f369-42db-93ff-59cd066f9327'
  233. allowPackageConflicts: true # This ignores an error if the version already exists