Automated Pipelines Best Practices
- Version Control Systems
- Documentation Publishing
- Static analysis aka Static Application Security Testing (SAST)
- Software Composition Analysis dependency scans and/or setup Dependabot in Settings/Security
- GitHub Actions
- Contribution Flow
Version Control Systems
- Use git and GitHub
-
Protect code branches. In GitHub settings “Branch protection rules” select:
- “Require a pull request before merging”
- “Require approvals”: Require Pull Request Reviews Before Merging
- “Require status checks to pass before merging”: Require Status Checks Before Merging
GitHub Actions is the preferred CI platform to implement checks. Create a test pipeline, consider required checks for:
- DCO (required) DCO App
- Linters
- Linting GitHub Action workflow .yaml Files: Action Lint
- Unit tests
- Integration tests
- Code coverage
Documentation Publishing
- Consider building and deploying the documentation through the CI/CD pipeline
- Prefer choosing a documentation generator/template instead of writing it from scratch
- Consider a documentation organization that handles git tags in way that readers can select which tag/release they would like to view the documentation for.
Examples:
- The recommended template for documentation: Documentation Template, a Hyperledger Lab
- ReadTheDocs webhook: ReadTheDocs Integrations
Static analysis aka Static Application Security Testing (SAST)
- Consider performing automated SAST scans to protect your app from security risks.
Examples:
- CodeQL: About Code Scanning with CodeQL
- Snyk: Snyk GitHub Integration
The upside of CodeQL is that it’s a built-in feature of GitHub so it definitely has the lowest barrier to entry/easiest and quickest setup. Whether it’s actually the best tool for your project will depend on a list of factors such as the programming language being used, what are the build-system(s) in place, etc.
Software Composition Analysis dependency scans and/or setup Dependabot in Settings/Security
-
Consider performing automated software composition analysis to manage open source risk.
-
Dependabot: Configuring Dependabot Security Updates
-
Trivy: Trivy It supports pom.xml files but not build.gradle files. If you have a Gradle project you can use the Maven Publish Gradle plugin to generate an equivalent pom.xml file.
GitHub Actions
Note: use Reusable GitHub actions to reduce the number of top-level checks Reusing Workflows
- Monitor GitHub Actions success rate, usage metrics and many other statistics about billing hours here: Hyperledger Octolense
- Use GitHub Actions efficiently and reduce unnecessary runner usage:
- Use cancel-in-progress to suppress multiple jobs for multiple pushes to the same pull request Using Concurrency to Cancel Any In-Progress Job or Run
- Uncheck branch protection rule “Require branches to be up to date before merging” to reduce number of runs
- Potentially add a scheduled run if you are concerned about incompatible PRs getting merged
- You can enable this via built-in GitHub YAML syntax: Require Status Checks Before Merging
- Use path filters to eliminate unnecessary runs either
- through the built-in GitHub Action YAML syntax: Filter Pattern Cheat Sheet
- or by using a third-party GitHub Action: Paths Filter
Contribution Flow
- Documentation pull-requests shouldn’t require building and testing code, so that people who only want to commit a documentation change can do it without having to set up a full-blown development environment.
- Consider custom docker images for CI with pre-installed and pre-configured dependencies
- Consider running some jobs on schedule (nightly) rather than on each pull request (e.g. full matrix of platform tests, expensive security scans, code coverage)
- Inspect Github Actions run results on your own fork prior to opening Pull Request The simplest way to do this is to simply open the pull request for your own fork’s main branch the same way as you would open it for the upstream repository’s. Contact Hyperledger staff for the possibility of dedicated paid runners
- Consider using development container images which come pre-installed with all the dependencies a contributor need to get started with writing code on the project. Visual Studio DevContainers
- Consider leveraging pre-commit hooks via tools like husky (NodeJS) and lint-staged which can run arbitrary scripts at the time of you making a git commit.
- Encourage developers to run tests locally before opening a pull request.
- If due to technical constraints it is not possible to run the tests locally at all, the next best thing to encourage contributors is to run the CI on their personal fork (submit a PR against their their personal fork’s main branch first while drafting the PR). Once the tests are passing on their fork’s CI, they are ready to open the PR for review on the upstream repository.
- Document how to run tests locally
- Document how to run individual failing tests
- Document how to add tests of all types.