mirror of
https://github.com/flarum/framework.git
synced 2024-11-25 06:14:33 +08:00
6b336c5ea8
* chore: phpunit 10 * chore: config * Apply fixes from StyleCI * chore: phpunit 11 (php 8.2 minimum requirement) * feat: laravel 11 * Apply fixes from StyleCI * feat: carbon v3 * fixes
277 lines
9.0 KiB
YAML
277 lines
9.0 KiB
YAML
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
|