name: CI/CD on: push: branches: - master jobs: test: name: Test runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.4' extensions: mbstring, dom, curl, sqlite3, pdo_sqlite coverage: none - name: Install Composer dependencies run: composer install --no-interaction --prefer-dist --optimize-autoloader - name: Copy environment file run: cp .env.example .env - name: Generate application key run: php artisan key:generate - name: Create SQLite database file run: touch database/database.sqlite - name: Run tests env: APP_ENV: testing CACHE_STORE: array DB_CONNECTION: sqlite DB_DATABASE: ':memory:' MAIL_MAILER: array QUEUE_CONNECTION: sync SESSION_DRIVER: array run: php artisan test --compact build: name: Build needs: test runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.4' extensions: mbstring, dom, curl, sqlite3, pdo_sqlite coverage: none - name: Install Composer dependencies (production) run: composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: Install Node dependencies run: npm ci - name: Build frontend assets run: npm run build - name: Create deployment archive run: | tar --exclude='.git' \ --exclude='.gitea' \ --exclude='node_modules' \ --exclude='tests' \ --exclude='.env' \ --exclude='*.md' \ -czf /tmp/deploy.tar.gz . - name: Upload deployment artifact uses: actions/upload-artifact@v4 with: name: deploy path: /tmp/deploy.tar.gz retention-days: 7 deploy: name: Deploy needs: build runs-on: ubuntu-latest steps: - name: Download deployment artifact uses: actions/download-artifact@v4 with: name: deploy path: /tmp - name: Setup SSH known hosts env: SSH_HOST: ${{ secrets.SSH_HOST }} SSH_PORT: ${{ secrets.SSH_PORT }} run: | mkdir -p ~/.ssh ssh-keyscan -p "${SSH_PORT:-22}" "$SSH_HOST" >> ~/.ssh/known_hosts - name: Install sshpass run: sudo apt-get install -y sshpass - name: Upload archive to server env: SSH_HOST: ${{ secrets.SSH_HOST }} SSH_PASSWORD: ${{ secrets.SSH_PASSWORD }} SSH_PORT: ${{ secrets.SSH_PORT }} SSH_USER: ${{ secrets.SSH_USER }} DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} run: | sshpass -p "$SSH_PASSWORD" \ rsync -az --no-perms \ -e "ssh -p ${SSH_PORT:-22}" \ /tmp/deploy.tar.gz \ "$SSH_USER@$SSH_HOST:$DEPLOY_PATH/deploy.tar.gz" - name: Extract and deploy on server env: SSH_HOST: ${{ secrets.SSH_HOST }} SSH_PASSWORD: ${{ secrets.SSH_PASSWORD }} SSH_PORT: ${{ secrets.SSH_PORT }} SSH_USER: ${{ secrets.SSH_USER }} DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} ENV_FILE: ${{ secrets.ENV_FILE }} run: | sshpass -p "$SSH_PASSWORD" \ ssh -p "${SSH_PORT:-22}" \ "$SSH_USER@$SSH_HOST" << ENDSSH set -e DEPLOY_PATH="$DEPLOY_PATH" cd "$DEPLOY_PATH" # Extract archive tar -xzf deploy.tar.gz rm deploy.tar.gz # Write .env from secret cat > .env << 'ENDENV' $ENV_FILE ENDENV # Run post-deploy commands php artisan config:cache php artisan route:cache php artisan view:cache php artisan migrate --force --no-interaction php artisan queue:restart ENDSSH