publish-pipeline.yaml 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. # Publish pipeline for WinGet.
  2. # Name of the run
  3. name: '$(Build.DefinitionName)-$(Build.DefinitionVersion)-$(Date:yyyyMMdd)-$(Rev:r)'
  4. # Batch CI run. when a pipeline is running, the system waits until the run is completed,
  5. # then starts another run with all changes that have not yet been built.
  6. trigger:
  7. batch: true
  8. branches:
  9. include:
  10. - master
  11. pr: none
  12. jobs:
  13. # Agent phase.
  14. - job: 'CommitProcessing'
  15. displayName: 'Commit Processing'
  16. pool:
  17. vmImage: 'windows-latest'
  18. variables:
  19. skipComponentGovernanceDetection: ${{ true }}
  20. runCodesignValidationInjection: ${{ false }}
  21. steps:
  22. # Downloads all the setup files and its dependencies.
  23. - task: AzureCLI@1
  24. displayName: 'Azure Setup'
  25. inputs:
  26. azureSubscription: '$(WinGet.Subscription)'
  27. scriptLocation: inlineScript
  28. inlineScript: 'az storage blob download-batch -d . --pattern * -s servicewrapper --output none'
  29. env:
  30. AZURE_STORAGE_CONNECTION_STRING: $(ValidationStorageAccountConnectionString)
  31. # WinGet setup
  32. - script: 'winget_publish_setup.cmd'
  33. name: 'wingetsetup'
  34. displayName: 'WinGet Setup'
  35. workingDirectory: scripts
  36. env:
  37. HOST_KEY: $(AzureFunctionHostKey)
  38. SIGN_ENDPOINT: $(AzFuncSignEndpoint)
  39. CLEANUP_ENDPOINT: $(AzFuncPublishCleanupEndpoint)
  40. MANIFEST_PUBLISH_COMPLETION_ENDPOINT: $(AzFuncManifestPublishCompletionEndpoint)
  41. WAIVER_COMMIT_ENDPOINT: $(AzFuncWaiverCommitEndpoint)
  42. RESTSOURCE_UPDATE_ENDPOINT: $(AzFuncRestSourceUpdateEndpoint)
  43. - task: CmdLine@2
  44. displayName: 'Validate Commits'
  45. inputs:
  46. script: 'WinGetSvcWrapper.exe validate-commits --operationId %BUILD_BUILDNUMBER%'
  47. failOnStderr: true
  48. condition: succeeded()
  49. env:
  50. ValidationConnectionString: $(ValidationStorageAccountConnectionString)
  51. ExecutionEnvironment: $(ExecutionEnvironment)
  52. CacheConnectionString: $(CacheStorageAccountConnectionString)
  53. PackagePublisher: $(PackagePublisher)
  54. DIApplicationInsightKey: $(DIApplicationInsightKey)
  55. WinGet:AppConfig:Primary: $(AppConfigPrimary)
  56. WinGet:AppConfig:Secondary: $(AppConfigSecondary)
  57. # Agentless phase. Depends on previous job.
  58. - job: 'SignPackage'
  59. pool: server
  60. timeoutInMinutes: 1500
  61. displayName: 'Sign package'
  62. dependsOn:
  63. - 'CommitProcessing'
  64. variables:
  65. HostKeySecret: $[ dependencies.CommitProcessing.outputs['wingetsetup.hostkey']]
  66. SignEndpointSecret: $[ dependencies.CommitProcessing.outputs['wingetsetup.signEndpoint']]
  67. steps:
  68. # Sign package.
  69. - task: AzureFunction@1
  70. displayName: 'Signing package'
  71. inputs:
  72. function: '$(SignEndpointSecret)'
  73. key: '$(HostKeySecret)'
  74. body: |
  75. {
  76. "operationId": "$(Build.BuildNumber)",
  77. "BuildId": "$(Build.BuildId)",
  78. "PlanUrl": "$(system.CollectionUri)",
  79. "HubName": "$(system.HostType)",
  80. "pipelineType": "CommitPipeline",
  81. "ProjectId": "$(system.TeamProjectId)",
  82. "PlanId": "$(system.PlanId)",
  83. "JobId": "$(system.JobId)",
  84. "TimelineId": "$(system.TimelineId)",
  85. "TaskInstanceId": "$(system.TaskInstanceId)",
  86. "AuthToken": "$(system.AccessToken)"
  87. }
  88. waitForCompletion: "true"
  89. # Agent phase. Depends on previous job.
  90. - job: 'Publish'
  91. displayName: 'Publish'
  92. pool:
  93. vmImage: 'windows-latest'
  94. variables:
  95. skipComponentGovernanceDetection: ${{ true }}
  96. runCodesignValidationInjection: ${{ false }}
  97. dependsOn:
  98. - 'SignPackage'
  99. steps:
  100. # Downloads all the setup files and its dependencies.
  101. - task: AzureCLI@1
  102. displayName: 'Azure Setup'
  103. inputs:
  104. azureSubscription: '$(WinGet.Subscription)'
  105. scriptLocation: inlineScript
  106. inlineScript: 'az storage blob download-batch -d . --pattern * -s servicewrapper --output none'
  107. env:
  108. AZURE_STORAGE_CONNECTION_STRING: $(ValidationStorageAccountConnectionString)
  109. # Validates integrity of pull request.
  110. - task: CmdLine@2
  111. displayName: 'Publish'
  112. inputs:
  113. script: 'WinGetSvcWrapper.exe publish --operationId %BUILD_BUILDNUMBER%'
  114. failOnStderr: true
  115. condition: succeeded()
  116. env:
  117. ValidationConnectionString: $(ValidationStorageAccountConnectionString)
  118. ExecutionEnvironment: $(ExecutionEnvironment)
  119. CacheConnectionString: $(CacheStorageAccountConnectionString)
  120. DIApplicationInsightKey: $(DIApplicationInsightKey)
  121. WinGet:AppConfig:Primary: $(AppConfigPrimary)
  122. WinGet:AppConfig:Secondary: $(AppConfigSecondary)
  123. # Agentless phase. Depends on previous job.
  124. - job: 'PublishToRestSource'
  125. pool: server
  126. timeoutInMinutes: 1500
  127. displayName: 'Publish to rest source'
  128. dependsOn:
  129. - 'CommitProcessing'
  130. - 'Publish'
  131. variables:
  132. HostKeySecret: $[ dependencies.CommitProcessing.outputs['wingetsetup.hostkey']]
  133. RestSourceUpdateEndpointSecret: $[ dependencies.CommitProcessing.outputs['wingetsetup.restsourceUpdateEndpoint']]
  134. steps:
  135. # Publish updates to rest source
  136. - task: AzureFunction@1
  137. displayName: 'Publishing to rest source'
  138. inputs:
  139. function: '$(RestSourceUpdateEndpointSecret)'
  140. key: '$(HostKeySecret)'
  141. body: |
  142. {
  143. "operationId": "$(Build.BuildNumber)",
  144. "BuildId": "$(Build.BuildId)",
  145. "PlanUrl": "$(system.CollectionUri)",
  146. "HubName": "$(system.HostType)",
  147. "pipelineType": "CommitPipeline",
  148. "ProjectId": "$(system.TeamProjectId)",
  149. "PlanId": "$(system.PlanId)",
  150. "JobId": "$(system.JobId)",
  151. "TimelineId": "$(system.TimelineId)",
  152. "TaskInstanceId": "$(system.TaskInstanceId)",
  153. "AuthToken": "$(system.AccessToken)"
  154. }
  155. waitForCompletion: "true"
  156. # Agentless phase. Depends on previous job.
  157. - job: 'PostPublish'
  158. pool: server
  159. timeoutInMinutes: 1500
  160. displayName: 'Post publish'
  161. dependsOn:
  162. - 'CommitProcessing'
  163. - 'Publish'
  164. - 'PublishToRestSource'
  165. condition: and(succeeded(), ne(variables['Source.SkipPostPublish'], 'true'))
  166. variables:
  167. HostKeySecret: $[ dependencies.CommitProcessing.outputs['wingetsetup.hostkey']]
  168. CleanEndpointSecret: $[ dependencies.CommitProcessing.outputs['wingetsetup.cleanupEndpoint']]
  169. ManifestPublishCompletionEndPoint: $[ dependencies.CommitProcessing.outputs['wingetsetup.manifestPublishCompletionEndPoint']]
  170. WaiverCommitEndPoint: $[ dependencies.CommitProcessing.outputs['wingetsetup.waiverCommitEndPoint']]
  171. steps:
  172. - task: AzureFunction@1
  173. displayName: 'Waiver Commit'
  174. inputs:
  175. function: '$(WaiverCommitEndPoint)'
  176. key: '$(HostKeySecret)'
  177. body: |
  178. {
  179. "operationId": "$(Build.BuildNumber)",
  180. "BuildId": "$(Build.BuildId)",
  181. "PlanUrl": "$(system.CollectionUri)",
  182. "HubName": "$(system.HostType)",
  183. "pipelineType": "CommitPipeline",
  184. "ProjectId": "$(system.TeamProjectId)",
  185. "PlanId": "$(system.PlanId)",
  186. "JobId": "$(system.JobId)",
  187. "TimelineId": "$(system.TimelineId)",
  188. "TaskInstanceId": "$(system.TaskInstanceId)",
  189. "AuthToken": "$(system.AccessToken)",
  190. "BuildRepositoryId": "$(build.repository.id)"
  191. }
  192. waitForCompletion: "true"
  193. - task: AzureFunction@1
  194. displayName: 'Pull Request Notification'
  195. inputs:
  196. function: '$(ManifestPublishCompletionEndPoint)'
  197. key: '$(HostKeySecret)'
  198. body: |
  199. {
  200. "operationId": "$(Build.BuildNumber)",
  201. "BuildId": "$(Build.BuildId)",
  202. "PlanUrl": "$(system.CollectionUri)",
  203. "HubName": "$(system.HostType)",
  204. "pipelineType": "CommitPipeline",
  205. "ProjectId": "$(system.TeamProjectId)",
  206. "PlanId": "$(system.PlanId)",
  207. "JobId": "$(system.JobId)",
  208. "TimelineId": "$(system.TimelineId)",
  209. "TaskInstanceId": "$(system.TaskInstanceId)",
  210. "AuthToken": "$(system.AccessToken)",
  211. "BuildRepositoryId": "$(build.repository.id)"
  212. }
  213. waitForCompletion: "true"
  214. # Close issues.
  215. - task: AzureFunction@1
  216. displayName: 'Cleanup Issues'
  217. inputs:
  218. function: '$(CleanEndpointSecret)'
  219. key: '$(HostKeySecret)'
  220. body: |
  221. {
  222. "operationId": "$(Build.BuildNumber)",
  223. "BuildId": "$(Build.BuildId)",
  224. "PlanUrl": "$(system.CollectionUri)",
  225. "HubName": "$(system.HostType)",
  226. "pipelineType": "CommitPipeline",
  227. "ProjectId": "$(system.TeamProjectId)",
  228. "PlanId": "$(system.PlanId)",
  229. "JobId": "$(system.JobId)",
  230. "TimelineId": "$(system.TimelineId)",
  231. "TaskInstanceId": "$(system.TaskInstanceId)",
  232. "AuthToken": "$(system.AccessToken)",
  233. "BuildRepositoryId": "$(build.repository.id)"
  234. }
  235. waitForCompletion: "true"