diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7ac2892 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,48 @@ +name: CI + +on: + push: + branches: ["**"] + pull_request: + +jobs: + quality: + name: PHP ${{ matrix.php }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ["8.4"] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - name: Validate composer.json + run: composer validate --strict + + - name: Install dependencies + run: composer install --no-interaction --no-progress --prefer-dist + + - name: Run CI checks + run: composer ci + + - name: Build app + if: matrix.php == '8.4' + env: + APP_ENV: development + run: php laracord app:build + + - name: Upload build artifact + if: matrix.php == '8.4' + uses: actions/upload-artifact@v4 + with: + name: laracord-build-php84 + path: builds/laracord + if-no-files-found: error \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5511856 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM composer:2-php8.4 AS builder + +WORKDIR /build +ENV APP_ENV=development + +COPY composer.json composer.lock* ./ +RUN composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader + +COPY . . +RUN php laracord app:build \ + && mkdir -p /out \ + && cp builds/laracord /out/laracord + +FROM php:8.4-cli-alpine AS runtime + +WORKDIR /app +COPY --from=builder /out/laracord /app/laracord +RUN chmod +x /app/laracord + +CMD ["php", "/app/laracord"] \ No newline at end of file diff --git a/composer.json b/composer.json index 48bdef9..ec3f7a6 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,11 @@ "name": "laracord/laracord", "type": "project", "description": "Create Discord bots harnessing the full power of Laravel.", - "keywords": ["framework", "laravel", "discord"], + "keywords": [ + "framework", + "laravel", + "discord" + ], "license": "MIT", "require": { "php": "^8.2", @@ -20,6 +24,20 @@ } }, "scripts": { + "lint": [ + "@php scripts/php-lint.php" + ], + "format:check": [ + "vendor/bin/pint --test" + ], + "ci": [ + "@composer validate --strict", + "@composer lint", + "@composer format:check" + ], + "ci:build": [ + "php laracord app:build" + ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ] @@ -34,4 +52,4 @@ }, "minimum-stability": "dev", "prefer-stable": true -} +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..cb74264 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +services: + mimic: + build: + context: . + dockerfile: Dockerfile + container_name: mimic + restart: unless-stopped + volumes: + - ./.env:/app/.env:ro \ No newline at end of file diff --git a/scripts/php-lint.php b/scripts/php-lint.php new file mode 100644 index 0000000..b4adef4 --- /dev/null +++ b/scripts/php-lint.php @@ -0,0 +1,28 @@ +isFile() || $file->getExtension() !== 'php') { + continue; + } + + $command = sprintf('php -l %s', escapeshellarg($file->getPathname())); + passthru($command, $exitCode); + + if ($exitCode !== 0) { + exit($exitCode); + } + } +}