Ocelot-Social/.github/workflows/cache-verify.yml
resonic-user a4c1d6c4b6 e2e
2025-06-17 21:13:21 +00:00

228 lines
7.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: test_e2e_reworked
on:
push:
paths:
- '.github/workflows/cache-verify.yml'
workflow_dispatch:
jobs:
build-images:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- name: backend
context: ./backend
dockerfile: ./backend/Dockerfile
target: build
- name: webapp
context: ./webapp
dockerfile: ./webapp/Dockerfile
target: build
- name: neo4j
context: ./neo4j
dockerfile: ./neo4j/Dockerfile
target: community
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: setup .env files
run: |
cp backend/.env.test_e2e backend/.env
cp webapp/.env.template webapp/.env
- uses: docker/setup-buildx-action@v3
- name: Build ${{ matrix.name }} image
uses: docker/build-push-action@v5
with:
context: ${{ matrix.context }}
file: ${{ matrix.dockerfile }}
target: ${{ matrix.target }}
push: false
outputs: type=docker,dest=/tmp/${{ matrix.name }}.tar
- name: Upload ${{ matrix.name }} image
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.name }}-image
path: /tmp/${{ matrix.name }}.tar
cache-environment:
runs-on: ubuntu-latest
outputs:
cache-key: ${{ steps.cache-key.outputs.key }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Setup .env files
run: |
cp backend/.env.test_e2e backend/.env
cp webapp/.env.template webapp/.env
- name: Compute cache key
id: cache-key
run: |
ROOT_HASH=$(sha256sum yarn.lock | cut -d' ' -f1)
BACKEND_HASH=$(sha256sum backend/yarn.lock | cut -d' ' -f1)
WEBAPP_HASH=$(sha256sum webapp/yarn.lock | cut -d' ' -f1)
CYPRESS_HASH=$(find cypress cypress.config.* -type f -exec sha256sum {} \; | sort | sha256sum | cut -d' ' -f1)
KEY="ci-unified-cache-${{ runner.os }}-${ROOT_HASH}-${BACKEND_HASH}-${WEBAPP_HASH}-${CYPRESS_HASH}"
echo "key=$KEY"
echo "key=$KEY" >> $GITHUB_OUTPUT
- name: Restore unified CI cache
id: restore-cache
uses: actions/cache/restore@v4
with:
key: ${{ steps.cache-key.outputs.key }}
path: |
node_modules
backend/node_modules
webapp/node_modules
backend/build
webapp/.nuxt
~/.cache/Cypress
/opt/cucumber-json-formatter
restore-keys: |
ci-unified-cache-${{ runner.os }}-
- name: Setup dependencies & build (if cache missed)
if: steps.restore-cache.outputs.cache-hit != 'true'
run: |
echo "📦 Cache miss installing & building everything"
yarn install --frozen-lockfile
cd backend && yarn install --frozen-lockfile && yarn build && cd ..
cd webapp && yarn install --frozen-lockfile && yarn build && cd ..
npx cypress verify || echo "⚠️ Cypress verify failed (non-blocking)"
if [ ! -f /opt/cucumber-json-formatter ]; then
wget --no-verbose -O /opt/cucumber-json-formatter "https://github.com/cucumber/json-formatter/releases/download/v19.0.0/cucumber-json-formatter-linux-386"
chmod +x /opt/cucumber-json-formatter
fi
- name: Save unified CI cache
if: steps.restore-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: ${{ steps.cache-key.outputs.key }}
path: |
node_modules
backend/node_modules
webapp/node_modules
backend/build
webapp/.nuxt
~/.cache/Cypress
/opt/cucumber-json-formatter
verify-environment:
runs-on: ubuntu-latest
needs: [cache-environment]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: setup .env files
run: |
cp backend/.env.test_e2e backend/.env
cp webapp/.env.template webapp/.env
- name: Restore unified CI cache
uses: actions/cache/restore@v4
with:
path: |
node_modules
backend/node_modules
webapp/node_modules
~/.cache/Cypress
/opt/cucumber-json-formatter
key: ${{ needs.cache-environment.outputs.cache-key }}
restore-keys: |
ci-unified-cache-${{ runner.os }}-
- name: Check all node_modules exist
run: |
[ -d node_modules ] && [ -n "$(ls -A node_modules)" ] || (echo "❌ node_modules missing" && exit 1)
[ -d backend/node_modules ] && [ -n "$(ls -A backend/node_modules)" ] || (echo "❌ backend/node_modules missing" && exit 1)
[ -d webapp/node_modules ] && [ -n "$(ls -A webapp/node_modules)" ] || (echo "❌ webapp/node_modules missing" && exit 1)
- name: Check Cypress binary & CLI
run: |
npx --yes cypress --version
npx --yes cypress verify
- name: Check cucumber-json-formatter
run: |
[ -x /opt/cucumber-json-formatter ] && /opt/cucumber-json-formatter --help || (echo "❌ Formatter missing" && exit 1)
consolidate-environment:
name: Fullstack | tests
if: success()
needs: [build-images, cache-environment]
runs-on: ubuntu-latest
env:
jobs: 8
strategy:
matrix:
job: [1, 2, 3, 4, 5, 6, 7, 8]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download Docker image artifacts
uses: actions/download-artifact@v4
with:
path: /tmp
- name: Load Docker images
run: |
docker load < /tmp/backend-image/backend.tar
docker load < /tmp/webapp-image/webapp.tar
docker load < /tmp/neo4j-image/neo4j.tar
- name: Restore unified CI cache
uses: actions/cache/restore@v4
with:
key: ${{ needs.cache-environment.outputs.cache-key }}
path: |
node_modules
backend/node_modules
webapp/node_modules
backend/build
webapp/.nuxt
~/.cache/Cypress
/opt/cucumber-json-formatter
restore-keys: |
ci-unified-cache-${{ runner.os }}-
- name: Ensure formatter is executable
run: |
chmod +x /opt/cucumber-json-formatter || true
sudo ln -fs /opt/cucumber-json-formatter /usr/bin/cucumber-json-formatter || true
- name: Boot system for tests
run: |
docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach backend mailserver webapp
- name: Wait for services to be ready
run: |
for i in {1..30}; do
curl -sf http://localhost:3000 && echo "✅ Webapp ready" && break
echo "Waiting for webapp... ($i/30)"
sleep 2
done
- name: Full stack tests | run tests
id: e2e-tests
run: yarn run cypress:run --spec $(cypress/parallel-features.sh ${{ matrix.job }} ${{ env.jobs }} )
- name: Full stack tests | if tests failed, compile html report
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
run: |
cd cypress/
node create-cucumber-html-report.js
- name: Full stack tests | if tests failed, upload report
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
uses: actions/upload-artifact@v4
with:
name: ocelot-e2e-test-report-job${{ matrix.job }}
path: cypress/reports/cucumber_html_report