Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: Adjust CI Build for Doc-Only PRs validations #1374

Merged
merged 3 commits into from
Apr 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 19 additions & 23 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)
Expand All @@ -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
Expand Down
71 changes: 71 additions & 0 deletions build/stage-determine-changes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
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") {
$isDoc = $file.StartsWith("doc/") -or ($file -match "^[^/]+\.md$") -or ($file -match "^\.github/.*\.md$")

if ($isDoc) {
$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
File renamed without changes.
Loading