Use GitHub Actions native features and follow best practices to create maintainable, secure, and reliable CI workflows:
update-existing: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}
# DO THIS - scope permissions per job
jobs:
build:
permissions:
contents: read
attestations: write
id-token: write
# INSTEAD OF THIS - overly broad permissions
permissions:
contents: read
attestations: write
id-token: write
These practices improve workflow reliability, security, and maintainability while making troubleshooting easier.