bavix/laravel-wallet

View on GitHub
.github/workflows/phpunits.yaml

Summary

Maintainability
Test Coverage
name: phpunits

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

env:
  MEMCACHED_HOST: localhost
  REDIS_HOST: localhost
  REDIS_PORT: 6379
  MEMCACHED_PORT: 11211

jobs:
  units:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        php-versions: [8.2, 8.3]
        databases: [testing, pgsql, mysql, mariadb]
        caches: [array, redis, memcached, database]
        locks: [redis, memcached]

    services:
      redis:
        image: redis
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 10
        ports:
          - 6379:6379

      memcached:
        image: memcached
        options: >-
          --health-cmd "timeout 5 bash -c 'cat < /dev/null > /dev/udp/127.0.0.1/11211'"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 10
        ports:
          - 11211:11211

      pgsql:
        image: postgres
        env:
          POSTGRES_USER: root
          POSTGRES_PASSWORD: wallet
          POSTGRES_DB: wallet
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 10
        ports:
          - 5432:5432

      mysql:
        image: bitnami/mysql:8.0
        env:
          MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
          MYSQL_ROOT_PASSWORD: wallet
          MYSQL_DATABASE: wallet
        options: >-
          --health-cmd="mysqladmin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 10
        ports:
          - 3306:3306

      mariadb:
        image: mariadb:10.10 # https://github.com/laravel/framework/pull/48455
        env:
          MYSQL_ROOT_PASSWORD: wallet
          MYSQL_DATABASE: wallet
        options: >-
          --health-cmd="mysqladmin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 10
        ports:
          - 3307:3306

    steps:
      - name: Checkout
        id: git-checkout
        uses: actions/checkout@v4

      - name: Setup PHP
        id: php-install
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          extensions: mbstring, pgsql, mysql, sqlite, redis, memcached, bcmath
          coverage: pcov
        env:
          runner: self-hosted

      - name: Validate composer.json and composer.lock
        id: composer-validate
        run: composer validate --strict

      - name: Cache Composer packages
        id: composer-cache
        uses: actions/cache@v4
        with:
          path: vendor
          key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-php-

      - name: Install dependencies
        id: composer-dependencies
        run: composer install --prefer-dist --no-progress

      - name: Check codeclimate
        id: codeclimate-check
        run: echo "execute=${{ matrix.php-versions == '8.3' && matrix.caches == 'array' && matrix.locks == 'redis' && matrix.databases == 'testing' }}" >> $GITHUB_OUTPUT

      - name: Prepare codeclimate
        id: codeclimate-prepare
        run: |
          curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
          chmod +x ./cc-test-reporter
          ./cc-test-reporter before-build
        if: ${{ steps.codeclimate-check.outputs.execute == 'true' }}

      - name: Prepare run test suite
        id: unit-prepare
        run: |
          mkdir build

      - name: Run test suite
        id: unit-run
        run: |
          composer parabench
        env:
          WALLET_CACHE_DRIVER: ${{ matrix.caches }}
          WALLET_LOCK_DRIVER: ${{ matrix.locks }}
          DB_CONNECTION: ${{ matrix.databases }}

      - name: Run mutation test suite
        id: infect-run
        run: composer infect
        env:
          WALLET_CACHE_DRIVER: ${{ matrix.caches }}
          WALLET_LOCK_DRIVER: ${{ matrix.locks }}
          DB_CONNECTION: ${{ matrix.databases }}
          STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }}
        if: ${{ steps.codeclimate-check.outputs.execute == 'true' }}

      - name: Send coverage
        id: codeclimate-send
        uses: nick-fields/retry@v3
        with:
          timeout_seconds: 15
          max_attempts: 3
          command: >-
            ./cc-test-reporter after-build --coverage-input-type clover --exit-code 0
        env:
          CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
        if: ${{ steps.codeclimate-check.outputs.execute == 'true' }}

      - uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
        if: ${{ steps.codeclimate-check.outputs.execute == 'true' }}