Ocelot-Social/.github/workflows/cache-verify.yml
resonic-user 15e17312f4 v
2025-06-17 18:06:26 +00:00

246 lines
7.5 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: CI Cache Verification
on:
push:
paths:
- '.github/workflows/cache-verify.yml'
workflow_dispatch:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run actionlint
uses: reviewdog/action-actionlint@v1
with:
reporter: github-check
level: warning
prepare-env:
name: Prepare shared .env files
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Generate .env files
run: |
cp backend/.env.test_e2e backend/.env
cp webapp/.env.template webapp/.env
- name: Debug show generated .env contents
run: |
echo "::group::backend/.env"
cat backend/.env
echo "::endgroup::"
echo "::group::webapp/.env"
cat webapp/.env
echo "::endgroup::"
- name: Upload .env as artifact
uses: actions/upload-artifact@v4
with:
name: env-files
path: |
${{ github.workspace }}/backend/.env
${{ github.workspace }}/webapp/.env
build-images:
needs: prepare-env
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:
- 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:
needs: prepare-env
runs-on: ubuntu-latest
outputs:
cache-key: ${{ steps.cache-key.outputs.key }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup .env files (for caching context)
run: |
cp backend/.env.test_e2e backend/.env
cp webapp/.env.template webapp/.env
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Compute cache key (unique per run)
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)
KEY="ci-unified-cache-${{ runner.os }}-${ROOT_HASH}-${BACKEND_HASH}-${WEBAPP_HASH}-${{ github.run_id }}"
echo "key=$KEY"
echo "key=$KEY" >> $GITHUB_OUTPUT
- name: Restore unified CI cache
id: restore-cache
uses: actions/cache/restore@v4
with:
path: |
node_modules
backend/node_modules
webapp/node_modules
~/.cache/Cypress
/opt/cucumber-json-formatter
key: ${{ steps.cache-key.outputs.key }}
restore-keys: |
ci-unified-cache-${{ runner.os }}-
- name: Install all dependencies
run: |
yarn install
cd backend && yarn install && cd ..
cd webapp && yarn install && cd ..
npx cypress verify || echo "Cypress verify failed (likely not yet installed)"
- name: Install cucumber-json-formatter if missing
run: |
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
uses: actions/cache/save@v4
if: always()
with:
path: |
node_modules
backend/node_modules
webapp/node_modules
~/.cache/Cypress
/opt/cucumber-json-formatter
key: ${{ steps.cache-key.outputs.key }}
verify-environment:
runs-on: ubuntu-latest
needs: [cache-environment]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- 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:
runs-on: ubuntu-latest
needs: [build-images, cache-environment]
steps:
# load .env
- name: Setup .env files (for caching context)
run: |
cp backend/.env.test_e2e backend/.env
cp webapp/.env.template webapp/.env
# install images
- 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
# load environment
- name: Checkout repository
uses: actions/checkout@v4
- name: Restore full CI cache
id: restore-cache
uses: actions/cache@v4
with:
path: |
backend/node_modules
webapp/node_modules
~/.cache/Cypress
/opt/cucumber-json-formatter
key: ${{ needs.cache-environment.outputs.cache-key }}
restore-keys: |
ci-all-cache-${{ runner.os }}-
ci-all-cache-
# start full system
- name: Start system
run: |
docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach
- name: Wait for webapp
run: |
echo "Waiting for http://localhost:3000..."
for i in {1..15}; do
curl -sf http://localhost:3000 && echo "✅ Ready" && exit 0
echo "$i..." && sleep 2
done
echo "❌ Webapp did not respond in time" && exit 1