name: Flarum Backend Jobs on: workflow_call: inputs: enable_backend_testing: description: "Enable Backend Testing?" type: boolean default: true required: false enable_phpstan: description: "Enable PHPStan Static Analysis?" type: boolean default: false required: false backend_directory: description: The directory of the project where backend code is located. This should contain a `composer.json` file, and is generally the root directory of the repo. type: string required: false default: '.' # Only relevant in mono-repos. monorepo_tests: description: "The list of directories to test in a monorepo. This should be a space-separated list of directories relative to the backend directory." type: string required: false php_versions: description: Versions of PHP to test with. Should be array of strings encoded as JSON array type: string required: false # Keep PHP versions synced with build-install-packages.yml default: '["8.2", "8.3"]' php_extensions: description: PHP extensions to install. type: string required: false default: 'curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip' db_versions: description: Versions of databases to test with. Should be array of strings encoded as JSON array type: string required: false default: '["mysql:5.7", "mysql:8.0.30", "mysql:8.1.0", "mariadb", "sqlite:3", "postgres:10"]' php_ini_values: description: PHP ini values type: string required: false default: error_reporting=E_ALL runner_type: description: The type of runner to use for the jobs. This should be one of the types supported by the `runs-on` keyword. type: string required: false default: 'ubuntu-latest' secrets: composer_auth: description: The Composer auth tokens to use for private packages. required: false env: COMPOSER_ROOT_VERSION: dev-main # `inputs.composer_directory` defaults to `inputs.backend_directory` FLARUM_TEST_TMP_DIR_LOCAL: tests/integration/tmp COMPOSER_AUTH: ${{ secrets.composer_auth }} DB_DATABASE: flarum_test DB_USERNAME: root DB_PASSWORD: root jobs: test: runs-on: ${{ inputs.runner_type }} strategy: matrix: php: ${{ fromJSON(inputs.php_versions) }} service: ${{ fromJSON(inputs.db_versions) }} prefix: [''] php_ini_values: [inputs.php_ini_values] # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrixinclude include: # Expands the matrix by naming DBs. - service: 'mysql:5.7' db: MySQL 5.7 driver: mysql - service: 'mysql:8.0.30' db: MySQL 8.0 driver: mysql - service: mariadb db: MariaDB driver: mysql - service: 'mysql:8.1.0' db: MySQL 8.1 driver: mysql - service: 'sqlite:3' db: SQLite driver: sqlite - service: 'postgres:10' db: PostgreSQL 10 driver: pgsql # Include Database prefix tests with only one PHP version. - php: ${{ fromJSON(inputs.php_versions)[0] }} service: 'mysql:5.7' db: MySQL 5.7 driver: mysql prefix: flarum_ prefixStr: (prefix) - php: ${{ fromJSON(inputs.php_versions)[0] }} service: mariadb db: MariaDB driver: mysql prefix: flarum_ prefixStr: (prefix) - php: ${{ fromJSON(inputs.php_versions)[0] }} service: 'sqlite:3' db: SQLite driver: sqlite prefix: flarum_ prefixStr: (prefix) - php: ${{ fromJSON(inputs.php_versions)[0] }} service: 'postgres:10' db: PostgreSQL 10 driver: pgsql prefix: flarum_ prefixStr: (prefix) # To reduce number of actions, we exclude some PHP versions from running with some DB versions. exclude: - php: ${{ fromJSON(inputs.php_versions)[1] }} service: 'mysql:8.0.30' - php: ${{ fromJSON(inputs.php_versions)[0] }} service: mariadb - php: ${{ fromJSON(inputs.php_versions)[1] }} service: mariadb - php: ${{ fromJSON(inputs.php_versions)[0] }} service: 'mysql:8.1.0' - php: ${{ fromJSON(inputs.php_versions)[1] }} service: 'mysql:8.1.0' - php: ${{ fromJSON(inputs.php_versions)[0] }} service: 'sqlite:3' - php: ${{ fromJSON(inputs.php_versions)[1] }} service: 'sqlite:3' - php: ${{ fromJSON(inputs.php_versions)[0] }} service: 'postgres:10' - php: ${{ fromJSON(inputs.php_versions)[1] }} service: 'postgres:10' services: mysql: image: ${{ matrix.driver == 'mysql' && matrix.service || '' }} env: MYSQL_DATABASE: ${{ env.DB_DATABASE }} MYSQL_USER: ${{ env.DB_USERNAME }} MYSQL_PASSWORD: ${{ env.DB_PASSWORD }} MYSQL_ROOT_PASSWORD: ${{ env.DB_PASSWORD }} ports: - 13306:3306 postgres: image: ${{ matrix.driver == 'pgsql' && matrix.service || '' }} env: POSTGRES_DB: ${{ env.DB_DATABASE }} POSTGRES_USER: ${{ env.DB_USERNAME }} POSTGRES_PASSWORD: ${{ env.DB_PASSWORD }} ports: - 15432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 name: 'PHP ${{ matrix.php }} / ${{ matrix.db }} ${{ matrix.prefixStr }}' if: >- inputs.enable_backend_testing && ((github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || github.event_name != 'pull_request') steps: - uses: actions/checkout@master - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} coverage: xdebug extensions: ${{ inputs.php_extensions }} tools: phpunit, composer:v2 ini-values: ${{ matrix.php_ini_values }} - name: Create MySQL Database if: ${{ matrix.driver == 'mysql' }} run: | sudo systemctl start mysql mysql -uroot -proot -e 'CREATE DATABASE flarum_test;' --port 13306 - name: Install Composer dependencies run: composer install working-directory: ${{ inputs.backend_directory }} # If we have a `inputs.monorepo_tests`, we will run tests for each item of the provided array in a ::group::item # If we don't have a `inputs.monorepo_tests`, we will run tests for the current repository # We also have to run the `composer test:setup` script first before running each test - name: Run tests run: | if [ -z "${{ inputs.monorepo_tests }}" ]; then composer test:setup composer test else for test in ${{ inputs.monorepo_tests }}; do echo "::group::Running tests for $test" composer test:setup --working-dir=$test composer test --working-dir=$test echo "::endgroup::" done fi working-directory: ${{ inputs.backend_directory }} env: DB_PORT: ${{ matrix.driver == 'mysql' && 13306 || 15432 }} DB_PREFIX: ${{ matrix.prefix }} DB_DRIVER: ${{ matrix.driver }} COMPOSER_PROCESS_TIMEOUT: 600 phpstan: runs-on: ${{ inputs.runner_type }} strategy: matrix: php: ${{ fromJSON(inputs.php_versions) }} services: mysql: image: mysql:8.0.30 ports: - 33306:3306 name: 'PHPStan PHP ${{ matrix.php }}' if: >- inputs.enable_phpstan && ((github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || github.event_name != 'pull_request') steps: - uses: actions/checkout@master - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} coverage: xdebug extensions: ${{ inputs.php_extensions }} tools: phpunit, composer:v2 ini-values: ${{ matrix.php_ini_values }} - name: Install Composer dependencies run: composer install working-directory: ${{ inputs.backend_directory }} - name: Create MySQL Database run: | sudo systemctl start mysql mysql -uroot -proot -e 'CREATE DATABASE flarum_test;' --port 33306 - name: Run PHPStan run: composer analyse:phpstan env: DB_PORT: 33306 DB_PASSWORD: root COMPOSER_PROCESS_TIMEOUT: 600 FLARUM_TEST_TMP_DIR_LOCAL: ./tmp