From b051aeeb6409e1f3247e8871c532b43affdd63b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Arroba?= <19954079+cesararroba@users.noreply.github.com> Date: Thu, 24 Jul 2025 16:54:01 +0200 Subject: [PATCH] chore(gha): automate e2e tests with new workflow (#8361) --- .github/workflows/ui-e2e-tests.yml | 107 ++++++++++++++++++++++++++ .github/workflows/ui-pull-request.yml | 98 ----------------------- 2 files changed, 107 insertions(+), 98 deletions(-) create mode 100644 .github/workflows/ui-e2e-tests.yml diff --git a/.github/workflows/ui-e2e-tests.yml b/.github/workflows/ui-e2e-tests.yml new file mode 100644 index 0000000000..08c1c89482 --- /dev/null +++ b/.github/workflows/ui-e2e-tests.yml @@ -0,0 +1,107 @@ +name: UI - E2E Tests + +on: + pull_request: + branches: + - master + - "v5.*" + paths: + - '.github/workflows/ui-e2e-tests.yml' + - 'ui/**' + +jobs: + e2e-tests: + if: github.repository == 'prowler-cloud/prowler' + runs-on: ubuntu-latest + env: + AUTH_SECRET: 'fallback-ci-secret-for-testing' + AUTH_TRUST_HOST: true + NEXTAUTH_URL: 'http://localhost:3000' + NEXT_PUBLIC_API_BASE_URL: 'http://localhost:8080/api/v1' + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Start API services + run: | + docker compose up -d api worker worker-beat + - name: Wait for API to be ready + run: | + echo "Waiting for prowler-api..." + timeout=150 # 5 minutes max + elapsed=0 + while [ $elapsed -lt $timeout ]; do + if curl -s ${NEXT_PUBLIC_API_BASE_URL}/docs >/dev/null 2>&1; then + echo "Prowler API is ready!" + exit 0 + fi + echo "Waiting for prowler-api... (${elapsed}s elapsed)" + sleep 5 + elapsed=$((elapsed + 5)) + done + echo "Timeout waiting for prowler-api to start" + exit 1 + - name: Run database migrations + run: | + echo "Running Django migrations..." + docker compose exec -T api sh -c ' + poetry run python manage.py migrate --database admin + ' + echo "Database migrations completed!" + # TODO: Delete this step once API image is built with new fixtures (Prowler 5.10.0) + - name: Copy local fixtures into API container + run: | + # Get the actual container name dynamically + CONTAINER_NAME=$(docker compose ps -q api) + docker cp ./api/src/backend/api/fixtures/dev/. ${CONTAINER_NAME}:/home/prowler/backend/api/fixtures/dev + - name: Load database fixtures for E2E tests + run: | + docker compose exec -T api sh -c ' + echo "Loading all fixtures from api/fixtures/dev/..." + for fixture in api/fixtures/dev/*.json; do + if [ -f "$fixture" ]; then + echo "Loading $fixture" + poetry run python manage.py loaddata "$fixture" --database admin + fi + done + echo "All database fixtures loaded successfully!" + ' + - name: Setup Node.js environment + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: '20.x' + cache: 'npm' + cache-dependency-path: './ui/package-lock.json' + - name: Install UI dependencies + working-directory: ./ui + run: npm ci + - name: Build UI application + working-directory: ./ui + run: npm run build + - name: Cache Playwright browsers + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + id: playwright-cache + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ hashFiles('ui/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-playwright- + - name: Install Playwright browsers + working-directory: ./ui + if: steps.playwright-cache.outputs.cache-hit != 'true' + run: npm run test:e2e:install + - name: Run E2E tests + working-directory: ./ui + run: npm run test:e2e + - name: Upload test reports + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + if: failure() + with: + name: playwright-report + path: ui/playwright-report/ + retention-days: 30 + - name: Cleanup services + if: always() + run: | + echo "Shutting down services..." + docker compose down -v || true + echo "Cleanup completed" diff --git a/.github/workflows/ui-pull-request.yml b/.github/workflows/ui-pull-request.yml index ad22630e32..1925f6c230 100644 --- a/.github/workflows/ui-pull-request.yml +++ b/.github/workflows/ui-pull-request.yml @@ -46,104 +46,6 @@ jobs: working-directory: ./ui run: npm run build - e2e-tests: - runs-on: ubuntu-latest - env: - AUTH_SECRET: 'fallback-ci-secret-for-testing' - AUTH_TRUST_HOST: true - NEXTAUTH_URL: http://localhost:3000 - PROWLER_API_PORT: 8080 - NEXT_PUBLIC_API_BASE_URL: ${{ secrets.API_BASE_URL || 'http://localhost:8080/api/v1' }} - E2E_USER: ${{ secrets.E2E_USER }} - E2E_PASSWORD: ${{ secrets.E2E_PASSWORD }} - steps: - - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - persist-credentials: false - - name: Start needed services with docker compose - if: github.repository == 'prowler-cloud/prowler' - run: | - docker compose up -d api worker worker-beat - - name: Wait for prowler-api to respond - if: github.repository == 'prowler-cloud/prowler' - run: | - echo "Waiting for prowler-api..." - for i in {1..30}; do - if curl -s http://localhost:${PROWLER_API_PORT}/api/v1/docs >/dev/null 2>&1; then - echo "Prowler API is ready!" - break - fi - echo "Waiting for prowler-api... (attempt $i/30)" - sleep 3 - done - - name: Run database migrations - if: github.repository == 'prowler-cloud/prowler' - run: | - echo "Running Django migrations..." - docker compose exec -T api sh -c ' - poetry run python manage.py migrate --database admin - ' - echo "Database migrations completed!" - - name: Copy local fixtures into API container - if: github.repository == 'prowler-cloud/prowler' - run: | - docker cp ./api/src/backend/api/fixtures/dev/. prowler-api-1:/home/prowler/backend/api/fixtures/dev - - name: Load database fixtures for e2e tests - if: github.repository == 'prowler-cloud/prowler' - run: | - docker compose exec -T api sh -c ' - echo "Loading all fixtures from api/fixtures/dev/..." - for fixture in api/fixtures/dev/*.json; do - if [ -f "$fixture" ]; then - echo "Loading $fixture" - poetry run python manage.py loaddata "$fixture" --database admin - fi - done - echo "All database fixtures loaded successfully!" - ' - - name: Setup Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: '20.x' - cache: 'npm' - cache-dependency-path: './ui/package-lock.json' - - name: Install dependencies - working-directory: ./ui - run: npm ci - - name: Build the application - working-directory: ./ui - run: npm run build - - name: Cache Playwright browsers - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 - id: playwright-cache - with: - path: ~/.cache/ms-playwright - key: ${{ runner.os }}-playwright-${{ hashFiles('ui/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-playwright- - - name: Install Playwright browsers - working-directory: ./ui - if: steps.playwright-cache.outputs.cache-hit != 'true' - run: npm run test:e2e:install - - name: Run Playwright tests - working-directory: ./ui - run: npm run test:e2e - - name: Upload Playwright report - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 - if: failure() - with: - name: playwright-report - path: ui/playwright-report/ - retention-days: 30 - - - name: Cleanup services - if: github.repository == 'prowler-cloud/prowler' - run: | - echo "Shutting down services..." - docker-compose down -v || true - echo "Cleanup completed" - test-container-build: runs-on: ubuntu-latest steps: