vsts/windowsLinuxAndAndroidBuildMatrixConfig.yaml (373 lines of code) (raw):

name: $(BuildID)_$(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) trigger: batch: true branches: include: - main paths: exclude: - doc/* - device/iot-device-samples/* - service/iot-service-samples/* - provisioning/provisioning-samples/* variables: # Run JDK 8 + 11 in parallel if it is a pull request, but in serial otherwise ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: maxParallel: 2 ${{ else }}: maxParallel: 1 jobs: ### Windows ### - job: Windows timeoutInMinutes: 180 strategy: maxParallel: $[variables.maxParallel] matrix: JDK 11: # always run Java 11 JAVA_VERSION: 11 JDK 8: # only run Java 8 in nightly or CI builds. JAVA_VERSION: 8 pool: vmImage: windows-latest displayName: Windows steps: - powershell: ./vsts/echo_versions.ps1 displayName: 'Echo Versions' env: JAVA_VERSION: $(JAVA_VERSION) COMMIT_FROM: $(COMMIT_FROM) - powershell: ./vsts/start_tpm_windows.ps1 displayName: 'Start TPM Simulator' env: COMMIT_FROM: $(COMMIT_FROM) - powershell: ./vsts/build_repo.ps1 displayName: 'Build and Test' env: JAVA_VERSION: $(JAVA_VERSION) IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING) IOT_DPS_ID_SCOPE: $(IOT-DPS-ID-SCOPE) IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING) DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT) PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT) IS_BASIC_TIER_HUB: $(IS-BASIC-TIER-HUB) TARGET_BRANCH: $(System.PullRequest.TargetBranch) RECYCLE_TEST_IDENTITIES: true - task: CopyFiles@2 displayName: 'Copy Test Results to Artifact Staging Directory' inputs: SourceFolder: '$(Build.SourcesDirectory)' Contents: | **/*.trx **/*.xml TargetFolder: '$(Build.ArtifactStagingDirectory)' continueOnError: true - task: CopyFiles@2 displayName: 'Copy Build Results to Artifact Staging Directory' condition: always() inputs: flattenFolders: true SourceFolder: '$(Build.SourcesDirectory)' Contents: | **/target/*.jar **/target/*.pom !**/target/*-sources.jar !**/target/*-javadoc.jar !**/target/dice-* !**/target/provisioning-x509-cert-generator* !**/target/*emulator* !**/*sample*/**/target/** !**/*test*/**/target/** TargetFolder: '$(Build.ArtifactStagingDirectory)/buildOutput' continueOnError: true - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 displayName: 'Generate SBOM for Build Artifacts' condition: always() inputs: BuildDropPath: '$(Build.ArtifactStagingDirectory)/buildOutput' - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact Staging Directory' condition: always() continueOnError: true - task: PublishTestResults@2 displayName: 'Publish Test Results' condition: always() inputs: mergeTestResults: true testRunTitle: "Windows JDK $(JAVA_VERSION) (Attempt $(System.JobAttempt))" continueOnError: true - task: ComponentGovernanceComponentDetection@0 displayName: Component Governance Detection condition: always() inputs: scanType: 'Register' verbosity: 'Verbose' alertWarningLevel: 'Low' # The task will present a warning, but will not cause the build to fail ### Linux ### - job: Linux timeoutInMinutes: 180 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' displayName: Linux strategy: maxParallel: $[variables.maxParallel] matrix: JDK 11: # always run Java 11 JAVA_VERSION: 11 JDK 8: # only run Java 8 in nightly or CI builds. JAVA_VERSION: 8 steps: - task: CmdLine@2 displayName: 'Print Linux version' inputs: script: 'cat /etc/*release' - powershell: ./vsts/echo_versions.ps1 displayName: 'Echo Versions' env: JAVA_VERSION: $(JAVA_VERSION) COMMIT_FROM: $(COMMIT_FROM) - task : Docker@2 displayName: "Login to ACR" inputs: command: "login" containerRegistry: "Azure IoT ACR" - task: PowerShell@2 displayName: 'Cert Validation - Setup Certificate Proxy' inputs: targetType: 'inline' script: | Write-Host "============" Write-Host "check docker" Write-Host "============" docker images docker ps -a gci -Path $(Build.SourcesDirectory)/iot-e2e-tests/docker -Recurse -Force -Name Write-Host "===========================" Write-Host "uncompress self-signed cert" Write-Host "===========================" gzip -d -N -S ".bin" $(Build.SourcesDirectory)/iot-e2e-tests/docker/haproxy/haproxy.bin gci -Path $(Build.SourcesDirectory)/iot-e2e-tests/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)/iot-e2e-tests/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)/iot-e2e-tests/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)/iot-e2e-tests/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 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' inputs: containerregistrytype: 'Container Registry' command: 'Run an image' imageName: aziotbld/testtpm containerName: 'testtpm-instance' ports: | 127.0.0.1:2321:2321 127.0.0.1:2322:2322 restartPolicy: unlessStopped - powershell: ./vsts/build_repo.ps1 displayName: 'Build and Test' env: JAVA_VERSION: $(JAVA_VERSION) IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING) IOT_DPS_ID_SCOPE: $(IOT-DPS-ID-SCOPE) IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING) DPS_GLOBALDEVICEENDPOINT_INVALIDCERT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT) PROVISIONING_CONNECTION_STRING_INVALIDCERT: $(PROVISIONING-CONNECTION-STRING-INVALIDCERT) IS_BASIC_TIER_HUB: $(IS-BASIC-TIER-HUB) TARGET_BRANCH: $(System.PullRequest.TargetBranch) RECYCLE_TEST_IDENTITIES: true - task: CopyFiles@2 condition: always() displayName: 'Copy Test Results to Artifact Staging Directory' inputs: SourceFolder: '$(Build.SourcesDirectory)' Contents: | **/*.trx **/*.xml TargetFolder: '$(Build.ArtifactStagingDirectory)' continueOnError: true - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact Staging Directory' condition: always() continueOnError: true - task: PublishTestResults@2 displayName: 'Publish Test Results' condition: always() inputs: mergeTestResults: true testRunTitle: "Linux JDK $(JAVA_VERSION) (Attempt $(System.JobAttempt))" continueOnError: true - task: ComponentGovernanceComponentDetection@0 displayName: Component Governance Detection condition: always() inputs: scanType: 'Register' verbosity: 'Verbose' alertWarningLevel: 'Low' # The task will present a warning, but will not cause the build to fail ### Android, Multi configuration build (Multiple different test groups to cover) ### - job: AndroidBuild timeoutInMinutes: 30 pool: vmImage: ubuntu-latest displayName: Android Build steps: - powershell: ./vsts/echo_versions.ps1 displayName: 'Echo Versions' env: COMMIT_FROM: $(COMMIT_FROM) JAVA_VERSION: 8 # Android build doesn't need to run for both JDK 8 and 11 condition: always() - powershell: ./vsts/build_e2e_tests.ps1 displayName: 'E2E Tests Build' condition: always() - powershell: ./vsts/gradle_build.ps1 displayName: 'Gradle Build' env: IOTHUB_CONNECTION_STRING: $(IOTHUB-CONNECTION-STRING) DEVICE_PROVISIONING_SERVICE_ID_SCOPE: $(IOT-DPS-ID-SCOPE) IOT_DPS_CONNECTION_STRING: $(IOT-DPS-CONNECTION-STRING) INVALID_DEVICE_PROVISIONING_SERVICE_GLOBAL_ENDPOINT: $(DPS-GLOBALDEVICEENDPOINT-INVALIDCERT) IS_BASIC_TIER_HUB: $(IS-BASIC-TIER-HUB) TARGET_BRANCH: $(System.PullRequest.TargetBranch) RECYCLE_TEST_IDENTITIES: true condition: always() - task: CopyFiles@2 displayName: 'Copy Test Results to Artifact Staging Directory' inputs: SourceFolder: '$(Build.SourcesDirectory)/iot-e2e-tests/android/app/build/outputs/apk' Contents: | *.* TargetFolder: '$(Build.ArtifactStagingDirectory)' continueOnError: true condition: always() - task: PublishPipelineArtifact@0 displayName: 'Publish APKs to test in next job' inputs: artifactName: 'androidBuildFiles' targetPath: 'iot-e2e-tests/android/app/build/outputs/apk' - 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() - job: AndroidTest timeoutInMinutes: 50 pool: vmImage: 'macOS-latest' strategy: maxParallel: 12 matrix: TestGroup1: ANDROID_TEST_GROUP_ID: TestGroup1 TestGroup2: ANDROID_TEST_GROUP_ID: TestGroup2 TestGroup3: ANDROID_TEST_GROUP_ID: TestGroup3 TestGroup4: ANDROID_TEST_GROUP_ID: TestGroup4 TestGroup5: ANDROID_TEST_GROUP_ID: TestGroup5 TestGroup6: ANDROID_TEST_GROUP_ID: TestGroup6 TestGroup7: ANDROID_TEST_GROUP_ID: TestGroup7 TestGroup8: ANDROID_TEST_GROUP_ID: TestGroup8 TestGroup9: ANDROID_TEST_GROUP_ID: TestGroup9 TestGroup10: ANDROID_TEST_GROUP_ID: TestGroup10 TestGroup11: ANDROID_TEST_GROUP_ID: TestGroup11 TestGroup12: ANDROID_TEST_GROUP_ID: TestGroup12 displayName: Android Test dependsOn: AndroidBuild steps: - task: PowerShell@2 displayName: 'determine if testing needed' condition: always() inputs: targetType: 'filePath' filePath: ./vsts/determine_if_android_test_group_needs_to_run.ps1 env: TEST_GROUP_ID: $(ANDROID_TEST_GROUP_ID) IS_BASIC_TIER_HUB: $(IS-BASIC-TIER-HUB) TARGET_BRANCH: $(System.PullRequest.TargetBranch) - task: DownloadPipelineArtifact@0 displayName: "Download APKs to test from previous job" condition: eq(variables['task.android.needToRunTestGroup'], 'yes') inputs: artifactName: 'androidBuildFiles' targetPath: $(Build.SourcesDirectory)/iot-e2e-tests/android/app/build/outputs/apk - task: Bash@3 condition: eq(variables['task.android.needToRunTestGroup'], 'yes') displayName: 'Start Android Emulator' timeoutInMinutes: 15 continueOnError: false inputs: targetType: 'filePath' filePath: '$(Build.SourcesDirectory)/vsts/StartEmulator.sh' - task: Bash@3 #only run tests on emulator if tests should be run, and if the emulator boot up was successful condition: and(succeeded(), eq(variables['task.android.needToRunTestGroup'], 'yes')) displayName: 'Run tests on emulator' timeoutInMinutes: 45 inputs: targetType: 'filePath' filePath: '$(Build.SourcesDirectory)/vsts/RunTestsOnEmulator.sh' env: TEST_GROUP_ID: $(ANDROID_TEST_GROUP_ID) - 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()