laravel/framework

11 workflows · maturity 33% · 7 patterns · GitHub ↗

Security 11.36/100

Practices

✓ Matrix✓ Permissions○ Security scan○ AI review○ Cache○ Concurrency✓ Reusable workflows

Detected patterns

Security dimensions

permissions
11.4
security scan
0
supply chain
0
secret handling
0
harden runner
0

Workflows (11)

databases .github/workflows/databases.yml
Triggers
push, pull_request
Runs on
ubuntu-24.04, ubuntu-24.04, ubuntu-24.04, ubuntu-24.04, ubuntu-24.04, ubuntu-24.04, ubuntu-22.04, ubuntu-22.04, ubuntu-24.04
Jobs
mysql_57, mysql_8, mariadb, pgsql_18, pgsql_14, pgsql_10, mssql_2019, mssql_2017, sqlite
Actions
shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry
Commands
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Database
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Database
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Database
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Database
View raw YAML
name: databases

on:
  push:
    branches:
      - master
      - '*.x'
  pull_request:

jobs:
  mysql_57:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    services:
      mysql:
        image: mysql:5.7
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: laravel
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: MySQL 5.7

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: mysql
          DB_COLLATION: utf8mb4_unicode_ci

  mysql_8:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    services:
      mysql:
        image: mysql:8
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: laravel
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: MySQL 8

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: mysql

  mariadb:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    services:
      mariadb:
        image: mariadb:10
        env:
          MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: yes
          MARIADB_DATABASE: laravel
        ports:
          - 3306:3306
        options: --health-cmd="healthcheck.sh --connect --innodb_initialized" --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: MariaDB 10

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: mariadb

  pgsql_18:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    services:
      postgresql:
        image: postgres:18
        env:
          POSTGRES_DB: laravel
          POSTGRES_USER: forge
          POSTGRES_PASSWORD: password
        ports:
          - 5432:5432
        options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: PostgreSQL 18

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: pgsql
          DB_USERNAME: forge
          DB_PASSWORD: password

  pgsql_14:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    services:
      postgresql:
        image: postgres:14
        env:
          POSTGRES_DB: laravel
          POSTGRES_USER: forge
          POSTGRES_PASSWORD: password
        ports:
          - 5432:5432
        options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: PostgreSQL 14

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: pgsql
          DB_USERNAME: forge
          DB_PASSWORD: password

  pgsql_10:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    services:
      postgresql:
        image: postgres:10
        env:
          POSTGRES_DB: laravel
          POSTGRES_USER: forge
          POSTGRES_PASSWORD: password
        ports:
          - 5432:5432
        options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: PostgreSQL 10

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: pgsql
          DB_USERNAME: forge
          DB_PASSWORD: password

  mssql_2019:
    runs-on: ubuntu-22.04
    timeout-minutes: 5

    services:
      sqlsrv:
        image: mcr.microsoft.com/mssql/server:2019-latest
        env:
          ACCEPT_EULA: Y
          SA_PASSWORD: Forge123
        ports:
          - 1433:1433

    strategy:
      fail-fast: true

    name: SQL Server 2019

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, sqlsrv, pdo, pdo_sqlsrv, odbc, pdo_odbc, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: sqlsrv
          DB_DATABASE: master
          DB_USERNAME: SA
          DB_PASSWORD: Forge123

  mssql_2017:
    runs-on: ubuntu-22.04
    timeout-minutes: 5

    services:
      sqlsrv:
        image: mcr.microsoft.com/mssql/server:2017-latest
        env:
          ACCEPT_EULA: Y
          SA_PASSWORD: Forge123
        ports:
          - 1433:1433

    strategy:
      fail-fast: true

    name: SQL Server 2017

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, sqlsrv, pdo, pdo_sqlsrv, odbc, pdo_odbc, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: sqlsrv
          DB_DATABASE: master
          DB_USERNAME: SA
          DB_PASSWORD: Forge123

  sqlite:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    strategy:
      fail-fast: true

    name: SQLite

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, sqlsrv, pdo, pdo_sqlsrv, odbc, pdo_odbc, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Setup SQLite Database
        run: php vendor/bin/testbench package:create-sqlite-db

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database/Sqlite
        env:
          DB_CONNECTION: sqlite
databases-nightly .github/workflows/databases-nightly.yml
Triggers
schedule
Runs on
ubuntu-24.04, ubuntu-24.04
Jobs
mysql_9, mariadb
Actions
shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry
Commands
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Database
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Database
View raw YAML
name: databases-nightly

on:
  schedule:
    - cron: '0 0 * * *'

jobs:
  mysql_9:
    runs-on: ubuntu-24.04

    services:
      mysql:
        image: mysql:9
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: laravel
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: MySQL 9

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: mysql

  mariadb:
    runs-on: ubuntu-24.04
    continue-on-error: true

    services:
      mariadb:
        image: quay.io/mariadb-foundation/mariadb-devel:verylatest
        env:
          MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: yes
          MARIADB_DATABASE: laravel
        ports:
          - 3306:3306
        options: --health-cmd="healthcheck.sh --connect --innodb_initialized" --health-interval=10s --health-timeout=5s --health-retries=3

    strategy:
      fail-fast: true

    name: MariaDB Very Latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Database
        env:
          DB_CONNECTION: mariadb
facades perms .github/workflows/facades.yml
Triggers
push, workflow_dispatch
Runs on
ubuntu-24.04
Jobs
update
Actions
shivammathur/setup-php, nick-fields/retry, stefanzweifel/git-auto-commit-action
Commands
  • composer config version "13.x-dev"
  • php -f vendor/bin/facade.php -- \ Illuminate\\Support\\Facades\\App \ Illuminate\\Support\\Facades\\Artisan \ Illuminate\\Support\\Facades\\Auth \ Illuminate\\Support\\Facades\\Blade \ Illuminate\\Support\\Facades\\Broadcast \ Illuminate\\Support\\Facades\\Bus \ Illuminate\\Support\\Facades\\Cache \ Illuminate\\Support\\Facades\\Concurrency \ Illuminate\\Support\\Facades\\Config \ Illuminate\\Support\\Facades\\Context \ Illuminate\\Support\\Facades\\Cookie \ Illuminate\\Support\\Facades\\Crypt \ Illuminate\\Support\\Facades\\Date \ Illuminate\\Support\\Facades\\DB \ Illuminate\\Support\\Facades\\Event \ Illuminate\\Support\\Facades\\Exceptions \ Illuminate\\Support\\Facades\\File \ Illuminate\\Support\\Facades\\Gate \ Illuminate\\Support\\Facades\\Hash \ Illuminate\\Support\\Facades\\Http \ Illuminate\\Support\\Facades\\Lang \ Illuminate\\Support\\Facades\\Log \ Illuminate\\Support\\Facades\\Mail \ Illuminate\\Support\\Facades\\MaintenanceMode \ Illuminate\\Support\\Facades\\Notification \ Illuminate\\Support\\Facades\\ParallelTesting \ Illuminate\\Support\\Facades\\Password \ Illuminate\\Support\\Facades\\Pipeline \ Illuminate\\Support\\Facades\\Process \ Illuminate\\Support\\Facades\\Queue \ Illuminate\\Support\\Facades\\RateLimiter \ Illuminate\\Support\\Facades\\Redirect \ Illuminate\\Support\\Facades\\Redis \ Illuminate\\Support\\Facades\\Request \ Illuminate\\Support\\Facades\\Response \ Illuminate\\Support\\Facades\\Route \ Illuminate\\Support\\Facades\\Schedule \ Illuminate\\Support\\Facades\\Schema \ Illuminate\\Support\\Facades\\Session \ Illuminate\\Support\\Facades\\Storage \ Illuminate\\Support\\Facades\\URL \ Illuminate\\Support\\Facades\\Validator \ Illuminate\\Support\\Facades\\View \ Illuminate\\Support\\Facades\\Vite
View raw YAML
name: facades

on:
  push:
    branches:
      - master
      - '*.x'
  workflow_dispatch:

permissions:
  contents: write

jobs:
  update:
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: true

    name: Facade DocBlocks

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: |
            composer config repositories.facade-documenter vcs git@github.com:laravel/facade-documenter.git
            composer require --dev laravel/facade-documenter:dev-main --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Update facade docblocks
        run: |
          php -f vendor/bin/facade.php -- \
            Illuminate\\Support\\Facades\\App \
            Illuminate\\Support\\Facades\\Artisan \
            Illuminate\\Support\\Facades\\Auth \
            Illuminate\\Support\\Facades\\Blade \
            Illuminate\\Support\\Facades\\Broadcast \
            Illuminate\\Support\\Facades\\Bus \
            Illuminate\\Support\\Facades\\Cache \
            Illuminate\\Support\\Facades\\Concurrency \
            Illuminate\\Support\\Facades\\Config \
            Illuminate\\Support\\Facades\\Context \
            Illuminate\\Support\\Facades\\Cookie \
            Illuminate\\Support\\Facades\\Crypt \
            Illuminate\\Support\\Facades\\Date \
            Illuminate\\Support\\Facades\\DB \
            Illuminate\\Support\\Facades\\Event \
            Illuminate\\Support\\Facades\\Exceptions \
            Illuminate\\Support\\Facades\\File \
            Illuminate\\Support\\Facades\\Gate \
            Illuminate\\Support\\Facades\\Hash \
            Illuminate\\Support\\Facades\\Http \
            Illuminate\\Support\\Facades\\Lang \
            Illuminate\\Support\\Facades\\Log \
            Illuminate\\Support\\Facades\\Mail \
            Illuminate\\Support\\Facades\\MaintenanceMode \
            Illuminate\\Support\\Facades\\Notification \
            Illuminate\\Support\\Facades\\ParallelTesting \
            Illuminate\\Support\\Facades\\Password \
            Illuminate\\Support\\Facades\\Pipeline \
            Illuminate\\Support\\Facades\\Process \
            Illuminate\\Support\\Facades\\Queue \
            Illuminate\\Support\\Facades\\RateLimiter \
            Illuminate\\Support\\Facades\\Redirect \
            Illuminate\\Support\\Facades\\Redis \
            Illuminate\\Support\\Facades\\Request \
            Illuminate\\Support\\Facades\\Response \
            Illuminate\\Support\\Facades\\Route \
            Illuminate\\Support\\Facades\\Schedule \
            Illuminate\\Support\\Facades\\Schema \
            Illuminate\\Support\\Facades\\Session \
            Illuminate\\Support\\Facades\\Storage \
            Illuminate\\Support\\Facades\\URL \
            Illuminate\\Support\\Facades\\Validator \
            Illuminate\\Support\\Facades\\View \
            Illuminate\\Support\\Facades\\Vite

      - name: Commit facade docblocks
        uses: stefanzweifel/git-auto-commit-action@v7
        with:
          commit_message: Update facade docblocks
          file_pattern: src/
issues perms .github/workflows/issues.yml
Triggers
issues
Runs on
Jobs
help-wanted
View raw YAML
name: issues

on:
  issues:
    types: [labeled]

permissions:
  issues: write

jobs:
  help-wanted:
    uses: laravel/.github/.github/workflows/issues.yml@main
pull-requests perms .github/workflows/pull-requests.yml
Triggers
pull_request_target
Runs on
Jobs
pull-requests
View raw YAML
name: pull requests

on:
  pull_request_target:
    types: [opened]

permissions:
  pull-requests: write

jobs:
  pull-requests:
    uses: laravel/.github/.github/workflows/pull-requests.yml@main
queues matrix .github/workflows/queues.yml
Triggers
push, pull_request
Runs on
ubuntu-24.04, ubuntu-24.04, ubuntu-24.04
Jobs
sync, database, beanstalkd
Matrix
include, include.pheanstalk, include.php→ 7, 8, 8.3, 8.4
Actions
shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry
Commands
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Queue
  • composer config version "13.x-dev"
  • php vendor/bin/testbench package:create-sqlite-db
  • vendor/bin/phpunit tests/Integration/Queue
  • curl -L https://github.com/beanstalkd/beanstalkd/archive/refs/tags/v1.13.tar.gz | tar xz
  • make
  • composer config version "13.x-dev"
View raw YAML
name: queues

on:
  push:
    branches:
      - master
      - '*.x'
  pull_request:

jobs:
  sync:
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: true

    name: Sync Driver

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Queue
        env:
          QUEUE_CONNECTION: sync

  database:
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: true

    name: Database Driver

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Setup SQLite Database
        run: php vendor/bin/testbench package:create-sqlite-db

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Queue
        env:
          DB_CONNECTION: sqlite
          QUEUE_CONNECTION: database

  beanstalkd:
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: true
      matrix:
        include:
          - php: 8.3
            pheanstalk: 7
          - php: 8.4
            pheanstalk: 8

    name: Beanstalkd Driver (pda/pheanstalk:^${{ matrix.pheanstalk }})

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Download & Extract beanstalkd
        run: curl -L https://github.com/beanstalkd/beanstalkd/archive/refs/tags/v1.13.tar.gz | tar xz

      - name: Make beanstalkd
        run: make
        working-directory: beanstalkd-1.13

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress --with="pda/pheanstalk:^${{ matrix.pheanstalk }}"

      - name: Daemonize beanstalkd
        run: ./beanstalkd-1.13/beanstalkd &

      - name: Execute tests
        run: vendor/bin/phpunit tests/Integration/Queue
        env:
          QUEUE_CONNECTION: beanstalkd
redis matrix .github/workflows/redis.yml
Triggers
push, pull_request
Runs on
ubuntu-24.04, ubuntu-24.04
Jobs
redis, redis-cluster
Matrix
client→ phpredis, predis
Actions
shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry, nick-fields/retry
Commands
  • composer config version "13.x-dev"
  • vendor/bin/phpunit tests/Integration/Cache
  • vendor/bin/phpunit tests/Integration/Queue
  • composer config version "13.x-dev"
  • sudo apt update sudo apt-get install -y --fix-missing redis-server sudo service redis-server stop redis-server --daemonize yes --port 7000 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-7000.conf redis-server --daemonize yes --port 7001 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-7001.conf redis-server --daemonize yes --port 7002 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-7002.conf redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0 --cluster-yes
  • vendor/bin/phpunit tests/Integration/Cache
  • vendor/bin/phpunit tests/Integration/Queue
View raw YAML
name: Redis and Redis Cluster

on:
  push:
    branches:
      - master
      - '*.x'
  pull_request:

jobs:
  redis:
    runs-on: ubuntu-24.04

    services:
      redis:
        image: redis:7.0
        ports:
          - 6379:6379
        options: --entrypoint redis-server

    strategy:
      fail-fast: true
      matrix:
        client: ['phpredis', 'predis']

    name: Redis (${{ matrix.client}}) Driver

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute Cache tests
        run: vendor/bin/phpunit tests/Integration/Cache
        env:
          CACHE_STORE: redis
          REDIS_CACHE_CONNECTION: cache
          REDIS_CACHE_LOCK_CONNECTION: cache
          REDIS_CLIENT: ${{ matrix.client }}

      - name: Execute Queue tests
        run: vendor/bin/phpunit tests/Integration/Queue
        env:
          REDIS_CLIENT: ${{ matrix.client }}
          QUEUE_CONNECTION: redis

  redis-cluster:
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: true
      matrix:
        client: ['phpredis', 'predis']

    name: Redis Cluster (${{ matrix.client}}) Driver

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Create Redis Cluster
        run: |
          sudo apt update
          sudo apt-get install -y --fix-missing redis-server
          sudo service redis-server stop
          redis-server --daemonize yes --port 7000 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-7000.conf
          redis-server --daemonize yes --port 7001 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-7001.conf
          redis-server --daemonize yes --port 7002 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-7002.conf
          redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0 --cluster-yes

      - name: Check Redis Cluster is ready
        uses: nick-fields/retry@v3
        with:
          timeout_seconds: 5
          max_attempts: 5
          retry_wait_seconds: 5
          retry_on: error
          command: |
            redis-cli -c -h 127.0.0.1 -p 7000 cluster info | grep "cluster_state:ok"
            redis-cli -c -h 127.0.0.1 -p 7001 cluster info | grep "cluster_state:ok"
            redis-cli -c -h 127.0.0.1 -p 7002 cluster info | grep "cluster_state:ok"

      - name: Execute Cache tests
        run: vendor/bin/phpunit tests/Integration/Cache
        env:
          CACHE_STORE: redis
          REDIS_CACHE_CONNECTION: default
          REDIS_CACHE_LOCK_CONNECTION: default
          REDIS_CLIENT: ${{ matrix.client }}
          REDIS_CLUSTER_HOSTS_AND_PORTS: 127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002

      - name: Execute Queue Tests
        run: vendor/bin/phpunit tests/Integration/Queue
        env:
          REDIS_CLIENT: ${{ matrix.client }}
          REDIS_CLUSTER_HOSTS_AND_PORTS: 127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002
          REDIS_QUEUE: '{default}'
          QUEUE_CONNECTION: redis

releases perms .github/workflows/releases.yml
Triggers
workflow_dispatch
Runs on
ubuntu-24.04
Jobs
release, update-changelog
Actions
stefanzweifel/git-auto-commit-action, appleboy/ssh-action, RedCrafter07/release-notes-action, softprops/action-gh-release
Commands
  • echo "version=${VERSION#v}" >> "$GITHUB_OUTPUT"
  • MAJOR_VERSION="${NUMERIC_VERSION%%.*}" BRANCH_MAJOR_VERSION="${BRANCH%%.*}" if [ "$MAJOR_VERSION" != "$BRANCH_MAJOR_VERSION" ]; then echo "Mismatched versions! Aborting." VERSION_MISMATCH='true'; else echo "Versions match! Proceeding." VERSION_MISMATCH='false'; fi echo "VERSION_MISMATCH=$(echo $VERSION_MISMATCH)" >> "$GITHUB_OUTPUT";
  • sed -i "s/const VERSION = '.*';/const VERSION = '${{ steps.version.outputs.version }}';/g" src/Illuminate/Foundation/Application.php
  • START_FROM=$(echo -n "$RELEASE_NOTES" | awk "/What's Changed/{ print NR; exit }" -) DROP_FROM_CONTRIBUTORS=$(echo -n "$RELEASE_NOTES" | awk "/New Contributors/{ print NR; exit }" -) DROP_FROM_FULL_CHANGELOG=$(echo -n "$RELEASE_NOTES" | awk "/Full Changelog/{ print NR; exit }" -) # Drop everything starting from "Full Changelog" if [ ! -z "$DROP_FROM_FULL_CHANGELOG" ]; then RELEASE_NOTES=$(echo -n "$RELEASE_NOTES" | sed "${DROP_FROM_FULL_CHANGELOG},$ d") fi # Drop everything starting from "New Contributors" if [ ! -z "$DROP_FROM_CONTRIBUTORS" ]; then RELEASE_NOTES=$(echo -n "$RELEASE_NOTES" | sed "${DROP_FROM_CONTRIBUTORS},$ d") fi # Drop the line "What's Changed" if [ ! -z "$START_FROM" ]; then RELEASE_NOTES=$(echo -n "$RELEASE_NOTES" | sed "${START_FROM}d") fi { echo 'notes<<EOF' echo "$RELEASE_NOTES" echo EOF } >> "$GITHUB_OUTPUT";
View raw YAML
name: manual release

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to release'
        required: true

permissions:
  contents: write

jobs:
  release:
    runs-on: ubuntu-24.04

    name: Release ${{ inputs.version }}

    outputs:
      version: ${{ steps.version.outputs.version }}
      notes: ${{ steps.cleaned-notes.outputs.notes }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Remove optional "v" prefix
        id: version
        run: |
          echo "version=${VERSION#v}" >> "$GITHUB_OUTPUT"
        env:
          VERSION: ${{ inputs.version }}

      - name: Check if branch and version match
        id: guard
        run: |
          MAJOR_VERSION="${NUMERIC_VERSION%%.*}"
          BRANCH_MAJOR_VERSION="${BRANCH%%.*}"

          if [ "$MAJOR_VERSION" != "$BRANCH_MAJOR_VERSION" ]; then
            echo "Mismatched versions! Aborting."
            VERSION_MISMATCH='true';
          else
            echo "Versions match! Proceeding."
            VERSION_MISMATCH='false';
          fi

          echo "VERSION_MISMATCH=$(echo $VERSION_MISMATCH)" >> "$GITHUB_OUTPUT";
        env:
          BRANCH: ${{ github.ref_name }}
          NUMERIC_VERSION: ${{ steps.version.outputs.version }}

      - name: Fail if branch and release tag do not match
        if: ${{ steps.guard.outputs.VERSION_MISMATCH == 'true' }}
        uses: actions/github-script@v7
        with:
          script: |
              core.setFailed('Workflow failed. Release version does not match with selected target branch. Did you select the correct branch?')

      - name: Update Application.php version
        run: sed -i "s/const VERSION = '.*';/const VERSION = '${{ steps.version.outputs.version }}';/g" src/Illuminate/Foundation/Application.php

      - name: Commit version change
        uses: stefanzweifel/git-auto-commit-action@v7
        with:
          commit_message: "Update version to v${{ steps.version.outputs.version }}"

      - name: SSH into splitter server
        uses: appleboy/ssh-action@master
        with:
          host: 104.248.56.26
          username: forge
          key: ${{ secrets.SSH_PRIVATE_KEY_SPLITTER }}
          script: |
            cd laravel-${{ github.ref_name }}
            git pull origin ${{ github.ref_name }}
            bash ./bin/release.sh v${{ steps.version.outputs.version }}
          script_stop: true

      - name: Generate release notes
        id: generated-notes
        uses: RedCrafter07/release-notes-action@main
        with:
          tag-name: v${{ steps.version.outputs.version }}
          token: ${{ secrets.GITHUB_TOKEN }}
          branch: ${{ github.ref_name }}

      - name: Cleanup release notes
        id: cleaned-notes
        run: |
          START_FROM=$(echo -n "$RELEASE_NOTES" | awk "/What's Changed/{ print NR; exit }" -)
          DROP_FROM_CONTRIBUTORS=$(echo -n "$RELEASE_NOTES" | awk "/New Contributors/{ print NR; exit }" -)
          DROP_FROM_FULL_CHANGELOG=$(echo -n "$RELEASE_NOTES" | awk "/Full Changelog/{ print NR; exit }" -)

          # Drop everything starting from "Full Changelog"
          if [ ! -z "$DROP_FROM_FULL_CHANGELOG" ]; then
              RELEASE_NOTES=$(echo -n "$RELEASE_NOTES" | sed "${DROP_FROM_FULL_CHANGELOG},$ d")
          fi

          # Drop everything starting from "New Contributors"
          if [ ! -z "$DROP_FROM_CONTRIBUTORS" ]; then
              RELEASE_NOTES=$(echo -n "$RELEASE_NOTES" | sed "${DROP_FROM_CONTRIBUTORS},$ d")
          fi

          # Drop the line "What's Changed"
          if [ ! -z "$START_FROM" ]; then
              RELEASE_NOTES=$(echo -n "$RELEASE_NOTES" | sed "${START_FROM}d")
          fi

          {
            echo 'notes<<EOF'
            echo "$RELEASE_NOTES"
            echo EOF
          } >> "$GITHUB_OUTPUT";
        env:
          RELEASE_NOTES: ${{ steps.generated-notes.outputs.release-notes }}

      - name: Create release
        uses: softprops/action-gh-release@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: v${{ steps.version.outputs.version }}
          name: v${{ steps.version.outputs.version }}
          body: ${{ steps.cleaned-notes.outputs.notes }}
          target_commitish: ${{ github.ref_name }}
          make_latest: "${{ github.ref_name == github.event.repository.default_branch }}"

  update-changelog:
    needs: release

    name: Update changelog

    uses: laravel/.github/.github/workflows/update-changelog.yml@main
    with:
      branch: ${{ github.ref_name }}
      version: "v${{ needs.release.outputs.version }}"
      notes: ${{ needs.release.outputs.notes }}
static-analysis matrix .github/workflows/static-analysis.yml
Triggers
push, pull_request
Runs on
ubuntu-24.04
Jobs
types
Matrix
directory→ src, types
Actions
shivammathur/setup-php, nick-fields/retry
Commands
  • composer config version "13.x-dev"
  • vendor/bin/phpstan --configuration="phpstan.${{ matrix.directory }}.neon.dist" --no-progress
View raw YAML
name: static analysis

on:
  push:
    branches:
      - master
      - '*.x'
  pull_request:

jobs:
  types:
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: true
      matrix:
        directory: [src, types]

    name: ${{ matrix.directory == 'src' && 'Source Code' || 'Types' }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress

      - name: Execute type checking
        run: vendor/bin/phpstan --configuration="phpstan.${{ matrix.directory }}.neon.dist" --no-progress
tests matrix .github/workflows/tests.yml
Triggers
push, pull_request, schedule
Runs on
ubuntu-24.04, windows-2022
Jobs
linux_tests, windows_tests
Matrix
exclude, exclude.php, exclude.phpunit, php, phpunit, stability→ 11.5.50, 12.5.8, 13.0.3, 8.3, 8.4, 8.5, prefer-lowest, prefer-stable
Actions
shivammathur/setup-php, nick-fields/retry, shivammathur/setup-php, nick-fields/retry
Commands
  • composer config version "13.x-dev"
  • vendor/bin/phpunit --display-deprecation ${{ matrix.stability == 'prefer-stable' && '--fail-on-deprecation' || '' }} --no-coverage
  • git config --global core.autocrlf false git config --global core.eol lf
  • composer config version "13.x-dev"
  • vendor/bin/phpunit --no-coverage
View raw YAML
name: tests

on:
  push:
    branches:
      - master
      - '*.x'
  pull_request:
  schedule:
    - cron: '0 0 * * *'

jobs:
  linux_tests:
    runs-on: ubuntu-24.04

    services:
      memcached:
        image: memcached:1.6-alpine
        ports:
          - 11211:11211
      mysql:
        image: mysql:8
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: forge
        ports:
          - 3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
      redis:
        image: redis:7.0
        ports:
          - 6379:6379
        options: --entrypoint redis-server
      dynamodb:
        image: amazon/dynamodb-local:2.0.0
        ports:
          - 8888:8000

    strategy:
      fail-fast: true
      matrix:
        php: [8.3, 8.4, 8.5]
        phpunit: ['11.5.50', '12.5.8', '13.0.3']
        stability: [prefer-lowest, prefer-stable]
        exclude:
          - php: 8.3
            phpunit: '13.0.3'

    name: PHP ${{ matrix.php }} - PHPUnit ${{ matrix.phpunit }} - ${{ matrix.stability }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, redis, igbinary, msgpack, memcached, gmp, :php-psr
          ini-values: error_reporting=E_ALL
          tools: composer:v2
          coverage: none
        env:
          REDIS_CONFIGURE_OPTS: --enable-redis --enable-redis-igbinary --enable-redis-msgpack --enable-redis-lzf --with-liblzf --enable-redis-zstd --with-libzstd --enable-redis-lz4 --with-liblz4
          REDIS_LIBS: liblz4-dev, liblzf-dev, libzstd-dev

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-progress --with="phpunit/phpunit:~${{ matrix.phpunit }}"

      - name: Execute tests
        run: vendor/bin/phpunit --display-deprecation ${{ matrix.stability == 'prefer-stable' && '--fail-on-deprecation' || '' }} --no-coverage
        env:
          DB_PORT: ${{ job.services.mysql.ports[3306] }}
          DB_USERNAME: root
          DYNAMODB_CACHE_TABLE: laravel_dynamodb_test
          DYNAMODB_ENDPOINT: "http://localhost:8888"
          AWS_ACCESS_KEY_ID: randomKey
          AWS_SECRET_ACCESS_KEY: randomSecret

      - name: Store artifacts
        uses: actions/upload-artifact@v6
        with:
          name: linux-logs-${{ matrix.php }}-${{ matrix.phpunit }}-${{ matrix.stability }}
          path: |
            vendor/orchestra/testbench-core/laravel/storage/logs
            !vendor/**/.gitignore

  windows_tests:
    runs-on: windows-2022

    strategy:
      fail-fast: true
      matrix:
        php: [8.3, 8.4, 8.5]
        phpunit: ['11.5.50', '12.5.8', '13.0.3']
        stability: [prefer-lowest, prefer-stable]
        exclude:
          - php: 8.3
            phpunit: '13.0.3'

    name: PHP ${{ matrix.php }} - PHPUnit ${{ matrix.phpunit }} - ${{ matrix.stability }} - Windows

    steps:
      - name: Set git to use LF
        run: |
          git config --global core.autocrlf false
          git config --global core.eol lf

      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: dom, curl, libxml, mbstring, zip, pdo, sqlite, pdo_sqlite, gd, pdo_mysql, fileinfo, ftp, redis, memcached, gmp, intl, :php-psr
          tools: composer:v2
          coverage: none

      - name: Set Framework version
        run: composer config version "13.x-dev"

      - name: Install dependencies
        uses: nick-fields/retry@v3
        with:
          timeout_minutes: 5
          max_attempts: 5
          command: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-progress --with="phpunit/phpunit:~${{ matrix.phpunit }}"

      - name: Execute tests
        run: vendor/bin/phpunit --no-coverage
        env:
          AWS_ACCESS_KEY_ID: random_key
          AWS_SECRET_ACCESS_KEY: random_secret

      - name: Store artifacts
        uses: actions/upload-artifact@v6
        with:
          name: windows-logs-${{ matrix.php }}-${{ matrix.phpunit }}-${{ matrix.stability }}
          path: |
            vendor/orchestra/testbench-core/laravel/storage/logs
            !vendor/**/.gitignore
update-assets perms .github/workflows/update-assets.yml
Triggers
push, pull_request
Runs on
ubuntu-latest
Jobs
update
Actions
stefanzweifel/git-auto-commit-action
Commands
  • npm ci --prefix "./src/Illuminate/Foundation/resources/exceptions/renderer" npm run build --prefix "./src/Illuminate/Foundation/resources/exceptions/renderer"
View raw YAML
name: 'update assets'

on:
  push:
    branches:
      - master
      - '*.x'
    paths:
      - 'src/Illuminate/Foundation/resources/exceptions/renderer/**'
      - '!src/Illuminate/Foundation/resources/exceptions/renderer/dist/**'
  pull_request:
    paths:
      - 'src/Illuminate/Foundation/resources/exceptions/renderer/**'
      - '!src/Illuminate/Foundation/resources/exceptions/renderer/dist/**'

permissions:
  contents: write

jobs:
  update:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v6

      - uses: actions/setup-node@v6
        with:
          node-version: 22

      - name: Update Exception Renderer Assets
        run: |
          npm ci --prefix "./src/Illuminate/Foundation/resources/exceptions/renderer"
          npm run build --prefix "./src/Illuminate/Foundation/resources/exceptions/renderer"

      - name: Commit Compiled Files
        uses: stefanzweifel/git-auto-commit-action@v7
        with:
          commit_message: Update Assets