@@ -280,3 +280,80 @@ stages:
280280        artifactName : Test Results - Localization With Emulator - macOS-$(System.JobPositionInPhase) 
281281
282282    - template : yaml-templates/fail-on-issue.yaml 
283+ 
284+ 
285+ - stage : compliance_scan 
286+   displayName : Compliance 
287+   dependsOn : mac_build 
288+   jobs :
289+   - job : api_scan 
290+     displayName : API Scan 
291+     pool :
292+       name : Azure Pipelines 
293+       vmImage : windows-2022 
294+     timeoutInMinutes : 480 
295+     workspace :
296+       clean : all 
297+     variables :
298+     - name : ApiScan.Enabled 
299+       value : true 
300+     steps :
301+     - template : yaml-templates/setup-test-environment.yaml 
302+       parameters :
303+         installApkDiff : false 
304+         installLegacyDotNet : false 
305+         restoreNUnitConsole : false 
306+         updateMono : false 
307+ 
308+     # ## Copy .dll and .pdb files for APIScan
309+     - task : CopyFiles@2 
310+       displayName : Collect Files for APIScan 
311+       inputs :
312+         Contents : $(System.DefaultWorkingDirectory)\bin\$(XA.Build.Configuration)\dotnet\packs\Microsoft.Android*\**\?(*.dll|*.pdb) 
313+         TargetFolder : $(Build.StagingDirectory)\apiscan 
314+         OverWrite : true 
315+         flattenFolders : true 
316+       condition : and(succeeded(), eq(variables['ApiScan.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) 
317+ 
318+     - pwsh : Get-ChildItem -Path "$(Build.StagingDirectory)\apiscan" -Recurse 
319+       displayName : List Files for APIScan 
320+       condition : and(succeeded(), eq(variables['ApiScan.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) 
321+ 
322+     # ## Run latest version of APIScan listed at https://www.1eswiki.com/wiki/APIScan_Build_Task
323+     - task : APIScan@2 
324+       displayName : Run APIScan 
325+       inputs :
326+         softwareFolder : $(Build.StagingDirectory)\apiscan 
327+         symbolsFolder : ' SRV*http://symweb;$(Build.StagingDirectory)\apiscan' 
328+         softwareName : $(ApiScanName) 
329+         softwareVersionNum : $(Build.SourceBranchName)-$(Build.SourceVersion)-$(Rev:r) 
330+         isLargeApp : true 
331+         toolVersion : Latest 
332+       condition : and(succeeded(), eq(variables['ApiScan.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) 
333+       env :
334+         AzureServicesAuthConnectionString : runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) 
335+ 
336+     - task : SdtReport@2 
337+       displayName : Guardian Export - Security Report 
338+       inputs :
339+         GdnExportAllTools : false 
340+         GdnExportGdnToolApiScan : true 
341+         GdnExportOutputSuppressionFile : source.gdnsuppress 
342+       condition : and(succeededOrFailed(), eq(variables['ApiScan.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) 
343+ 
344+     - task : PublishSecurityAnalysisLogs@3 
345+       displayName : Publish Guardian Artifacts 
346+       inputs :
347+         ArtifactName : APIScan Logs 
348+         ArtifactType : Container 
349+         AllTools : false 
350+         APIScan : true 
351+         ToolLogsNotFoundAction : Warning 
352+       condition : and(succeededOrFailed(), eq(variables['ApiScan.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) 
353+ 
354+     - task : PostAnalysis@2 
355+       displayName : Fail Build on Guardian Issues 
356+       inputs :
357+         GdnBreakAllTools : false 
358+         GdnBreakGdnToolApiScan : true 
359+       condition : and(succeededOrFailed(), eq(variables['ApiScan.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) 
0 commit comments