268 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| # Validation pipeline for manifest on pull requests.
 | |
| 
 | |
| # Name of the run
 | |
| name: '$(Build.DefinitionName)-$(Build.DefinitionVersion)-$(System.PullRequest.PullRequestNumber)-$(Date:yyyyMMdd)-$(Rev:r)'
 | |
| 
 | |
| trigger: none
 | |
| pr: none
 | |
| 
 | |
| jobs:
 | |
| 
 | |
| # Agent phase. Process pull request changes and validate manifests.
 | |
| - job: 'FileValidation'
 | |
|   displayName: 'Pull Request Validation'
 | |
|   pool:
 | |
|     vmImage: 'windows-latest'
 | |
|   variables:
 | |
|     skipComponentGovernanceDetection: ${{ true }}
 | |
|     runCodesignValidationInjection: ${{ false }}
 | |
|   steps:
 | |
| 
 | |
|   # Downloads all the setup files and its dependencies.
 | |
|   - task: AzureCLI@1
 | |
|     displayName: 'Azure Setup'
 | |
|     inputs:
 | |
|       azureSubscription: '$(WinGet.Subscription)'
 | |
|       scriptLocation: inlineScript
 | |
|       inlineScript: 'az storage blob download-batch -d . --pattern * -s servicewrapper --output none'
 | |
|     env:
 | |
|       AZURE_STORAGE_CONNECTION_STRING: $(ValidationStorageAccountConnectionString)
 | |
| 
 | |
|   # WinGet setup
 | |
|   - script: 'winget_validation_setup.cmd'
 | |
|     name: 'wingetsetup'
 | |
|     displayName: 'WinGet Setup'
 | |
|     workingDirectory: scripts
 | |
|     env:
 | |
|       HOST_KEY: $(AzureFunctionHostKey)
 | |
|       SMART_SCREEN_ENDPOINT: $(AzFuncSmartScreenEndpoint)
 | |
|       DOMAIN_URLS_VALIDATION_ENDPOINT: $(AzFuncDomainUrlValEndpoint)
 | |
|       MANIFEST_POLICY_ENDPOINT: $(AzFuncManifestPolicyEndpoint)
 | |
|       SCAN_ENDPOINT: $(AzFuncScanEndpoint)
 | |
|       INSTALLATION_ENDPOINT: $(AzFuncInstallationVerificationEndpoint)
 | |
|       LABEL_ENDPOINT: $(AzFuncSetLabelOnPullRequestEndpoint)
 | |
|       CLEANUP_ENDPOINT: $(AzFuncCleanupEndpoint)
 | |
|       LABEL_KEY: $(AzureFunctionLabelKey)
 | |
| 
 | |
|   # Validates integrity of pull request.
 | |
|   - task: CmdLine@2
 | |
|     displayName: 'Validate Pull Request'
 | |
|     inputs:
 | |
|       script: 'WinGetSvcWrapper.exe process-pr --operationId %BUILD_BUILDNUMBER%'
 | |
|       failOnStderr: true
 | |
|     condition: succeeded()
 | |
|     env:
 | |
|       ValidationConnectionString: $(ValidationStorageAccountConnectionString)
 | |
|       ExecutionEnvironment: $(ExecutionEnvironment)
 | |
|       DIApplicationInsightKey: $(DIApplicationInsightKey)
 | |
|       WinGet:AppConfig:Primary: $(AppConfigPrimary)
 | |
|       WinGet:AppConfig:Secondary: $(AppConfigSecondary)
 | |
| 
 | |
|   # Validates manifest integrity.
 | |
|   - task: CmdLine@2
 | |
|     displayName: 'Validate Manifest'
 | |
|     inputs:
 | |
|       script: 'WinGetSvcWrapper.exe validate-manifests --operationId %BUILD_BUILDNUMBER%'
 | |
|       failOnStderr: true
 | |
|     condition: succeeded()
 | |
|     env:
 | |
|       ValidationConnectionString: $(ValidationStorageAccountConnectionString)
 | |
|       DIApplicationInsightKey: $(DIApplicationInsightKey)
 | |
|       WinGet:AppConfig:Primary: $(AppConfigPrimary)
 | |
|       WinGet:AppConfig:Secondary: $(AppConfigSecondary)
 | |
| 
 | |
| # Agentless phase. Depends on previous job.
 | |
| - job: 'ContentValidation'
 | |
|   pool: server
 | |
|   displayName: 'Manifest Content Validation'
 | |
|   timeoutInMinutes: 1500
 | |
|   dependsOn:
 | |
|     - 'FileValidation'
 | |
|   variables:
 | |
|     HostKeySecret: $[ dependencies.FileValidation.outputs['wingetsetup.hostkey']]
 | |
|     SmartScreenEndpointSecret: $[ dependencies.FileValidation.outputs['wingetsetup.smartScreenEndpoint']]
 | |
|     DomainUrlValidationEndpointSecret: $[ dependencies.FileValidation.outputs['wingetsetup.domainUrlValidationEndpoint']]
 | |
|     ManiestPolicyEndpointSecret: $[ dependencies.FileValidation.outputs['wingetsetup.manifestPolicyEndpoint']]
 | |
|   steps:
 | |
| 
 | |
|   # Scans all the urls from manifest contents.
 | |
|   - task: AzureFunction@1
 | |
|     displayName: 'URLs Validation'
 | |
|     inputs:
 | |
|       function: '$(SmartScreenEndpointSecret)'
 | |
|       key: '$(HostKeySecret)'
 | |
|       body: |
 | |
|         {
 | |
|         "operationId": "$(Build.BuildNumber)",
 | |
|         "BuildId": "$(Build.BuildId)",
 | |
|         "PlanUrl": "$(system.CollectionUri)",
 | |
|         "HubName": "$(system.HostType)",
 | |
|         "ProjectId": "$(system.TeamProjectId)",
 | |
|         "PlanId": "$(system.PlanId)", 
 | |
|         "JobId": "$(system.JobId)", 
 | |
|         "TimelineId": "$(system.TimelineId)", 
 | |
|         "TaskInstanceId": "$(system.TaskInstanceId)",
 | |
|         "AuthToken": "$(system.AccessToken)"
 | |
|         }
 | |
|       waitForCompletion: "true"
 | |
| 
 | |
|   # Domain url validations.
 | |
|   - task: AzureFunction@1
 | |
|     displayName: 'URL Domain validation'
 | |
|     inputs:
 | |
|       function: '$(DomainUrlValidationEndpointSecret)'
 | |
|       key: '$(HostKeySecret)'
 | |
|       body: |
 | |
|         {
 | |
|         "operationId": "$(Build.BuildNumber)",
 | |
|         "BuildId": "$(Build.BuildId)",
 | |
|         "PlanUrl": "$(system.CollectionUri)",
 | |
|         "HubName": "$(system.HostType)",
 | |
|         "ProjectId": "$(system.TeamProjectId)",
 | |
|         "PlanId": "$(system.PlanId)", 
 | |
|         "JobId": "$(system.JobId)", 
 | |
|         "TimelineId": "$(system.TimelineId)", 
 | |
|         "TaskInstanceId": "$(system.TaskInstanceId)",
 | |
|         "AuthToken": "$(system.AccessToken)"
 | |
|         }
 | |
|       waitForCompletion: "true"
 | |
| 
 | |
|   # Manifest policy checks.
 | |
|   - task: AzureFunction@1
 | |
|     displayName: 'Manifest Policy Validation'
 | |
|     inputs:
 | |
|       function: '$(ManiestPolicyEndpointSecret)'
 | |
|       key: '$(HostKeySecret)'
 | |
|       body: |
 | |
|         {
 | |
|         "operationId": "$(Build.BuildNumber)",
 | |
|         "BuildId": "$(Build.BuildId)",
 | |
|         "PlanUrl": "$(system.CollectionUri)",
 | |
|         "HubName": "$(system.HostType)",
 | |
|         "ProjectId": "$(system.TeamProjectId)",
 | |
|         "PlanId": "$(system.PlanId)", 
 | |
|         "JobId": "$(system.JobId)", 
 | |
|         "TimelineId": "$(system.TimelineId)", 
 | |
|         "TaskInstanceId": "$(system.TaskInstanceId)",
 | |
|         "AuthToken": "$(system.AccessToken)"
 | |
|         }
 | |
|       waitForCompletion: "true"
 | |
| 
 | |
| # Agentless phase. Depends on previous job.
 | |
| - job: 'InstallerValidation'
 | |
|   pool: server
 | |
|   displayName: 'Installer Validation'
 | |
|   timeoutInMinutes: 1500
 | |
|   dependsOn:
 | |
|     - 'FileValidation'
 | |
|     - 'ContentValidation'
 | |
|   variables:
 | |
|     HostKeySecret: $[ dependencies.FileValidation.outputs['wingetsetup.hostkey']]
 | |
|     ScanEndpointSecret: $[ dependencies.FileValidation.outputs['wingetsetup.scanEndpoint']]
 | |
|     InstallationEndpointSecret: $[ dependencies.FileValidation.outputs['wingetsetup.installationEndpoint']]
 | |
|   steps:
 | |
| 
 | |
|   # Scan installers in manifests.
 | |
|   - task: AzureFunction@1
 | |
|     displayName: 'Installers Scan'
 | |
|     inputs:
 | |
|       function: '$(ScanEndpointSecret)'
 | |
|       key: '$(HostKeySecret)'
 | |
|       body: |
 | |
|         {
 | |
|         "operationId": "$(Build.BuildNumber)",
 | |
|         "BuildId": "$(Build.BuildId)",
 | |
|         "PlanUrl": "$(system.CollectionUri)",
 | |
|         "HubName": "$(system.HostType)",
 | |
|         "ProjectId": "$(system.TeamProjectId)",
 | |
|         "PlanId": "$(system.PlanId)", 
 | |
|         "JobId": "$(system.JobId)", 
 | |
|         "TimelineId": "$(system.TimelineId)", 
 | |
|         "TaskInstanceId": "$(system.TaskInstanceId)",
 | |
|         "AuthToken": "$(system.AccessToken)"
 | |
|         }
 | |
|       waitForCompletion: "true"
 | |
| 
 | |
|   # Validates installation.
 | |
|   - task: AzureFunction@1
 | |
|     displayName: 'Installation Validation'
 | |
|     inputs:
 | |
|       function: '$(InstallationEndpointSecret)'
 | |
|       key: '$(HostKeySecret)'
 | |
|       body: |
 | |
|         {
 | |
|         "operationId": "$(Build.BuildNumber)",
 | |
|         "BuildId": "$(Build.BuildId)",
 | |
|         "PlanUrl": "$(system.CollectionUri)",
 | |
|         "HubName": "$(system.HostType)",
 | |
|         "ProjectId": "$(system.TeamProjectId)",
 | |
|         "PlanId": "$(system.PlanId)", 
 | |
|         "JobId": "$(system.JobId)", 
 | |
|         "TimelineId": "$(system.TimelineId)", 
 | |
|         "TaskInstanceId": "$(system.TaskInstanceId)",
 | |
|         "AuthToken": "$(system.AccessToken)"
 | |
|         }
 | |
|       waitForCompletion: "true"
 | |
| 
 | |
| # Agentless phase. Runs even if previous jobs failed. 
 | |
| - job: 'postvalidation'
 | |
|   pool: server
 | |
|   displayName: 'Post Validation'
 | |
|   dependsOn:
 | |
|     - 'FileValidation'
 | |
|     - 'ContentValidation'
 | |
|     - 'InstallerValidation'
 | |
|   condition: succeededOrFailed()
 | |
|   variables:
 | |
|     HostKeySecret: $[ dependencies.FileValidation.outputs['wingetsetup.hostkey']]
 | |
|     LabelKeySecret : $[ dependencies.FileValidation.outputs['wingetsetup.labelkey']]
 | |
|     LabelEndpointSecret: $[ dependencies.FileValidation.outputs['wingetsetup.labelEndpoint']]
 | |
|     RepositoryId: $[ dependencies.FileValidation.outputs['wingetsetup.repoId']]
 | |
|     CleanupEndpointSecret: $[ dependencies.filevalidation.outputs['wingetsetup.cleanupEndpoint']]
 | |
|   steps:
 | |
| 
 | |
|   # Set label in GitHub PullRequest.
 | |
|   - task: AzureFunction@1
 | |
|     displayName: 'Set Label'
 | |
|     condition: eq(variables['WinGet.RepositoryType'], 'GitHub')
 | |
|     inputs:
 | |
|       function: '$(LabelEndpointSecret)'
 | |
|       key: '$(LabelKeySecret)'
 | |
|       body: |
 | |
|         {
 | |
|         "operationId": "$(Build.BuildNumber)",
 | |
|         "PlanUrl": "$(system.CollectionUri)",
 | |
|         "BuildId": "$(Build.BuildId)",
 | |
|         "HubName": "$(system.HostType)",
 | |
|         "ProjectId": "$(system.TeamProjectId)",
 | |
|         "PlanId": "$(system.PlanId)", 
 | |
|         "JobId": "$(system.JobId)", 
 | |
|         "TimelineId": "$(system.TimelineId)", 
 | |
|         "TaskInstanceId": "$(system.TaskInstanceId)",
 | |
|         "AuthToken": "$(system.AccessToken)",
 | |
|         "BuildRepositoryId": "$(RepositoryId)",
 | |
|         "PullRequestNumber": "$(System.PullRequest.PullRequestNumber)",
 | |
|         }
 | |
|       waitForCompletion: "true"
 | |
| 
 | |
|   # Cleanup resources.
 | |
|   - task: AzureFunction@1
 | |
|     displayName: 'Validation cleanup'
 | |
|     inputs:
 | |
|       function: '$(CleanupEndpointSecret)'
 | |
|       key: '$(HostKeySecret)'
 | |
|       body: |
 | |
|         {
 | |
|         "operationId": "$(Build.BuildNumber)",
 | |
|         "PlanUrl": "$(system.CollectionUri)",
 | |
|         "BuildId": "$(Build.BuildId)",
 | |
|         "HubName": "$(system.HostType)",
 | |
|         "ProjectId": "$(system.TeamProjectId)",
 | |
|         "PlanId": "$(system.PlanId)", 
 | |
|         "JobId": "$(system.JobId)", 
 | |
|         "TimelineId": "$(system.TimelineId)", 
 | |
|         "TaskInstanceId": "$(system.TaskInstanceId)",
 | |
|         "AuthToken": "$(system.AccessToken)"
 | |
|         }
 | |
|       waitForCompletion: "true"
 |