Merge pull request #149 from akunzai/dependabot/composer/friendsofphp… #164
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: E2E Tests | |
| on: | |
| push: | |
| branches: | |
| - main | |
| paths-ignore: | |
| - '*.md' | |
| - 'docs/**' | |
| pull_request: | |
| branches: | |
| - main | |
| paths-ignore: | |
| - '*.md' | |
| - 'docs/**' | |
| workflow_dispatch: | |
| env: | |
| ADMIN_USERNAME: admin | |
| ADMIN_PASSWORD: ChangeTheP@ssw0rd | |
| OPENMAGE_ADMIN_USERNAME: admin | |
| OPENMAGE_ADMIN_PASSWORD: ChangeTheP@ssw0rd | |
| BASE_URL: https://www.dev.local | |
| OPENMAGE_URL: https://store.dev.local | |
| permissions: | |
| contents: read | |
| jobs: | |
| e2e: | |
| name: E2E Tests (Joomla ${{ matrix.joomla.version }}) | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| joomla: | |
| - version: '6' | |
| compose-override: '' | |
| cache-scope: 'joomla6' | |
| joomla-version: '' | |
| php-version: '' | |
| - version: '5' | |
| compose-override: 'compose.joomla5.yml' | |
| cache-scope: 'joomla5' | |
| joomla-version: '5.4.1' | |
| php-version: '8.3' | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| # Prepare host environment | |
| - name: Create required directories and certificates | |
| working-directory: .devcontainer | |
| run: | | |
| mkdir -p joomla/logs openmage/logs openmage/.cache | |
| ./generate-certs.sh .secrets | |
| echo "127.0.0.1 www.dev.local store.dev.local" | sudo tee -a /etc/hosts | |
| # Cache OpenMage sample data (using unified cache action for reliability) | |
| - name: Cache OpenMage sample data | |
| uses: actions/cache@v5 | |
| with: | |
| path: .devcontainer/openmage/.cache | |
| key: ${{ runner.os }}-openmage-sample-data-1.9.2.4 | |
| restore-keys: | | |
| ${{ runner.os }}-openmage-sample-data- | |
| # Docker image preparation | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Build Joomla image | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: .devcontainer/joomla | |
| tags: joomla:magebridge | |
| build-args: | | |
| ${{ matrix.joomla.joomla-version != '' && format('JOOMLA_VERSION={0}', matrix.joomla.joomla-version) || '' }} | |
| ${{ matrix.joomla.php-version != '' && format('PHP_VERSION={0}', matrix.joomla.php-version) || '' }} | |
| cache-from: type=gha,scope=${{ matrix.joomla.cache-scope }} | |
| cache-to: type=gha,scope=${{ matrix.joomla.cache-scope }},mode=max | |
| load: true | |
| - name: Build OpenMage image | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: .devcontainer/openmage | |
| tags: openmage:magebridge | |
| cache-from: type=gha,scope=openmage | |
| cache-to: type=gha,scope=openmage,mode=max | |
| load: true | |
| # Start services and install applications | |
| - name: Start Docker Compose services | |
| working-directory: .devcontainer | |
| run: | | |
| if [ -n "${{ matrix.joomla.compose-override }}" ]; then | |
| docker compose -f compose.yml -f ${{ matrix.joomla.compose-override }} up -d --no-build | |
| else | |
| docker compose up -d --no-build | |
| fi | |
| - name: Set COMPOSE_FILE environment variable | |
| run: | | |
| if [ -n "${{ matrix.joomla.compose-override }}" ]; then | |
| echo "COMPOSE_FILE=compose.yml:${{ matrix.joomla.compose-override }}" >> $GITHUB_ENV | |
| else | |
| echo "COMPOSE_FILE=compose.yml" >> $GITHUB_ENV | |
| fi | |
| working-directory: .devcontainer | |
| - name: Install Joomla | |
| working-directory: .devcontainer | |
| env: | |
| ADMIN_USERNAME: ${{ env.ADMIN_USERNAME }} | |
| ADMIN_PASSWORD: ${{ env.ADMIN_PASSWORD }} | |
| run: ./joomla/install.sh | |
| - name: Install OpenMage | |
| working-directory: .devcontainer | |
| env: | |
| ADMIN_USERNAME: ${{ env.OPENMAGE_ADMIN_USERNAME }} | |
| ADMIN_PASSWORD: ${{ env.OPENMAGE_ADMIN_PASSWORD }} | |
| INSTALL_SAMPLE_DATA: 'true' | |
| run: ./openmage/install.sh | |
| - name: Fix directory permissions | |
| run: sudo chown -R $USER:$USER . | |
| - name: Seed MageBridge test data | |
| working-directory: .devcontainer | |
| run: ./joomla/seed-test-data.sh | |
| - name: Verify Joomla SSL connection to OpenMage | |
| working-directory: .devcontainer | |
| run: | | |
| echo "Testing SSL connection from Joomla to OpenMage..." | |
| docker compose exec -T joomla sh -c 'curl -sf https://store.dev.local/api/soap?wsdl > /dev/null && echo "✓ SSL connection successful" || (echo "✗ SSL connection failed" && exit 1)' | |
| echo "Verifying OpenMage SOAP API endpoint..." | |
| docker compose exec -T joomla sh -c 'curl -sf https://store.dev.local/api/soap?wsdl | grep -q "OpenMage" && echo "✓ OpenMage SOAP API WSDL available" || (echo "✗ OpenMage SOAP API WSDL NOT available" && exit 1)' | |
| # Setup Node.js and pnpm early to avoid permission issues | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: '24' | |
| - name: Enable Corepack | |
| run: corepack enable pnpm | |
| - name: Get pnpm store directory | |
| shell: bash | |
| run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV | |
| - name: Cache pnpm store | |
| uses: actions/cache@v5 | |
| with: | |
| path: ${{ env.STORE_PATH }} | |
| key: ${{ runner.os }}-pnpm-store-${{ hashFiles('e2e/pnpm-lock.yaml') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pnpm-store- | |
| - name: Install E2E dependencies | |
| working-directory: e2e | |
| run: pnpm install | |
| - name: Get Playwright version | |
| working-directory: e2e | |
| run: echo "PLAYWRIGHT_VERSION=$(pnpm exec playwright --version | cut -d' ' -f2)" >> $GITHUB_ENV | |
| - name: Cache Playwright browsers | |
| uses: actions/cache@v5 | |
| id: playwright-cache | |
| with: | |
| path: ~/.cache/ms-playwright | |
| key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }} | |
| - name: Install Playwright browsers and dependencies | |
| working-directory: e2e | |
| run: | | |
| if [ "${{ steps.playwright-cache.outputs.cache-hit }}" != 'true' ]; then | |
| echo "Cache miss - Installing browsers with system dependencies..." | |
| pnpm exec playwright install --with-deps chromium | |
| else | |
| echo "Cache hit - Installing system dependencies only..." | |
| pnpm exec playwright install-deps chromium | |
| fi | |
| # Run E2E tests | |
| - name: Run E2E tests | |
| working-directory: e2e | |
| run: pnpm exec playwright test --reporter=html,github | |
| - name: Upload Playwright report | |
| uses: actions/upload-artifact@v6 | |
| if: always() | |
| with: | |
| name: playwright-report-joomla-${{ matrix.joomla.version }} | |
| path: e2e/playwright-report/ | |
| retention-days: 7 | |
| - name: Upload test results | |
| uses: actions/upload-artifact@v6 | |
| if: failure() | |
| with: | |
| name: test-results-joomla-${{ matrix.joomla.version }} | |
| path: e2e/test-results/ | |
| retention-days: 7 | |
| - name: Collect diagnostic information on failure | |
| if: failure() | |
| working-directory: .devcontainer | |
| run: | | |
| echo "==================================================" | |
| echo "Diagnostic Information Collection (Joomla ${{ matrix.joomla.version }})" | |
| echo "==================================================" | |
| echo "" | |
| echo "=== Container Status ===" | |
| docker compose ps | |
| echo "" | |
| echo "=== Joomla Container Logs (last 100 lines) ===" | |
| docker compose logs joomla --tail=100 | |
| echo "" | |
| echo "=== OpenMage Container Logs (last 100 lines) ===" | |
| docker compose logs openmage --tail=100 | |
| echo "" | |
| echo "=== MySQL Container Logs (last 50 lines) ===" | |
| docker compose logs mysql --tail=50 | |
| echo "" | |
| echo "=== Joomla Error Logs ===" | |
| docker compose exec joomla sh -c 'tail -100 /var/www/html/administrator/logs/everything.php 2>/dev/null || echo "No Joomla error logs found"' | |
| echo "" | |
| echo "=== OpenMage System Log ===" | |
| docker compose exec openmage sh -c 'tail -50 /var/www/html/var/log/system.log 2>/dev/null || echo "No OpenMage system.log found"' | |
| echo "" | |
| echo "=== OpenMage Exception Log ===" | |
| docker compose exec openmage sh -c 'tail -50 /var/www/html/var/log/exception.log 2>/dev/null || echo "No OpenMage exception.log found"' | |
| echo "" | |
| echo "=== MageBridge Configuration Dump ===" | |
| docker compose exec mysql mysql -u root -psecret joomla -e \ | |
| "SELECT name, value FROM jos_magebridge_config WHERE name IN ('offline', 'host', 'api_user', 'protocol', 'enforce_ssl', 'debug_log') ORDER BY name;" \ | |
| 2>/dev/null || echo "Could not query MageBridge config" | |
| echo "" | |
| echo "=== MageBridge Recent Logs (if debug enabled) ===" | |
| docker compose exec mysql mysql -u root -psecret joomla -e \ | |
| "SELECT id, timestamp, message, type, origin FROM jos_magebridge_log ORDER BY id DESC LIMIT 20;" \ | |
| 2>/dev/null || echo "Could not query MageBridge logs" | |
| echo "" | |
| echo "=== Network Connectivity Test ===" | |
| echo "Testing Joomla -> OpenMage connectivity..." | |
| docker compose exec joomla sh -c 'curl -ksf https://store.dev.local/api/soap?wsdl > /dev/null 2>&1 && echo "✓ SOAP API WSDL accessible" || echo "✗ SOAP API WSDL NOT accessible"' | |
| echo "" | |
| echo "Testing OpenMage -> MySQL connectivity..." | |
| docker compose exec openmage sh -c 'php -r "require_once \"app/Mage.php\"; Mage::app(); echo \"✓ OpenMage can connect to database\n\";" 2>&1 || echo "✗ OpenMage database connection failed"' | |
| echo "" | |
| echo "==================================================" | |
| echo "Diagnostic collection completed" | |
| echo "==================================================" | |
| - name: Upload diagnostic logs | |
| if: failure() | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: diagnostic-logs-joomla-${{ matrix.joomla.version }} | |
| path: | | |
| .devcontainer/joomla/logs/ | |
| .devcontainer/openmage/logs/ | |
| retention-days: 7 | |
| if-no-files-found: ignore | |
| - name: Stop Docker Compose services | |
| if: always() | |
| working-directory: .devcontainer | |
| run: docker compose down -v |