name: CI on: push: branches: [main, develop] pull_request: branches: [main, develop] jobs: tests: runs-on: ubuntu-latest services: mysql: image: mysql:8.0 env: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: laravel_test ports: - 3306:3306 options: >- --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 redis: image: redis:alpine ports: - 6379:6379 options: >- --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: mbstring, dom, fileinfo, mysql, redis coverage: pcov - name: Get Composer cache directory id: composer-cache run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache Composer dependencies uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- - name: Install Composer dependencies working-directory: ./src run: composer install --no-progress --prefer-dist --optimize-autoloader - name: Copy .env working-directory: ./src run: | cp .env.example .env php artisan key:generate - name: Configure test environment working-directory: ./src run: | echo "DB_CONNECTION=mysql" >> .env echo "DB_HOST=127.0.0.1" >> .env echo "DB_PORT=3306" >> .env echo "DB_DATABASE=laravel_test" >> .env echo "DB_USERNAME=root" >> .env echo "DB_PASSWORD=password" >> .env echo "REDIS_HOST=127.0.0.1" >> .env echo "CACHE_DRIVER=redis" >> .env echo "QUEUE_CONNECTION=redis" >> .env - name: Run migrations working-directory: ./src run: php artisan migrate --force - name: Run tests working-directory: ./src run: php artisan test --parallel - name: Check code style working-directory: ./src run: ./vendor/bin/pint --test deploy-staging: needs: tests runs-on: ubuntu-latest if: github.ref == 'refs/heads/develop' && github.event_name == 'push' steps: - name: Checkout code uses: actions/checkout@v4 - name: Deploy to staging uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.STAGING_HOST }} username: ${{ secrets.STAGING_USER }} key: ${{ secrets.STAGING_SSH_KEY }} script: | cd /var/www/staging git pull origin develop composer install --no-dev --optimize-autoloader php artisan migrate --force php artisan config:cache php artisan route:cache php artisan view:cache php artisan queue:restart deploy-production: needs: tests runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' && github.event_name == 'push' environment: production steps: - name: Checkout code uses: actions/checkout@v4 - name: Deploy to production uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.PRODUCTION_HOST }} username: ${{ secrets.PRODUCTION_USER }} key: ${{ secrets.PRODUCTION_SSH_KEY }} script: | cd /var/www/production php artisan down git pull origin main composer install --no-dev --optimize-autoloader php artisan migrate --force php artisan config:cache php artisan route:cache php artisan view:cache php artisan queue:restart php artisan up