feat: SDLC database separation for CI/testing (#35)
Release / release (push) Failing after 9s
Build CI Images / build-ci-base (push) Failing after 20s

## Summary
- Fix `isProductionDatabase()` to allow CI database (`euchre_camp_ci`)
- Add database schema reset before CI test runs
- Create `global.teardown.ts` for cleanup (CI: full reset, dev/prod: selective cleanup)
- Add `acceptance-tests` job to PR workflow with CI database
- Create `sync-prod-to-dev.js` script for one-way prod→dev sync
- Add `just` recipes: `sync-dev`, `test-prod`, `reset-ci-db`
- Store credentials in `.credentials` (gitignored) with unique CI user

## Testing
Verified against CI database:
- Schema reset works
- Migrations apply correctly
- Test users created successfully
- 219 tests pass (slow but working)

## Next Steps
- Set `CI_DATABASE_URL` as Gitea repository variable

Reviewed-on: #35
Co-authored-by: David Gwilliam <dhgwilliam@gmail.com>
Co-committed-by: David Gwilliam <dhgwilliam@gmail.com>
This commit was merged in pull request #35.
This commit is contained in:
2026-05-11 06:40:05 +00:00
committed by david
parent 1489848b77
commit 861e14503b
16 changed files with 792 additions and 196 deletions
+55 -12
View File
@@ -5,6 +5,10 @@ on:
branches:
- main
env:
REGISTRY: docker.notsosm.art
IMAGE_NAME: euchre-camp
jobs:
unit-tests:
runs-on: ubuntu-latest
@@ -16,9 +20,6 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
- name: Clear Bun cache
run: bun pm cache rm || true
- name: Install dependencies
run: bun install
@@ -30,7 +31,7 @@ jobs:
- name: Run unit tests
run: bun test src/__tests__/unit/ src/__tests__/*.test.tsx src/__tests__/auth-simple.test.ts
e2e-tests:
build-and-deploy-ci:
runs-on: ubuntu-latest
needs: unit-tests
container:
@@ -41,9 +42,6 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
- name: Clear Bun cache
run: bun pm cache rm || true
- name: Install dependencies
run: bun install
@@ -52,15 +50,60 @@ jobs:
env:
DATABASE_URL: postgresql://user:pass@localhost:5432/dummy
- name: Run E2E tests
run: npm run test:acceptance:cucumber:prod
- name: Extract PR number and commit info
id: info
run: |
echo "pr_number=$(echo $GITHUB_REF | grep -oP 'refs/pull/\K[0-9]+')" >> $GITHUB_OUTPUT
echo "short_sha=$(echo $GITHUB_SHA | cut -c1-7)" >> $GITHUB_OUTPUT
- name: Build Docker image for PR
run: |
IMAGE_TAG="pr-${{ steps.info.outputs.pr_number }}-${{ steps.info.outputs.short_sha }}"
docker build \
--target runner \
--build-arg GIT_COMMIT=$GITHUB_SHA \
-t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${IMAGE_TAG} \
.
- name: Update CI site compose and restart
run: |
IMAGE_TAG="pr-${{ steps.info.outputs.pr_number }}-${{ steps.info.outputs.short_sha }}"
COMPOSE_FILE="/apps/euchre_camp_ci/docker-compose.yml"
# Update the image tag in the compose file
sed -i "s|image: docker.notsosm.art/euchre-camp:[a-zA-Z0-9.-]*|image: docker.notsosm.art/euchre-camp:${IMAGE_TAG}|" ${COMPOSE_FILE}
# Pull the new image and restart the CI stack
cd /apps/euchre_camp_ci
docker compose pull app
docker compose up -d app
- name: Wait for CI site to be healthy
run: |
for i in {1..30}; do
if curl -sf https://euchre-ci.notsosm.art/api/health > /dev/null 2>&1; then
echo "CI site is healthy"
exit 0
fi
sleep 0.5
done
echo "CI site failed to become healthy after 15 seconds"
docker compose -f /apps/euchre_camp_ci/docker-compose.yml logs app
exit 1
- name: Run acceptance tests
run: DATABASE_URL="${{ secrets.CI_DATABASE_URL }}" bun test:acceptance
env:
DATABASE_URL: postgresql://euchre_camp:${{ secrets.DB_PASSWORD }}@dhg.lol:5432/euchre_camp_dev
DATABASE_PROVIDER: postgresql
CI: true
- name: Cleanup PR images
if: always()
run: |
docker rmi ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:pr-${{ steps.info.outputs.pr_number }}-${{ steps.info.outputs.short_sha }} || true
analyze-bump-type:
runs-on: ubuntu-latest
needs: e2e-tests
needs: unit-tests
steps:
- name: Checkout code