Skip to content

Commit

Permalink
ci: Implement conventional commit validation stage
Browse files Browse the repository at this point in the history
  • Loading branch information
mahdichtioui committed Dec 5, 2024
1 parent 32add29 commit eb222c7
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 3 deletions.
10 changes: 7 additions & 3 deletions .azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,15 @@ variables:
- template: build/variables.yml

stages:
- stage: Commit_Validation
dependsOn: []
jobs:
- template: build/stage-commit-validation.yaml

#-if false
# This special if is used to remove those Dotnet_New stages for generated application.
- stage: Dotnet_New_GeneratedApp
dependsOn: Commit_Validation
jobs:
- template: .template.config/build/stage-donetnew.yaml

Expand Down Expand Up @@ -62,9 +68,7 @@ stages:

#-endif
- stage: Build_Staging
#-if false
dependsOn: []
#-endif
dependsOn: Commit_Validation
jobs:
- template: build/stage-build.yml
parameters:
Expand Down
7 changes: 7 additions & 0 deletions build/stage-commit-validation.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# This stage is responsible for running the template to validate the commits of the PR
jobs:
- job: OnWindows_ValidateCommits
pool:
vmImage : $(windowsHostedAgentImage)
steps:
- template: templates/validate-commits.yaml
46 changes: 46 additions & 0 deletions build/templates/validate-commits.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# This template is used to validate that the commit messages follow the Conventional Commits specification (https://www.conventionalcommits.org/en/v1.0.0/).
# Consider placing this at the beginning of the build pipeline to ensure that the commits are valid before proceeding with longer build steps.
steps:
- task: PowerShell@2
condition: eq(variables['Build.Reason'], 'PullRequest')
inputs:
targetType: 'inline'
script: |
# Pre-Validation Logging
Write-Host "Starting PR Validation..."
Write-Host "Source Branch: $(System.PullRequest.SourceBranch)"
Write-Host "Target Branch: $(System.PullRequest.TargetBranch)"
Write-Host "Pull Request ID: $(System.PullRequest.PullRequestId)"
write-Host "Repository: $(Build.Repository.Name)"
Write-Host "Build.SourceBranch: $(Build.SourceBranch)"
# Fetch commit range
Write-Host "Retrieving commits..."
git fetch origin
Write-Host "Commit Range: origin/$(System.PullRequest.TargetBranch)..origin/$(System.PullRequest.SourceBranch)"
$commits = git log origin/$(System.PullRequest.TargetBranch)..origin/$(System.PullRequest.SourceBranch) --pretty=format:"%H %B"
$commitCount = ($commits | Measure-Object).Count
Write-Host "Commits found: $commitCount"
# Regex pattern for Conventional Commits
$pattern = '^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test){1}(\([\w\.\-]+\))?(!)?: ([\w ])+([\s\S]*)|^(Merged PR \d+: .+)|^(Merge pull request #/d+ from .+)'
Write-Host "Regular Expression: $pattern"
# Validate each commit message
$invalidCommits = @()
foreach ($commit in $commits -split "`n") {
$commitMessage = $commit.Substring($commit.IndexOf(" ") + 1)
Write-Host "Validating commit: $commitMessage"
if ($commitMessage -notmatch $pattern) {
$invalidCommits += $commitMessage
}
}
if($invalidCommits.count -gt 0) {
Write-Error "The following commit messages do no follow the Conventional Commits standard: `n$($invalidCommits -join "`n")"
exit 1
} else {
Write-Host "All commit messages are valid."
}
displayName: 'Validate Commit Messages'

0 comments on commit eb222c7

Please sign in to comment.