netdata/netdata

View on GitHub
.github/workflows/review.yml

Summary

Maintainability
Test Coverage
---
# Runs various linter checks against PR with suggested changes to improve quality
name: Review
on:
  pull_request:
    types: [opened, reopened, labeled, synchronize]
env:
  DISABLE_TELEMETRY: 1
concurrency:
  group: review-${{ github.ref }}
  cancel-in-progress: true
jobs:
  prep-review:
    name: Prepare Review Jobs
    runs-on: ubuntu-latest
    outputs:
      actionlint: ${{ steps.actionlint.outputs.run }}
      # clangformat: ${{ steps.clangformat.outputs.run }}
      flake8: ${{ steps.flake8.outputs.run }}
      golangci-lint: ${{ steps.golangci-lint.outputs.run }}
      hadolint: ${{ steps.hadolint.outputs.run }}
      shellcheck: ${{ steps.shellcheck.outputs.run }}
      yamllint: ${{ steps.yamllint.outputs.run }}
    steps:
      - name: Clone repository
        uses: actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0
      - name: Check files for actionlint
        id: actionlint
        run: |
          if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/actionlint') }}" = "true" ]; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
          elif git diff --name-only origin/${{ github.base_ref }} HEAD | grep -Eq '\.github/workflows/.*' ; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
            echo 'GitHub Actions workflows have changed, need to run actionlint.'
          else
            echo "run=false" >> "${GITHUB_OUTPUT}"
          fi
      # - name: Check files for clang-format
      #   id: clangformat
      #   run: |
      #     if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/clang-format') }}" = "true" ]; then
      #       echo "run=true" >> "${GITHUB_OUTPUT}"
      #     elif git diff --name-only origin/${{ github.base_ref }} HEAD | grep -Eq '\.cpp$|\.cxx$|\.c$|\.hpp$|\.hxx$|\.h$' ; then
      #       echo "run=true" >> "${GITHUB_OUTPUT}"
      #       echo 'C/C++ code has changed, need to run clang-format.'
      #     else
      #       echo "run=false" >> "${GITHUB_OUTPUT}"
      #     fi
      - name: Check files for flake8
        id: flake8
        run: |
          if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/flake8') }}" = "true" ]; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
          elif git diff --name-only origin/${{ github.base_ref }} HEAD | grep -Eq '.*\.py' ; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
            echo 'Python files have changed, need to run flake8.'
          else
            echo "run=false" >> "${GITHUB_OUTPUT}"
          fi
      - name: Check files for golangci-lint
        id: golangci-lint
        run: |
          if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/golangci-lint') }}" = "true" ]; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
          elif git diff --name-only origin/"${{ github.base_ref }}" HEAD -- | grep -Eq '.*\.go'; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
            echo 'Go code has changed, need to run golangci-lint.'
          else
            echo "run=false" >> "${GITHUB_OUTPUT}"
          fi
      - name: Check files for hadolint
        id: hadolint
        run: |
          if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/hadolint') }}" = "true" ]; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
          elif git diff --name-only origin/${{ github.base_ref }} HEAD | grep -Eq '.*Dockerfile.*' ; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
            echo 'Dockerfiles have changed, need to run Hadolint.'
          else
            echo "run=false" >> "${GITHUB_OUTPUT}"
          fi
      - name: Check files for shellcheck
        id: shellcheck
        run: |
          if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/shellcheck') }}" = "true" ]; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
          elif git diff --name-only origin/${{ github.base_ref }} HEAD | grep -Eq '.*\.sh.*' ; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
            echo 'Shell scripts have changed, need to run shellcheck.'
          else
            echo "run=false" >> "${GITHUB_OUTPUT}"
          fi
      - name: Check files for yamllint
        id: yamllint
        run: |
          if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/yamllint') }}" = "true" ]; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
          elif git diff --name-only origin/${{ github.base_ref }} HEAD | grep -Eq '.*\.ya?ml|python\.d/.*\.conf' ; then
            echo "run=true" >> "${GITHUB_OUTPUT}"
            echo 'YAML files have changed, need to run yamllint.'
          else
            echo "run=false" >> "${GITHUB_OUTPUT}"
          fi

  actionlint:
    name: actionlint
    needs: prep-review
    if: needs.prep-review.outputs.actionlint == 'true'
    runs-on: ubuntu-latest
    steps:
      - name: Git clone repository
        uses: actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0
      - name: Run actionlint
        uses: reviewdog/action-actionlint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-check

#  clang-format:
#    name: clang-format
#    needs: prep-review
#    if: needs.prep-review.outputs.clangformat == 'true'
#    runs-on: ubuntu-latest
#    steps:
#      - name: Git clone repository
#        uses: actions/checkout@v4
#        with:
#          submodules: false
#          fetch-depth: 0
#      - name: Check for label
#        id: label
#        run: |
#          if [ "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/clang-format') }}" = "true" ]; then
#            echo 'check-all=true' >> "${GITHUB_OUTPUT}"
#          else
#            echo 'check-all=false' >> "${GITHUB_OUTPUT}"
#          fi
#      - name: Run clang-format
#        run: |
#          if [ "${{ steps.label.outputs.check-all }}" == 'true' ]; then
#            find . -regex '.*\.\(c\|cpp\|cxx\|h\|hpp\|hxx\)$' -exec clang-format -i --style=file '{}' \;
#          else
#            git diff --name-only origin/${{ github.base_ref }} HEAD | grep -E '\.cpp$|\.cxx$|\.c$|\.hpp$|\.hxx$|\.h$' | \
#            xargs -n 1 -r clang-format -i --style=file
#          fi
#          git status --porcelain=v1 > /tmp/porcelain
#          if [ -s /tmp/porcelain ]; then
#            cat /tmp/porcelain
#            exit 1
#          fi

  flake8:
    name: flake8
    needs: prep-review
    if: needs.prep-review.outputs.flake8 == 'true'
    runs-on: ubuntu-latest
    steps:
      - name: Git clone repository
        uses: actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.10"
      - name: Run flake8
        uses: reviewdog/action-flake8@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-check

  golangci-lint:
    name: golangci-lint
    needs: prep-review
    if: needs.prep-review.outputs.golangci-lint == 'true'
    strategy:
      matrix:
        tree:
          - src/go/collectors/go.d.plugin
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Run golangci-lint
        uses: reviewdog/action-golangci-lint@v2
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-check
          golangci_lint_flags: '--timeout=10m'
          workdir: ${{ matrix.tree }}

  hadolint:
    name: hadolint
    needs: prep-review
    if: needs.prep-review.outputs.hadolint == 'true'
    runs-on: ubuntu-latest
    steps:
      - name: Git clone repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Run hadolint
        uses: reviewdog/action-hadolint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-check

  shellcheck:
    name: shellcheck
    needs: prep-review
    if: needs.prep-review.outputs.shellcheck == 'true'
    runs-on: ubuntu-latest
    steps:
      - name: Git clone repository
        uses: actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0
      - name: Run shellcheck
        uses: reviewdog/action-shellcheck@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-check
          path: "."
          pattern: "*.sh*"
          exclude: |
            ./.git/*
            packaging/makeself/makeself.sh
            packaging/makeself/makeself-header.sh
            ./fluent-bit/*

  yamllint:
    name: yamllint
    needs: prep-review
    if: needs.prep-review.outputs.yamllint == 'true'
    runs-on: ubuntu-latest
    steps:
      - name: Git clone repository
        uses: actions/checkout@v4
        with:
          submodules: recursive
          fetch-depth: 0
      - name: Run yamllint
        uses: reviewdog/action-yamllint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-check