Automating Code Style Enforcement in CI/CD Pipelines
Integrate code formatting checks into CI/CD workflows to ensure consistent style adherence.
0 likes
205 views
Rule Content
# Automating Code Style Enforcement in CI/CD Pipelines
## Context
- **When to Apply**: This rule is applicable during the Continuous Integration/Continuous Deployment (CI/CD) process to ensure that all code adheres to the project's defined style guidelines before being merged or deployed.
- **Prerequisites**: A code formatter (e.g., Prettier for JavaScript, Black for Python) must be configured and accessible within the CI/CD environment.
## Requirements
- **Integration of Code Formatter**: Configure the CI/CD pipeline to run the code formatter on all relevant code files during the build process.
- **Enforcement of Formatting**: The pipeline should fail if any code does not conform to the defined style guidelines, preventing unformatted code from being merged or deployed.
- **Consistent Configuration**: Ensure that the code formatter's configuration file (e.g., `.prettierrc`, `pyproject.toml`) is included in the repository and is consistent across all development environments.
- **Automated Fixes**: Optionally, configure the pipeline to automatically apply formatting fixes and commit them back to the repository, or provide clear instructions for developers to do so locally.
## Examples
# Example CI/CD configuration for a Node.js project using Prettier
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run Prettier
run: npx prettier --check .
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run 'npx prettier --write .' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a Python project using Black
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v3
with:
python-version: '3.10'
- name: Install Black
run: pip install black
- name: Run Black
run: black --check .
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run 'black .' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a Java project using Checkstyle
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Install Checkstyle
run: |
wget -qO- https://github.com/checkstyle/checkstyle/releases/download/checkstyle-10.3.3/checkstyle-10.3.3-all.jar > checkstyle.jar
- name: Run Checkstyle
run: java -jar checkstyle.jar -c /google_checks.xml src/
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run Checkstyle locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a C# project using dotnet format
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '6.0.x'
- name: Install dotnet format
run: dotnet tool install -g dotnet-format
- name: Run dotnet format
run: dotnet format --verify-no-changes
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run 'dotnet format' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a Go project using gofmt
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: '1.18'
- name: Run gofmt
run: |
unformatted=$(gofmt -l .)
if [ -n "$unformatted" ]; then
echo "Code formatting issues detected in the following files:"
echo "$unformatted"
echo "Please run 'gofmt -w .' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a PHP project using PHP_CodeSniffer
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up PHP
uses: actions/setup-php@v3
with:
php-version: '8.1'
- name: Install PHP_CodeSniffer
run: composer global require "squizlabs/php_codesniffer=*"
- name: Run PHP_CodeSniffer
run: ~/.composer/vendor/bin/phpcs --standard=PSR12 .
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run 'phpcbf' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a Ruby project using RuboCop
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Ruby
uses: actions/setup-ruby@v3
with:
ruby-version: '3.1'
- name: Install RuboCop
run: gem install rubocop
- name: Run RuboCop
run: rubocop --parallel
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run 'rubocop -a' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a Swift project using SwiftLint
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install SwiftLint
run: brew install swiftlint
- name: Run SwiftLint
run: swiftlint
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run 'swiftlint autocorrect' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a Kotlin project using ktlint
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Install ktlint
run: |
curl -sSLO https://github.com/pinterest/ktlint/releases/download/0.45.2/ktlint
chmod a+x ktlint
sudo mv ktlint /usr/local/bin/
- name: Run ktlint
run: ktlint --android --reporter=plain
- name: Fail if unformatted code is found
run: |
if [ $? -ne 0 ]; then
echo "Code formatting issues detected. Please run 'ktlint -F' locally and commit the changes."
exit 1
fi
# Example CI/CD configuration for a TypeScript project using ESLint and Prettier
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run ESLint
run: npx eslint . --ext .ts,.tsx
- name: Run Prettier
run: npx prettier --check .
- name: Fail if unformatted code is found
run: |
if [ $? -ne