Smile-SA/elasticsuite

View on GitHub
.github/workflows/02-phpstan.yml

Summary

Maintainability
Test Coverage
name: PHPStan Code Quality

on:
  push:
    branches:
      - 2.11.x
      - master

  pull_request_target:
    branches:
      - 2.11.x
      - master
    types: [labeled,synchronize]

jobs:
  build:
    if: (github.event_name != 'pull_request') || contains(github.event.pull_request.labels.*.name, 'safe to test')
    runs-on: ubuntu-20.04
    name: PHPStan Quality

    strategy:
      fail-fast: false
      matrix:
        include:
          - php-versions: '8.1'
            magento-versions: '2.4.6'
            magento-editions: 'enterprise'
            experimental: false
          - php-versions: '8.2'
            magento-versions: '2.4.6'
            magento-editions: 'enterprise'
            experimental: false
          - php-versions: '8.2'
            magento-versions: '2.4.7'
            magento-editions: 'enterprise'
            experimental: false
          - php-versions: '8.3'
            magento-versions: '2.4.7'
            magento-editions: 'enterprise'
            experimental: true

    continue-on-error: ${{ matrix.experimental }}

    env:
      magento-directory: /var/www/magento
      MAGENTO_USERNAME: ${{ secrets.MAGENTO_USERNAME }}
      MAGENTO_PASSWORD: ${{ secrets.MAGENTO_PASSWORD }}

    steps:
      - name: "[Init] Checkout"
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          persist-credentials: false

      - name: "[Init] Setup PHP"
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          extensions: hash, iconv, mbstring, intl, bcmath, ctype, gd, pdo, mysql, curl, zip, dom, sockets, soap, openssl, simplexml, xsl
          ini-values: post_max_size=256M, max_execution_time=180

      - name: "[Init] Setup Magento Directory"
        env:
          MAGENTO_ROOT: ${{ env.magento-directory }}
          version: ${{ matrix.php-versions }}
        run: |
          sudo usermod -a -G www-data $USER
          sudo mkdir -p $MAGENTO_ROOT
          sudo chown -R $USER:www-data $MAGENTO_ROOT

      - name: "[Init] Downgrade Composer"
        env:
          MAGENTO_VERSION: ${{ matrix.magento-versions }}
        run: |
          function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
          if [ $(version $MAGENTO_VERSION) -lt $(version "2.4.2") ]; then
            composer self-update --1
          else
            composer self-update 2.1.14
          fi

      - name: "[Init] Determine composer cache directory"
        id: composer-cache-directory
        run: "echo \"directory=$(composer config cache-dir)\" >> $GITHUB_OUTPUT"

      - name: "[Init] Cache Composer cache"
        id: composer-cache
        uses: actions/cache@v3
        with:
          path: ${{ steps.composer-cache-directory.outputs.directory }}
          key: composer-${{ matrix.php-versions }}-${{ matrix.magento-editions }}-${{ matrix.magento-versions }}
          restore-keys: |
            composer-${{ matrix.php-versions }}-${{ matrix.magento-editions }}-${{ matrix.magento-versions }}

      - name: "[Init] Cache Magento install"
        id: magento-cache
        uses: actions/cache@v3
        with:
          path: ${{ env.magento-directory }}
          key: magento-${{ matrix.php-versions }}-${{ matrix.magento-editions }}-${{ matrix.magento-versions }}
          restore-keys: |
            magento-${{ matrix.php-versions }}-${{ matrix.magento-editions }}-${{ matrix.magento-versions }}

      - name: "[Init] Prepare credentials"
        if: ${{env.MAGENTO_USERNAME}} != 0
        run: composer config -g http-basic.repo.magento.com "$MAGENTO_USERNAME" "$MAGENTO_PASSWORD"

      - name: "[Init] Prepare Magento install if needed"
        if: steps.magento-cache.outputs.cache-hit == 'true'
        working-directory: ${{ env.magento-directory }}
        run: |
          rm -rf app/etc/env.php app/etc/config.php
          composer config discard-changes true
          composer remove smile/elasticsuite --no-update --no-interaction
          composer update --no-interaction --ignore-platform-reqs smile/elasticsuite
          composer config discard-changes false

      - name: "[Init] Install proper version of Magento through Composer"
        if: steps.magento-cache.outputs.cache-hit != 'true'
        env:
          MAGENTO_VERSION: ${{ matrix.magento-versions }}
          MAGENTO_EDITION: ${{ matrix.magento-editions }}
          MAGENTO_ROOT: ${{ env.magento-directory }}
          EXPERIMENTAL: ${{ matrix.experimental }}
        run: |
          STABILITY="--stability=stable"
          if [ $EXPERIMENTAL = true ]; then
            STABILITY=""
          fi
          sudo rm -rf $MAGENTO_ROOT
          sudo mkdir -p $MAGENTO_ROOT
          sudo chown -R $USER:www-data $MAGENTO_ROOT
          composer create-project --repository-url=https://repo.magento.com magento/project-$MAGENTO_EDITION-edition=$MAGENTO_VERSION $STABILITY $MAGENTO_ROOT --quiet

      - name: "[Init] Add current build of Elasticsuite"
        working-directory: ${{ env.magento-directory }}
        run: |
          composer require --dev "smile/elasticsuite:${GITHUB_BASE_REF:-${GITHUB_REF##*/}}-dev" --ignore-platform-reqs
          rm -rf vendor/smile/elasticsuite/**
          cp -Rf $GITHUB_WORKSPACE/* vendor/smile/elasticsuite/

      - name: "[Init] Unconditionally add phpstan/phpstan"
        working-directory: ${{ env.magento-directory }}
        run: composer require --dev smile/magento2-smilelab-phpstan ^1.0

      - name: "[Init] Fix Magento directory permissions"
        env:
          MAGENTO_ROOT: ${{ env.magento-directory }}
        working-directory: ${{ env.magento-directory }}
        run: |
          sudo chmod -R a=r,u+w,a+X .
          sudo find var pub/static pub/media app/etc generated/ -type f -exec chmod g+w {} \;
          sudo find var pub/static pub/media app/etc generated/ -type d -exec chmod g+ws {} \;
          sudo chown -R $USER:www-data .
          sudo chmod u+x bin/magento

      - name: "[Init] Enabling modules"
        working-directory: ${{ env.magento-directory }}
        run: php bin/magento module:enable --all

      - name: "[Init] Compile"
        working-directory: ${{ env.magento-directory }}
        run: php bin/magento setup:di:compile

      - name: "[Test] PHPStan"
        working-directory: ${{ env.magento-directory }}
        run: |
          sudo chmod u+x vendor/bin/phpstan
          vendor/bin/phpstan analyze --level=0 vendor/smile/elasticsuite

      - name: "[End] Job failed, gathering logs"
        env:
          MAGENTO_ROOT: ${{ env.magento-directory }}
        if: ${{ failure() }}
        run: |
          tail -n 100 $MAGENTO_ROOT/var/log/*.log