rules/AzureDevOps.Repos.Rule.ps1

# PSRule rule definitions for Azure DevOps Repos

# Synopsis: The default branch should have a branch policy
Rule 'Azure.DevOps.Repos.HasBranchPolicy' `
    -Ref 'ADO-RP-001' `
    -Type 'Azure.DevOps.Repo' `
    -Tag @{ release = 'GA'} `
    -Level Warning {
        # Description: The default branch should have a branch policy
        # Reason: The default branch does not have a branch policy
        # Recommendation: Protect your main branch with a branch policy
        $Assert.HasField($TargetObject, "MainBranchPolicy", $true)
        $Assert.NotNull($TargetObject, "MainBranchPolicy")
}

# Synopsis: The branch policy should require a minimum number of reviewers
Rule 'Azure.DevOps.Repos.BranchPolicyMinimumReviewers' `
    -Ref 'ADO-RP-002' `
    -Type 'Azure.DevOps.Repo' `
    -Tag @{ release = 'GA'} `
    -Level Warning {
        # Description: The branch policy should require a minimum number of reviewers
        # Reason: The branch policy does not require any reviewers
        # Recommendation: Require a minimum number of reviewers to approve pull requests
        # Links: https://learn.microsoft.com/en-us/azure/devops/organizations/security/security-best-practices?view=azure-devops#policies
        $Assert.HasField($TargetObject, "MainBranchPolicy.settings.minimumApproverCount", $true)
        $Assert.Greater($TargetObject, "MainBranchPolicy.settings.minimumApproverCount", 0)
}

# Synopsis: The branch policy should not allow creators to approve their own changes
Rule 'Azure.DevOps.Repos.BranchPolicyAllowSelfApproval' `
    -Ref 'ADO-RP-003' `
    -Type 'Azure.DevOps.Repo' `
    -Tag @{ release = 'GA'} `
    -Level Warning {
        # Description: The branch policy should not allow creators to approve their own changes
        # Reason: The branch policy allows creators to approve their own changes
        # Recommendation: Require a minimum number of reviewers to approve pull requests
        # Links: https://learn.microsoft.com/en-us/azure/devops/organizations/security/security-best-practices?view=azure-devops#policies
        $Assert.HasField($TargetObject, "MainBranchPolicy.settings.creatorVoteCounts", $true)
        $Assert.HasDefaultValue($TargetObject, "MainBranchPolicy.settings.creatorVoteCounts", $false)
}

# Synopsis: The branch policy should reset code reviewer votes when new changes are pushed
Rule 'Azure.DevOps.Repos.BranchPolicyResetVotes' `
    -Ref 'ADO-RP-004' `
    -Type 'Azure.DevOps.Repo' `
    -Tag @{ release = 'GA'} `
    -Level Warning {
        # Description: The branch policy should reset code reviewer votes when new changes are pushed
        # Reason: The branch policy does not reset code reviewer votes when new changes are pushed
        # Recommendation: Reset code reviewer votes when new changes are pushed
        # Links: https://learn.microsoft.com/en-us/azure/devops/organizations/security/security-best-practices?view=azure-devops#policies
        $Assert.HasField($TargetObject, "MainBranchPolicy.settings.resetOnSourcePush", $true)
        $Assert.HasDefaultValue($TargetObject, "MainBranchPolicy.settings.resetOnSourcePush", $true)
}