diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..c84dabb4 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,82 @@ +name: Docker Compose Test + +on: + push: + branches: + - master + - '*.x' + pull_request: + +permissions: + contents: read + +jobs: + tests: + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + include: + - php: '8.0' + laravel: 9 + - php: '8.1' + laravel: 10 + - php: '8.2' + laravel: 11 + - php: '8.3' + laravel: 11 + + name: PHP ${{ matrix.php }} - L${{ matrix.laravel }} + + steps: + + - name: Checkout code + uses: actions/checkout@v4 + with: + path: 'sail' + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: dom, curl, libxml, mbstring, zip, fileinfo + ini-values: error_reporting=E_ALL + tools: composer:v2 + coverage: none + + - name: Create a new laravel application + run: composer create-project laravel/laravel app "${{ matrix.laravel }}.x" --remove-vcs --no-interaction --prefer-dist + + - name: Link Sail Repository + run: | + composer config minimum-stability dev + composer config repositories.sail path ../sail + composer require laravel/sail:* --dev -W + working-directory: app + + - name: Install Sail into App + run: | + php artisan sail:install --php=${{ matrix.php }} --no-interaction + php artisan sail:publish --no-interaction + working-directory: app + + - name: Remove Sail + run: composer remove laravel/sail --dev --no-interaction -W + working-directory: app + + - name: Start Sail Container + run: ../sail/bin/sail up -d --wait + working-directory: app + + - name: Run Migrations + run: ../sail/bin/sail artisan migrate --no-interaction + working-directory: app + + - name: Run Tests in Sail Container + run: ../sail/bin/sail test + working-directory: app + + - name: Stop Sail Container + run: ../sail/bin/sail down + working-directory: app diff --git a/src/Console/Concerns/InteractsWithDockerComposeServices.php b/src/Console/Concerns/InteractsWithDockerComposeServices.php index 0404525b..d972127f 100644 --- a/src/Console/Concerns/InteractsWithDockerComposeServices.php +++ b/src/Console/Concerns/InteractsWithDockerComposeServices.php @@ -116,7 +116,11 @@ protected function buildDockerCompose(array $services) $compose['services']['selenium']['image'] = 'seleniarm/standalone-chromium'; } - file_put_contents($this->laravel->basePath('docker-compose.yml'), Yaml::dump($compose, Yaml::DUMP_OBJECT_AS_MAP)); + $yaml = Yaml::dump($compose, Yaml::DUMP_OBJECT_AS_MAP); + + $yaml = str_replace('{{PHP_VERSION}}', $this->option('php'), $yaml); + + file_put_contents($this->laravel->basePath('docker-compose.yml'), $yaml); } /** diff --git a/src/Console/InstallCommand.php b/src/Console/InstallCommand.php index 9b197ee7..d2b3ada3 100644 --- a/src/Console/InstallCommand.php +++ b/src/Console/InstallCommand.php @@ -19,7 +19,8 @@ class InstallCommand extends Command */ protected $signature = 'sail:install {--with= : The services that should be included in the installation} - {--devcontainer : Create a .devcontainer configuration directory}'; + {--devcontainer : Create a .devcontainer configuration directory} + {--php=8.3 : The PHP version that should be used}'; /** * The console command description. diff --git a/stubs/docker-compose.stub b/stubs/docker-compose.stub index 9619b379..c574efcb 100644 --- a/stubs/docker-compose.stub +++ b/stubs/docker-compose.stub @@ -2,11 +2,11 @@ services: laravel.test: build: - context: ./vendor/laravel/sail/runtimes/8.3 + context: ./vendor/laravel/sail/runtimes/{{PHP_VERSION}} dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' - image: sail-8.3/app + image: sail-{{PHP_VERSION}}/app extra_hosts: - 'host.docker.internal:host-gateway' ports: