diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cf86ba553..d360e4358 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -7,15 +7,6 @@ - legacy/* - feature/* - paths: - include: - - '/' - exclude: - - .github/ - # don't trigger the CI if only docs files are changed - - doc/* - - '**/*.md' - pr: branches: include: @@ -25,15 +16,6 @@ pr: - legacy/* - feature/* - paths: - include: - - '/' - exclude: - - .github/ - # don't trigger the CI if only docs files are changed - - doc/* - - '**/*.md' - variables: # Path where packages (nuget or app packages) will be copied to. PackageOutputPath: $(Build.ArtifactStagingDirectory) @@ -49,18 +31,32 @@ variables: # AndroidNdkDirectory: C:\Microsoft\AndroidNDK64\android-ndk-r16b stages: -- stage: Validations - displayName: Validations +- stage: Determine_Changes + displayName: Determine Changes + jobs: + - template: build/stage-determine-changes.yml + +- stage: Docs_Validations + displayName: Docs Validations + dependsOn: Determine_Changes + # Trigger this stage when docs files are changed + condition: or(eq(dependencies.Determine_Changes.outputs['evaluate_changes.DetermineChanges.docsOnly'], 'true'), eq(dependencies.Determine_Changes.outputs['evaluate_changes.DetermineChanges.mixedChanges'], 'true')) jobs: - - template: build/stage-validations.yml + - template: build/stage-docs-validations.yml - stage: Packages - dependsOn: Validations + displayName: Packages + dependsOn: Determine_Changes + # Don't trigger this stage if only docs files are changed + condition: eq(dependencies.Determine_Changes.outputs['evaluate_changes.DetermineChanges.nonDocsOnly'], 'true') jobs: - template: build/stage-build-packages.yml - stage: Build_Samples - dependsOn: Validations + displayName: Build Samples + dependsOn: Determine_Changes + # Don't trigger this stage if only docs files are changed + condition: eq(dependencies.Determine_Changes.outputs['evaluate_changes.DetermineChanges.nonDocsOnly'], 'true') jobs: - template: build/stage-build-ios.yml - template: build/stage-build-android.yml diff --git a/build/stage-determine-changes.yml b/build/stage-determine-changes.yml new file mode 100644 index 000000000..48d28ff44 --- /dev/null +++ b/build/stage-determine-changes.yml @@ -0,0 +1,70 @@ +jobs: +- job: evaluate_changes + displayName: 'Check for Doc Only Changes' + pool: + vmImage: 'ubuntu-latest' + steps: + - powershell: | + # Determine the context of the build (PR or push) and set the target branch accordingly + $prTargetBranch = "$(System.PullRequest.TargetBranch)" + $isPR = -not [string]::IsNullOrWhiteSpace($prTargetBranch) + + # Normalize the target branch name for PR builds or default to 'master' for push builds + $targetBranchName = $isPR ? $prTargetBranch -replace 'refs/heads/', '' : "master" + + Write-Host "Build context determined: $(if ($isPR) { 'Pull Request targeting ' + $targetBranchName } else { 'Push' })" + + # Fetch the target or default base branch and determine the merge base + git fetch origin $targetBranchName + $mergeBase = git merge-base HEAD "origin/$targetBranchName" + Write-Host "Merge base with '$targetBranchName' identified at $mergeBase" + + Write-Host "Comparing changes from $mergeBase..." + $gitDiffCommand = "git diff $mergeBase --name-only" + $changedFiles = Invoke-Expression $gitDiffCommand + $docsOnly = $false + $nonDocsOnly = $false + $mixedChanges = $false + $docFiles = 0 + $nonDocFiles = 0 + + if ($changedFiles) { + Write-Host "Changed files:" + Write-Host $changedFiles + } else { + Write-Host "No files have changed." + } + + foreach ($file in $changedFiles -split "`n") { + if ($file.EndsWith(".md") -or $file -like "*/toc.yml") { + $docFiles++ + } else { + $nonDocFiles++ + } + } + + Write-Host "Documentation files changed: $docFiles" + Write-Host "Non-documentation files changed: $nonDocFiles" + + if ($docFiles -gt 0 -and $nonDocFiles -eq 0) { + $docsOnly = $true + Write-Host "All changes are documentation-only." + } elseif ($docFiles -gt 0 -and $nonDocFiles -gt 0) { + $mixedChanges = $true + Write-Host "Mixed changes detected: Both documentation and non-documentation files have been modified." + } elseif ($nonDocFiles -gt 0) { + $nonDocsOnly = $true + Write-Host "Non-documentation changes detected." + } + + # Explicitly write the final values for clarity + Write-Host "Final values:" + Write-Host "docsOnly: $docsOnly" + Write-Host "nonDocsOnly: $nonDocsOnly" + Write-Host "mixedChanges: $mixedChanges" + + # Output the results as pipeline variables + Write-Host "##vso[task.setvariable variable=docsOnly;isOutput=true]$docsOnly" + Write-Host "##vso[task.setvariable variable=nonDocsOnly;isOutput=true]$nonDocsOnly" + Write-Host "##vso[task.setvariable variable=mixedChanges;isOutput=true]$mixedChanges" + name: DetermineChanges \ No newline at end of file diff --git a/build/stage-validations.yml b/build/stage-docs-validations.yml similarity index 100% rename from build/stage-validations.yml rename to build/stage-docs-validations.yml