feat: Add CI testing infrastructure with act_runner support

- Created scripts/test-ci-locally.sh to test Gitea Actions workflows locally using act_runner
- Created docker-compose.ci.yml for containerized CI test environment
- Updated .gitea/workflows/magnitude.yml to use docker-compose for CI
- Added scripts/README.md documenting the CI testing approach
- Created reusable test helpers in tests/playwright/

This allows developers to run the exact same workflow that CI runs, locally,
making it much easier to debug CI failures without push cycles.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-10 14:07:16 +00:00
parent 0ea3296885
commit a8da8753f1
5 changed files with 258 additions and 47 deletions

View File

@@ -1,4 +1,5 @@
# Gitea Actions workflow for running Magnitude tests
# Uses docker-compose.ci.yml for fully containerized testing
name: Magnitude Tests
on:
@@ -15,56 +16,39 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install pnpm
run: npm install -g pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Start SurrealDB
- name: Create .env file for CI
run: |
docker run -d \
--name surrealdb \
-p 8000:8000 \
-e SURREAL_USER=${{ secrets.SURREALDB_USER }} \
-e SURREAL_PASS=${{ secrets.SURREALDB_PASS }} \
surrealdb/surrealdb:latest \
start --log trace --user ${{ secrets.SURREALDB_USER }} --pass ${{ secrets.SURREALDB_PASS }} memory
cat > .env << EOF
SURREALDB_URL=ws://surrealdb:8000/rpc
SURREALDB_USER=root
SURREALDB_PASS=root
SURREALDB_NS=ponderants
SURREALDB_DB=main
ATPROTO_CLIENT_ID=${{ secrets.ATPROTO_CLIENT_ID }}
ATPROTO_REDIRECT_URI=${{ secrets.ATPROTO_REDIRECT_URI }}
GOOGLE_API_KEY=${{ secrets.GOOGLE_API_KEY }}
DEEPGRAM_API_KEY=${{ secrets.DEEPGRAM_API_KEY }}
SURREAL_JWT_SECRET=${{ secrets.SURREAL_JWT_SECRET }}
TEST_BLUESKY_HANDLE=${{ secrets.TEST_BLUESKY_HANDLE }}
TEST_BLUESKY_PASSWORD=${{ secrets.TEST_BLUESKY_PASSWORD }}
ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
EOF
- name: Wait for SurrealDB
run: sleep 5
- name: Run tests with docker-compose
run: |
docker compose -f docker-compose.ci.yml --profile test up \
--abort-on-container-exit \
--exit-code-from magnitude
- name: Start Next.js dev server
run: pnpm dev &
env:
SURREALDB_URL: ws://localhost:8000/rpc
SURREALDB_USER: ${{ secrets.SURREALDB_USER }}
SURREALDB_PASS: ${{ secrets.SURREALDB_PASS }}
SURREALDB_NS: ${{ secrets.SURREALDB_NS }}
SURREALDB_DB: ${{ secrets.SURREALDB_DB }}
ATPROTO_CLIENT_ID: ${{ secrets.ATPROTO_CLIENT_ID }}
ATPROTO_REDIRECT_URI: ${{ secrets.ATPROTO_REDIRECT_URI }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
DEEPGRAM_API_KEY: ${{ secrets.DEEPGRAM_API_KEY }}
SURREAL_JWT_SECRET: ${{ secrets.SURREAL_JWT_SECRET }}
TEST_BLUESKY_HANDLE: ${{ secrets.TEST_BLUESKY_HANDLE }}
TEST_BLUESKY_PASSWORD: ${{ secrets.TEST_BLUESKY_PASSWORD }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Wait for Next.js server
run: npx wait-on http://localhost:3000 --timeout 120000
- name: Run Magnitude tests
run: npx magnitude
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
TEST_BLUESKY_HANDLE: ${{ secrets.TEST_BLUESKY_HANDLE }}
TEST_BLUESKY_PASSWORD: ${{ secrets.TEST_BLUESKY_PASSWORD }}
- name: Show logs on failure
if: failure()
run: |
echo "=== SurrealDB Logs ==="
docker compose -f docker-compose.ci.yml logs surrealdb
echo "=== Next.js Logs ==="
docker compose -f docker-compose.ci.yml logs nextjs
echo "=== Magnitude Logs ==="
docker compose -f docker-compose.ci.yml logs magnitude
- name: Upload test results
if: always()
@@ -73,3 +57,7 @@ jobs:
name: magnitude-results
path: test-results/
retention-days: 30
- name: Cleanup
if: always()
run: docker compose -f docker-compose.ci.yml down -v