vsts/vsts.yaml (470 lines of code) (raw):

name: $(BuildID)_$(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) # https://docs.microsoft.com/azure/devops/pipelines/process/runtime-parameters parameters: - name: maxParallelJobs displayName: Maximum jobs to run in parallel. Change maxParallel to 1 make OS builds run in serial rather than in parallel. type: number # Reasonable target to avoid throttling and contention with several PRs running. default: 4 - name: jobTimeoutInMinutes displayName: Timeout for each job type: number default: 150 - name: testTargets displayName: The .NET test targets to build and run. 'all' and 'min-matrix' (net6.0) are aggregates of the remaining values. type: string values: - default - all - min-matrix - net8.0 - net6.0 - net4.7.2 default: default variables: # Variables for the buid/test matrix based on the 'testTargets' that turn on/off various test targets specifically or based on the 2 aggregates. ${{ if and(eq(parameters['testTargets'], 'default'), eq(variables['Build.Reason'], 'PullRequest')) }}: allTestTargets: 'False' minMatrix: 'True' ${{ elseif eq(parameters['testTargets'], 'default') }}: allTestTargets: 'True' minMatrix: 'True' ${{ else }}: allTestTargets: ${{ contains(parameters['testTargets'], 'all') }} # We wish to run the minimum test matrix targets if 1) directly specified, 2) if all targets was chosen. minMatrix: ${{ or(eq(parameters['testTargets'], 'min-matrix'), eq(variables['allTestTargets'], 'True')) }} # The minimum matrix build/test targets. testNet60: ${{ or(eq(variables['minMatrix'], 'True'), contains(parameters['testTargets'], 'net6.0')) }} # The remaining build/test targets. testNet80: ${{ or(eq(variables['allTestTargets'], 'True'), contains(parameters['testTargets'], 'net8.0')) }} testNet472: ${{ or(eq(variables['allTestTargets'], 'True'), contains(parameters['testTargets'], 'net4.7.2')) }} trigger: batch: true branches: include: - main paths: exclude: - docs/* - tools/CaptureLogs/* - iothub/device/devdoc/* - iothub/service/devdoc/* resources: - repo: self clean: true jobs: ### Linux build ### - job: LINUX displayName: Linux condition: succeeded() timeoutInMinutes: ${{ parameters.jobTimeoutInMinutes }} strategy: maxParallel: ${{ parameters.maxParallelJobs }} matrix: .NET 6.0: FRAMEWORK: net6.0 # Can't find a good way to skip matrix elements so for now we set an environment variable that the script will use to bail out. SHOULD_RUN: ${{ eq(variables['testNet60'], 'True') }} .NET 8.0: FRAMEWORK: net8.0 SHOULD_RUN: ${{ eq(variables['testNet80'], 'True') }} pool: # If this is changed, don't forget to update supported_platforms.md in the root directory. That document outlines what OS we test on and should stay up to date. name: 'sdk-net--ubuntu-20' steps: - task: PowerShell@2 displayName: 'Print vars' inputs: targetType: inline script: | Write-Host "Build.Reason: ${{ variables['Build.Reason'] }}" Write-Host "jobTimeoutInMinutes: ${{ parameters.jobTimeoutInMinutes }}" Write-Host "maxParallelJobs: ${{ parameters.maxParallelJobs }}" Write-Host "minMatrix: ${{ variables.minMatrix }}" Write-Host "testNet60: ${{ variables.testNet60 }}" Write-Host "testNet80: ${{ variables.testNet80 }}" Write-Host "testNetcore31: ${{ variables.testNetcore31 }}" Write-Host "testNetcore21: ${{ variables.testNetcore21 }}" Write-Host "testNet472: ${{ variables.testNet472 }}" # https://docs.microsoft.com/azure/devops/pipelines/tasks/tool/dotnet-core-tool-installer?view=azure-devops # Linux requires .NET 8.0 install for tests to run, no matter which framework target is being tested - task: UseDotNet@2 displayName: 'Use .NET SDK 8.0' inputs: packageType: sdk version: 8.x performMultiLevelLookup: true installationPath: $(Agent.ToolsDirectory)/dotnet - ${{ if eq(variables['testNet60'], 'True') }}: - task: UseDotNet@2 displayName: 'Use .NET SDK 6.0' inputs: packageType: sdk version: 6.x performMultiLevelLookup: true installationPath: $(Agent.ToolsDirectory)/dotnet - task: Docker@2 displayName: "Login to ACR" condition: eq(variables.SHOULD_RUN, 'True') inputs: command: "login" containerRegistry: "Azure IoT ACR" - task: PowerShell@2 displayName: 'Cert Validation - Setup Certificate Proxy' condition: eq(variables.SHOULD_RUN, 'True') inputs: targetType: 'inline' script: | Write-Host "============" Write-Host "check docker" Write-Host "============" docker images docker ps -a gci -Path $(Build.SourcesDirectory)/e2e/test/docker -Recurse -Force -Name Write-Host "===========================" Write-Host "uncompress self-signed cert" Write-Host "===========================" gzip -d -N -S ".bin" $(Build.SourcesDirectory)/e2e/test/docker/haproxy/haproxy.bin gci -Path $(Build.SourcesDirectory)/e2e/test/docker -Recurse -Force -Name Write-Host "=====================" Write-Host "Docker run containers" Write-Host "=====================" docker run -h invalidcertgde1.westus.cloudapp.azure.com --name invalid-gde --expose=443 --expose=5671 --expose=8883 -v $(Build.SourcesDirectory)/e2e/test/docker/haproxy:/usr/local/etc/haproxy:ro -d aziotacr.azurecr.io/haproxy haproxy -f /usr/local/etc/haproxy/haproxygde.cfg docker run -h invalidcertdps1.westus.cloudapp.azure.com --name invalid-dps --expose=443 --expose=5671 --expose=8883 -v $(Build.SourcesDirectory)/e2e/test/docker/haproxy:/usr/local/etc/haproxy:ro -d aziotacr.azurecr.io/haproxy haproxy -f /usr/local/etc/haproxy/haproxydps.cfg docker run -h invalidcertiothub1.westus.cloudapp.azure.com --name invalid-hub --expose=443 --expose=5671 --expose=8883 -v $(Build.SourcesDirectory)/e2e/test/docker/haproxy:/usr/local/etc/haproxy:ro -d aziotacr.azurecr.io/haproxy haproxy -f /usr/local/etc/haproxy/haproxyhub.cfg docker ps -a - task: Bash@3 displayName: 'Cert Validation - Setup local hostname' name: CVTEST_NET condition: eq(variables.SHOULD_RUN, 'True') inputs: targetType: 'inline' script: | echo "===============" echo "Inspect network" echo "===============" ip -4 addr export CVTEST_HOST_IP=$(ip -4 addr show eth0 | grep -Po 'inet \K[\d.]+') export CVTEST_HOST_NETWORK=$(ip -4 addr show eth0 | grep -Po 'inet \K[\d.]+/*\d.') export CVTEST_HOST_SUBNET=$(ip -4 addr show eth0 | grep -Po 'inet \K[\d.]+' | grep -Po '[\d]{1,3}.[\d]{1,3}.[\d]{1,3}') export CVTEST_HOST_SUBNET_MASK=$(ip -4 addr show eth0 | grep -Po 'inet \K[\d.]+/*\d.' | grep -Po '/[\d]{1,2}') export CVTEST_CONTAINER_IP=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+') echo "HOST=$CVTEST_HOST_IP" echo "HOST NETWORK=$CVTEST_HOST_NETWORK" echo "HOST SUBNET=$CVTEST_HOST_SUBNET" echo "HOST SUBNET MASK=$CVTEST_HOST_SUBNET_MASK" echo "CONTAINER=$CVTEST_CONTAINER_IP" #echo "##vso[task.setvariable variable=AGENT_HOST;isoutput=true;]$CVTEST_HOST_IP" #echo "##vso[task.setvariable variable=AGENT_NETWORK;isoutput=true;]$CVTEST_HOST_NETWORK" #echo "##vso[task.setvariable variable=AGENT_SUBNET;isoutput=true;]$CVTEST_HOST_SUBNET" #echo "##vso[task.setvariable variable=AGENT_SUBNET_MASK;isoutput=true;]$CVTEST_HOST_SUBNET_MASK" #echo "##vso[task.setvariable variable=AGENT_CONTAINER;isoutput=true;]$CVTEST_CONTAINER_IP" export CVTEST_GDE_IP=$(docker inspect invalid-gde | grep -Po -m 1 '"IPAddress": "\K[\d.]+') export CVTEST_DPS_IP=$(docker inspect invalid-dps | grep -Po -m 1 '"IPAddress": "\K[\d.]+') export CVTEST_HUB_IP=$(docker inspect invalid-hub | grep -Po -m 1 '"IPAddress": "\K[\d.]+') echo "invalid-gde=$CVTEST_GDE_IP" echo "invalid-dps=$CVTEST_DPS_IP" echo "invalid-hub=$CVTEST_HUB_IP" #echo "##vso[task.setvariable variable=AGENT_GDE_IP;isoutput=true;]$CVTEST_GDE_IP" #echo "##vso[task.setvariable variable=AGENT_DPS_IP;isoutput=true;]$CVTEST_DPS_IP" #echo "##vso[task.setvariable variable=AGENT_HUB_IP;isoutput=true;]$CVTEST_HUB_IP" echo "=================" echo "Update hosts file" echo "=================" sudo bash -c 'mv /etc/hosts /etc/hosts.org' sudo bash -c 'cp /etc/hosts.org /etc/hosts' echo "$CVTEST_GDE_IP invalidcertgde1.westus.cloudapp.azure.com" echo "$CVTEST_DPS_IP invalidcertdps1.westus.cloudapp.azure.com" echo "$CVTEST_HUB_IP invalidcertiothub1.westus.cloudapp.azure.com" echo "" >> /tmp/hosts.cvtest echo "# Local host for invalid cert test" >> /tmp/hosts.cvtest echo "$CVTEST_GDE_IP invalidcertgde1.westus.cloudapp.azure.com" >> /tmp/hosts.cvtest echo "$CVTEST_DPS_IP invalidcertdps1.westus.cloudapp.azure.com" >> /tmp/hosts.cvtest echo "$CVTEST_HUB_IP invalidcertiothub1.westus.cloudapp.azure.com" >> /tmp/hosts.cvtest sudo bash -c 'cat /tmp/hosts.cvtest >> /etc/hosts' cat /etc/hosts echo "=====================" echo "Ping containers (URL)" echo "=====================" docker ps -a route ping -c 2 invalidcertgde1.westus.cloudapp.azure.com ping -c 2 invalidcertdps1.westus.cloudapp.azure.com ping -c 2 invalidcertiothub1.westus.cloudapp.azure.com - task: Docker@1 displayName: "Start TPM Simulator" condition: eq(variables.SHOULD_RUN, 'True') inputs: containerregistrytype: "Container Registry" command: "Run an image" azureContainerRegistry: aziotacr.azurecr.io imageName: aziotacr.azurecr.io/aziotbld/testtpm containerName: "testtpm-instance" ports: | 127.0.0.1:2321:2321 127.0.0.1:2322:2322 restartPolicy: unlessStopped - task: Docker@1 displayName: "Start Test Proxy" condition: eq(variables.SHOULD_RUN, 'True') inputs: containerregistrytype: "Container Registry" command: "Run an image" azureContainerRegistry: aziotacr.azurecr.io imageName: aziotacr.azurecr.io/aziotbld/testproxy containerName: "testproxy-instance" ports: "127.0.0.1:8888:8888" restartPolicy: unlessStopped - powershell: ./vsts/gatedBuild.ps1 displayName: build condition: eq(variables.SHOULD_RUN, 'True') env: # Environment variables for IoT Hub E2E tests IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING) IOTHUB_DEVICE_CONN_STRING: $(IOTHUB-DEVICE-CONN-STRING) IOTHUB_X509_DEVICE_PFX_CERTIFICATE: $(IOTHUB-X509-DEVICE-PFX-CERTIFICATE) IOTHUB_X509_DEVICE_PFX_THUMBPRINT: $(IOTHUB-X509-DEVICE-PFX-THUMBPRINT) IOTHUB_X509_CHAIN_DEVICE_NAME: $(IOTHUB-X509-CHAIN-DEVICE-NAME) IOTHUB_X509_CHAIN_DEVICE_PFX_CERTIFICATE: $(IOTHUB-X509-CHAIN-DEVICE-PFX-CERTIFICATE) IOTHUB_USER_ASSIGNED_MSI_RESOURCE_ID: $(IOTHUB-USER-ASSIGNED-MSI-RESOURCE-ID) IOT_HUB_SAS_KEY: $(IOTHUB-SAS-KEY) IOT_HUB_SAS_KEY_NAME: $(IOTHUB-SAS-KEY-NAME) # Environment variables for DPS E2E tests DPS_IDSCOPE: $(DPS-IDSCOPE) PROVISIONING_CONNECTION_STRING: $(PROVISIONING-CONNECTION-STRING) DPS_GLOBALDEVICEENDPOINT: $(DPS-GLOBALDEVICEENDPOINT) DPS_X509_PFX_CERTIFICATE_PASSWORD: $(DPS-X509-PFX-CERTIFICATE-PASSWORD) DPS_X509_GROUP_ENROLLMENT_NAME: $(DPS-X509-GROUP-ENROLLMENT-NAME) # Environment variables for Azure resources used for E2E tests (common) X509_CHAIN_ROOT_CA_CERTIFICATE: $(X509-CHAIN-ROOT-CA-CERTIFICATE) X509_CHAIN_INTERMEDIATE1_CERTIFICATE: $(X509-CHAIN-INTERMEDIATE1-CERTIFICATE) X509_CHAIN_INTERMEDIATE2_CERTIFICATE: $(X509-CHAIN-INTERMEDIATE2-CERTIFICATE) X509_CHAIN_INTERMEDIATE2_PFX_CERTIFICATE: $(X509-CHAIN-INTERMEDIATE2-PFX-CERTIFICATE) STORAGE_ACCOUNT_CONNECTION_STRING: $(STORAGE-ACCOUNT-CONNECTION-STRING) MSFT_TENANT_ID: $(MSFT-TENANT-ID) E2E_TEST_AAD_APP_CLIENT_ID: $(E2E-TEST-AAD-APP-CLIENT-ID) E2E_TEST_AAD_APP_CLIENT_SECRET: $(E2E-TEST-AAD-APP-CLIENT-SECRET) E2E_IKEY: $(E2E-IKEY) # Environment variables for the DevOps pipeline PROXY_SERVER_ADDRESS: 127.0.0.1:8888 TARGET_BRANCH: $(System.PullRequest.TargetBranch) FRAMEWORK: $(FRAMEWORK) # Environment variables for invalid certificate tests IOTHUB_DEVICE_CONN_STRING_INVALIDCERT: $(IOTHUB-DEVICE-CONN-STRING-INVALIDCERT) IOTHUB_CONN_STRING_INVALIDCERT: $(IOTHUB-CONN-STRING-INVALIDCERT) DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT) PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT) # Environment variables used by Log Analytics Workspace for Azure Security Center LA_AAD_APP_ID: $(LA-AAD-APP-ID) LA_AAD_APP_CERT_BASE64: $(LA-AAD-APP-CERT-BASE64) LA_WORKSPACE_ID: $(LA-WORKSPACE-ID) # Environment variable for running samples/cleanups PATH_TO_DEVICE_PREFIX_FOR_DELETION_FILE: $(PATH-TO-DEVICE-PREFIX-FOR-DELETION-FILE) PNP_TC_DEVICE_CONN_STRING: $(PNP-TC-DEVICE-CONN-STRING) PNP_THERMOSTAT_DEVICE_CONN_STRING: $(PNP-THERMOSTAT-DEVICE-CONN-STRING) DPS_SYMMETRIC_KEY_INDIVIDUAL_ENROLLMENT_REGISTRATION_ID: $(DPS-SYMMETRIC-KEY-INDIVIDUAL-ENROLLMENT-REGISTRATION-ID) DPS_SYMMETRIC_KEY_INDIVIDUAL_ENROLLEMNT_PRIMARY_KEY: $(DPS-SYMMETRIC-KEY-INDIVIDUAL-ENROLLEMNT-PRIMARY-KEY) - task: CopyFiles@2 displayName: "Copy files to the artifacts folder" condition: eq(variables.SHOULD_RUN, 'True') inputs: SourceFolder: "$(Build.SourcesDirectory)" Contents: "**/*.trx" TargetFolder: "$(Build.ArtifactStagingDirectory)" - task: PublishBuildArtifacts@1 displayName: "Publish Artifact: testresults_linux_$(FRAMEWORK)" condition: eq(variables.SHOULD_RUN, 'True') inputs: ArtifactName: testresults_linux_$(FRAMEWORK) - task: PublishTestResults@2 displayName: "Publish Test Results **/*.trx" condition: eq(variables.SHOULD_RUN, 'True') inputs: testRunner: VSTest testRunTitle: "Linux Tests ($(FRAMEWORK)) (Attempt $(System.JobAttempt))" testResultsFiles: "**/*.trx" - task: ComponentGovernanceComponentDetection@0 displayName: Component Governance Detection condition: eq(variables.SHOULD_RUN, 'True') inputs: scanType: 'Register' verbosity: 'Verbose' alertWarningLevel: 'Low' # The task will present a warning, but will not cause the build to fail ### Windows build ### - job: WINDOWS displayName: Windows condition: succeeded() timeoutInMinutes: ${{ parameters.jobTimeoutInMinutes }} strategy: maxParallel: ${{ parameters.maxParallelJobs }} matrix: .NET 6.0: FRAMEWORK: net6.0 SHOULD_RUN: ${{ eq(variables['testNet60'], 'True') }} .NET 8.0: FRAMEWORK: net8.0 SHOULD_RUN: ${{ eq(variables['testNet80'], 'True') }} .NET 4.7.2: FRAMEWORK: net472 SHOULD_RUN: ${{ eq(variables['testNet472'], 'True') }} pool: # If this is changed, don't forget to update supported_platforms.md in the root directory. That document outlines what OS we test on and should stay up to date. name: 'sdk-net--win-vs2022' steps: - task: PowerShell@2 displayName: 'Print vars' condition: eq(variables.SHOULD_RUN, 'True') inputs: targetType: inline script: | Write-Host "Build.Reason: ${{ variables['Build.Reason'] }}" Write-Host "jobTimeoutInMinutes: ${{ parameters.jobTimeoutInMinutes }}" Write-Host "maxParallelJobs: ${{ parameters.maxParallelJobs }}" Write-Host "minMatrix: ${{ variables.minMatrix }}" Write-Host "testNet60: ${{ variables.testNet60 }}" Write-Host "testNet80: ${{ variables.testNet80 }}" Write-Host "testNetcore31: ${{ variables.testNetcore31 }}" Write-Host "testNetcore21: ${{ variables.testNetcore21 }}" Write-Host "testNet472: ${{ variables.testNet472 }}" - ${{ if eq(variables['testNet60'], 'True') }}: - task: UseDotNet@2 displayName: 'Use .NET SDK 6.0' inputs: packageType: sdk version: 6.x performMultiLevelLookup: true installationPath: $(Agent.ToolsDirectory)/dotnet - ${{ if eq(variables['testNet80'], 'True') }}: - task: UseDotNet@2 displayName: 'Use .NET SDK 8.0' inputs: packageType: sdk version: 8.x performMultiLevelLookup: true installationPath: $(Agent.ToolsDirectory)/dotnet - ${{ if eq(variables['testNet472'], 'True') }}: - task: CmdLine@2 displayName: 'Install .NET 4.7.2' inputs: script: 'choco install -y netfx-4.7.2-devpack' - script: | choco install -y squid displayName: "Install Squid" condition: eq(variables.SHOULD_RUN, 'True') - powershell: ./vsts/start_tpm_windows.ps1 displayName: "Start TPM Simulator" condition: eq(variables.SHOULD_RUN, 'True') - powershell: ./vsts/gatedBuild.ps1 displayName: build condition: eq(variables.SHOULD_RUN, 'True') env: # Environment variables for IoT Hub E2E tests IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING) IOTHUB_DEVICE_CONN_STRING: $(IOTHUB-DEVICE-CONN-STRING) IOTHUB_X509_DEVICE_PFX_CERTIFICATE: $(IOTHUB-X509-DEVICE-PFX-CERTIFICATE) IOTHUB_X509_DEVICE_PFX_THUMBPRINT: $(IOTHUB-X509-DEVICE-PFX-THUMBPRINT) IOTHUB_X509_CHAIN_DEVICE_NAME: $(IOTHUB-X509-CHAIN-DEVICE-NAME) IOTHUB_X509_CHAIN_DEVICE_PFX_CERTIFICATE: $(IOTHUB-X509-CHAIN-DEVICE-PFX-CERTIFICATE) IOTHUB_USER_ASSIGNED_MSI_RESOURCE_ID: $(IOTHUB-USER-ASSIGNED-MSI-RESOURCE-ID) IOT_HUB_SAS_KEY: $(IOTHUB-SAS-KEY) IOT_HUB_SAS_KEY_NAME: $(IOTHUB-SAS-KEY-NAME) # Environment variables for DPS E2E tests DPS_IDSCOPE: $(DPS-IDSCOPE) PROVISIONING_CONNECTION_STRING: $(PROVISIONING-CONNECTION-STRING) DPS_GLOBALDEVICEENDPOINT: $(DPS-GLOBALDEVICEENDPOINT) DPS_X509_PFX_CERTIFICATE_PASSWORD: $(DPS-X509-PFX-CERTIFICATE-PASSWORD) DPS_X509_GROUP_ENROLLMENT_NAME: $(DPS-X509-GROUP-ENROLLMENT-NAME) # Environment variables for Azure resources used for E2E tests (common) X509_CHAIN_ROOT_CA_CERTIFICATE: $(X509-CHAIN-ROOT-CA-CERTIFICATE) X509_CHAIN_INTERMEDIATE1_CERTIFICATE: $(X509-CHAIN-INTERMEDIATE1-CERTIFICATE) X509_CHAIN_INTERMEDIATE2_CERTIFICATE: $(X509-CHAIN-INTERMEDIATE2-CERTIFICATE) X509_CHAIN_INTERMEDIATE2_PFX_CERTIFICATE: $(X509-CHAIN-INTERMEDIATE2-PFX-CERTIFICATE) STORAGE_ACCOUNT_CONNECTION_STRING: $(STORAGE-ACCOUNT-CONNECTION-STRING) MSFT_TENANT_ID: $(MSFT-TENANT-ID) E2E_TEST_AAD_APP_CLIENT_ID: $(E2E-TEST-AAD-APP-CLIENT-ID) E2E_TEST_AAD_APP_CLIENT_SECRET: $(E2E-TEST-AAD-APP-CLIENT-SECRET) E2E_IKEY: $(E2E-IKEY) # Environment variables for the DevOps pipeline PROXY_SERVER_ADDRESS: 127.0.0.1:3128 TARGET_BRANCH: $(System.PullRequest.TargetBranch) FRAMEWORK: $(FRAMEWORK) # Environment variables for invalid certificate tests IOTHUB_DEVICE_CONN_STRING_INVALIDCERT: $(IOTHUB-DEVICE-CONN-STRING-INVALIDCERT) IOTHUB_CONN_STRING_INVALIDCERT: $(IOTHUB-CONN-STRING-INVALIDCERT) DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT) PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT) # Environment variables used by Log Analytics Workspace for Azure Security Center LA_AAD_APP_ID: $(LA-AAD-APP-ID) LA_AAD_APP_CERT_BASE64: $(LA-AAD-APP-CERT-BASE64) LA_WORKSPACE_ID: $(LA-WORKSPACE-ID) # Environment variable for running samples/cleanups PATH_TO_DEVICE_PREFIX_FOR_DELETION_FILE: $(PATH-TO-DEVICE-PREFIX-FOR-DELETION-FILE) PNP_TC_DEVICE_CONN_STRING: $(PNP-TC-DEVICE-CONN-STRING) PNP_THERMOSTAT_DEVICE_CONN_STRING: $(PNP-THERMOSTAT-DEVICE-CONN-STRING) DPS_SYMMETRIC_KEY_INDIVIDUAL_ENROLLMENT_REGISTRATION_ID: $(DPS-SYMMETRIC-KEY-INDIVIDUAL-ENROLLMENT-REGISTRATION-ID) DPS_SYMMETRIC_KEY_INDIVIDUAL_ENROLLEMNT_PRIMARY_KEY: $(DPS-SYMMETRIC-KEY-INDIVIDUAL-ENROLLEMNT-PRIMARY-KEY) - task: CopyFiles@2 displayName: "Copy TRX files to the artifacts folder" condition: eq(variables.SHOULD_RUN, 'True') inputs: SourceFolder: "$(Build.SourcesDirectory)" Contents: "**/*.trx" TargetFolder: "$(Build.ArtifactStagingDirectory)" - task: CopyFiles@2 displayName: "Copy ETL files to the artifacts folder" condition: eq(variables.SHOULD_RUN, 'True') inputs: SourceFolder: "$(Build.SourcesDirectory)" Contents: "**/*.etl" TargetFolder: "$(Build.ArtifactStagingDirectory)" - task: PublishBuildArtifacts@1 displayName: "Publish Artifact: testresults" condition: eq(variables.SHOULD_RUN, 'True') inputs: ArtifactName: testresults_windows_$(FRAMEWORK) - task: PublishTestResults@2 displayName: "Publish Test Results **/*.trx" inputs: testRunner: VSTest testResultsFiles: "**/*.trx" testRunTitle: "Windows Tests ($(FRAMEWORK)) (Attempt $(System.JobAttempt))" platform: Windows configuration: "Debug UT + Release E2E ($(FRAMEWORK))" condition: eq(variables.SHOULD_RUN, 'True') - task: ComponentGovernanceComponentDetection@0 displayName: Component Governance Detection condition: eq(variables.SHOULD_RUN, 'True') inputs: scanType: 'Register' verbosity: 'Verbose' alertWarningLevel: 'Low' # The task will present a warning, but will not cause the build to fail ### .Net SDL Analyzers ### - job: DOTNet_SDL_Analyzers displayName: .Net SDL Analyzers timeoutInMinutes: 60 condition: succeeded() pool: vmImage: windows-2022 steps: - powershell: .\build.ps1 -clean -build -configutaion Debug -package displayName: Build Package - task: ComponentGovernanceComponentDetection@0 displayName: "Component Detection" - task: securedevelopmentteam.vss-secure-development-tools.build-task-policheck.PoliCheck@2 displayName: "Run PoliCheck" inputs: targetType: F optionsRulesDBPath: '$(Build.SourcesDirectory)\vsts\PolicheckExclusionsDB.mdb' optionsSEV: '1|2|3|4' optionsPE: 1 - task: securedevelopmentteam.vss-secure-development-tools.build-task-antimalware.AntiMalware@4 displayName: "Run MpCmdRun.exe" inputs: EnableServices: true SignatureFreshness: OneDay # Signature refreshes on Hosted Agents can sometimes have a delay of a day or two. # The support team already has a process to address this, so our pipeline can treat stale signatures as warnings (instead of treating it as an error). TreatStaleSignatureAs: Warning - task: securedevelopmentteam.vss-secure-development-tools.build-task-binskim.BinSkim@3 displayName: "Run BinSkim" inputs: arguments: 'analyze $(Build.SourcesDirectory)\Microsoft.Azure.Devices.*.dll --recurse --verbose' # TODO #181 Config issue: must run on Debug builds only with valid PDBs. enabled: false - task: securedevelopmentteam.vss-secure-development-tools.build-task-codemetrics.CodeMetrics@1 displayName: "Run CodeMetrics" inputs: Files: '$(Build.SourcesDirectory)\**\Microsoft.Azure.Devices.*.dll' # TODO #181 Config issue: must run on Debug builds only with valid PDBs. enabled: false - task: securedevelopmentteam.vss-secure-development-tools.build-task-credscan.CredScan@3 displayName: "Run CredScan" inputs: toolMajorVersion: V2 suppressionsFile: vsts/CredScanSuppressions.json regexMatchTimeoutInSeconds: 5 # TODO #181 Samples / tests fail the test due to fake connection strings. debugMode: false - task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@3 displayName: "Publish Security Analysis Logs" - task: securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@2 displayName: "Create Security Analysis Report" inputs: AllTools: true - task: ComponentGovernanceComponentDetection@0 displayName: Component Governance Detection inputs: scanType: 'Register' verbosity: 'Verbose' alertWarningLevel: 'Low' # The task will present a warning, but will not cause the build to fail condition: always() - task: securedevelopmentteam.vss-secure-development-tools.build-task-uploadtotsa.TSAUpload@2 displayName: 'TSA upload' inputs: GdnPublishTsaOnboard: false GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)/vsts/TsaUploadConfigFile.json' GdnPublishTsaExportedResultsPublishable: true - task: securedevelopmentteam.vss-secure-development-tools.build-task-postanalysis.PostAnalysis@1 displayName: "Post Analysis" inputs: AllTools: true # TODO #181 Enable post analysis to break builds after all above items are enabled. enabled: false # END: SDL and Compliance tasks #