name: Realistic E2E CI on: push: paths: - 'webapp/**' - 'backend/**' - 'neo4j/**' - 'cypress/**' - '.github/workflows/test-e2e.yml' jobs: prepare_backend_environment: name: Fullstack | prepare backend environment runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Copy env files run: | cp backend/.env.test_e2e backend/.env || true cp webapp/.env.template webapp/.env || true - name: Build backend and dependencies run: | docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach backend --build - name: Save docker images to disk run: | docker save ocelotsocialnetwork/backend:test > /tmp/backend.tar docker save ocelotsocialnetwork/neo4j:test > /tmp/neo4j.tar docker save ocelotsocialnetwork/webapp:test > /tmp/webapp.tar - name: Cache docker images uses: actions/cache@v4 with: path: | /tmp/backend.tar /tmp/neo4j.tar /tmp/webapp.tar key: ${{ github.run_id }}-e2e-images - name: Shutdown services after image save run: docker compose -f docker-compose.yml -f docker-compose.test.yml down run_tests: name: Run Cypress Tests Against Docker Setup runs-on: ubuntu-latest needs: prepare_backend_environment steps: - name: Checkout code uses: actions/checkout@v4 - name: Restore docker image cache uses: actions/cache@v4 with: path: | /tmp/backend.tar /tmp/neo4j.tar /tmp/webapp.tar key: ${{ github.run_id }}-e2e-images - name: Load Docker Images run: | docker load -i /tmp/backend.tar docker load -i /tmp/neo4j.tar docker load -i /tmp/webapp.tar - name: Prepare env files run: | cp backend/.env.test_e2e backend/.env || true cp webapp/.env.template webapp/.env || true - name: Restore Cypress cache uses: actions/cache@v4 with: path: | ~/.cache/Cypress ./cypress /opt/cucumber-json-formatter key: ${{ runner.os }}-cypress-${{ hashFiles('**/package-lock.json') }} - name: Install dependencies run: | cd backend && yarn install && yarn build cd .. && yarn install - name: Start selected services via Compose run: | docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach backend mailserver webapp - name: Wait for webapp to be ready uses: jakejarvis/wait-action@v0.1.0 with: url: http://localhost:3000 timeout: 120000 - name: Run Cypress Tests run: yarn run cypress:run --spec $(cypress/parallel-features.sh 1 1) - name: Show service logs on failure if: failure() run: | docker compose -f docker-compose.yml -f docker-compose.test.yml logs backend docker compose -f docker-compose.yml -f docker-compose.test.yml logs webapp - name: Shutdown Docker Compose if: always() run: docker compose -f docker-compose.yml -f docker-compose.test.yml down