mimmi20/contact

View on GitHub
.github/workflows/continuous-integration.yml

Summary

Maintainability
Test Coverage
# https://help.github.com/en/categories/automating-your-workflow-with-github-actions

# file-version: 1.0

name: "Continuous Integration"

on:
  - pull_request
  - push

permissions:
  contents: read

concurrency:
  group: "${{ github.event_name }}-${{ github.workflow }}-${{ github.head_ref || github.run_id }}-${{ github.ref }}"
  cancel-in-progress: true

jobs:
  validate:
    name: "Validate Project"

    uses: "mimmi20/ci/.github/workflows/validate.yml@8.1"
    with:
      extensions: "ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
      ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
      composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
      skip-validate-composer: false
      skip-phplint: false
      skip-check-composer: false
      dependency-analyser-options: ""

  install:
    name: "Install Project"

    needs: "validate"

    uses: "mimmi20/ci/.github/workflows/install.yml@8.1"
    with:
      extensions: "ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
      ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
      composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
      skip-php-install: false
      skip-npm-install: true

  analytics:
    name: "Project Analysis"

    needs: "install"

    uses: "mimmi20/ci/.github/workflows/analytics.yml@8.1"
    with:
      extensions: "ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
      ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
      composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
      skip-phpstan: false
      skip-rector: false
      skip-phpmd: false

  tests:
    name: "UnitTests & Code Coverage"

    needs: "analytics"

    runs-on: "${{ matrix.operating-system }}"

    timeout-minutes: 10

    continue-on-error: false

    strategy:
      fail-fast: false

      matrix:
        operating-system:
          - "ubuntu-22.04"

        php-version:
          - "8.1"
          - "8.2"
          - "8.3"

        dependencies:
          - "lowest"

    steps:
      - name: "Checkout"
        uses: "actions/checkout@v4"
        with:
          # Disabling shallow clone is recommended for improving relevancy of reporting
          fetch-depth: 0
          lfs: false
          persist-credentials: false

      - name: "Install PHP"
        uses: "shivammathur/setup-php@2.30.4"
        with:
          php-version: "${{ matrix.php-version }}"
          extensions: "none, phar, json, opcache, ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
          ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
          coverage: "none"
          tools: "composer:v2"
        env:
          fail-fast: true
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          phpts: "nts"
          debug: true

      - name: "Update dependencies with composer"
        uses: "ramsey/composer-install@3.0.0"
        with:
          dependency-versions: "${{ matrix.dependencies }}"
          composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"

      - name: "Run unit tests with phpunit/phpunit"
        run: "vendor/bin/phpunit -c phpunit.xml --no-coverage --display-warnings --display-deprecations"

      - name: "Enable annotations for validation errors and warnings"
        uses: "korelstar/xmllint-problem-matcher@v1"

      - name: "Validate phpcs.xml"
        uses: "ChristophWurst/xmllint-action@v1"
        with:
          xml-file: "phpunit.xml"
          xml-schema-file: "vendor/phpunit/phpunit/phpunit.xsd"

  code-coverage:
    name: "Code Coverage with PHPUnit"

    needs: "analytics"

    runs-on: "${{ matrix.operating-system }}"

    timeout-minutes: 10

    continue-on-error: false

    strategy:
      fail-fast: false

      matrix:
        operating-system:
          - "ubuntu-22.04"

        php-version:
          - "8.1"

        dependencies:
          - "lowest"

    steps:
      - name: "Checkout"
        uses: "actions/checkout@v4"
        with:
          # Disabling shallow clone is recommended for improving relevancy of reporting
          fetch-depth: 0
          lfs: false
          persist-credentials: false

      - name: "Install PHP"
        uses: "shivammathur/setup-php@2.30.4"
        with:
          php-version: "${{ matrix.php-version }}"
          extensions: "none, phar, json, opcache, ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
          ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0, xdebug.mode=coverage"
          coverage: "xdebug"
          tools: "composer:v2"
        env:
          fail-fast: true
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          phpts: "nts"
          debug: true

      - name: "Update dependencies with composer"
        uses: "ramsey/composer-install@3.0.0"
        with:
          dependency-versions: "${{ matrix.dependencies }}"
          composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"

      - name: "Create cache directory for phpunit/phpunit"
        run: "mkdir -p .build/coverage"

      - name: "Collect code coverage with Xdebug and phpunit/phpunit"
        run: "vendor/bin/phpunit -c phpunit.xml --coverage-clover=.build/coverage/clover.xml --coverage-text --coverage-xml=.build/coverage/coverage-xml --log-junit=.build/coverage/phpunit.junit.xml --display-warnings --display-deprecations"

      - name: "Upload coverage to Codecov"
        uses: "codecov/codecov-action@v4.4.1"
        with:
          file: ".build/coverage/clover.xml"
          flags: "phpunit,php-${{ matrix.php-version }},${{ matrix.operating-system }}"
          verbose: false
        env:
          CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"

      - name: "Upload coverage to Codeclimate"
        uses: "paambaati/codeclimate-action@v6.0.0"
        env:
          CC_TEST_REPORTER_ID: "${{ secrets.CODECLIMATE_API_KEY }}"
        with:
          coverageLocations: ".build/coverage/clover.xml:clover"
          debug: false

      - name: "Upload coverage to Coveralls"
        uses: "coverallsapp/github-action@v2"
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
          flag-name: "php ${{ matrix.php-version }} on ${{ matrix.operating-system }}"
          parallel: true
          file: ".build/coverage/clover.xml"
          format: "clover"
          debug: false

      - name: "Run mutation tests with infection/infection"
        env:
          STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }}
        run: "vendor/bin/infection --show-mutations --only-covered --min-covered-msi=93 --min-msi=90 --coverage=.build/coverage --logger-github --no-progress -vv"

  finish-code-coverage:
    runs-on: "ubuntu-22.04"

    needs: "code-coverage"

    if: always()

    steps:
      - name: "Coveralls Finished"
        uses: "coverallsapp/github-action@v2"
        with:
          parallel-finished: true

  # This is a meta job to avoid to have to constantly change the protection rules
  # whenever we touch the matrix.
  tests-status:
    name: "Unit & Integration Tests Status"

    runs-on: "ubuntu-22.04"

    if: always()

    needs:
      - "tests"
      - "code-coverage"

    steps:
      - name: Successful run
        if: ${{ !(contains(needs.*.result, 'failure')) }}
        run: exit 0

      - name: Failing run
        if: ${{ contains(needs.*.result, 'failure') }}
        run: exit 1