14 Commits

Author SHA1 Message Date
david 00373fcef4 refactor: move legacy files to organized directories
Test / unit-tests (push) Failing after 6m1s
Pull Request / acceptance-tests (pull_request) Has been cancelled
Pull Request / analyze-bump-type (pull_request) Has been cancelled
Pull Request / unit-tests (pull_request) Has been cancelled
2026-03-31 21:50:51 -07:00
david 80714a5daa refactor: move TODO.md to docs directory for better organization 2026-03-31 21:49:26 -07:00
david 039b927bb7 refactor: move Python scripts to scripts/python/ directory 2026-03-31 21:49:20 -07:00
david 9511eed477 refactor: move deployment docs to docs/deployment/ directory 2026-03-31 21:49:12 -07:00
david 0e1046fcb5 docs: add FILE_ORGANIZATION.md to document project structure 2026-03-31 21:49:07 -07:00
david 5f02726ba6 docs: update README and AGENTS.md with CI/CD and justfile info 2026-03-31 21:48:58 -07:00
david e08d72bfe6 chore: update justfile with SQLite acceptance tests and utility tasks 2026-03-31 21:48:52 -07:00
david 9980021037 feat: support both SQLite and PostgreSQL in prisma.ts 2026-03-31 21:48:47 -07:00
david 6b70c3f388 ci: add unit and acceptance tests to PR workflow with SQLite 2026-03-31 21:48:39 -07:00
david ff7461973a fix: optimize workflows to avoid redundant test runs
Pull Request / analyze-bump-type (pull_request) Successful in 21s
Test / unit-tests (push) Has been cancelled
2026-03-31 20:05:48 -07:00
david 9b69cb84e3 docs: add workflow architecture documentation
Test / unit-tests (push) Has been cancelled
Test / safe-acceptance-tests (push) Has been cancelled
Pull Request / unit-tests (pull_request) Successful in 13m14s
Test / unit-tests (pull_request) Successful in 13m11s
Pull Request / analyze-bump-type (pull_request) Successful in 10s
Test / safe-acceptance-tests (pull_request) Has been cancelled
2026-03-31 20:02:34 -07:00
david 5c9b98a926 feat: add PR workflow with bump type analysis
Test / unit-tests (push) Has been cancelled
Test / safe-acceptance-tests (push) Has been cancelled
Test / unit-tests (pull_request) Failing after 11m39s
Pull Request / unit-tests (pull_request) Failing after 16m27s
Pull Request / analyze-bump-type (pull_request) Has been cancelled
Test / safe-acceptance-tests (pull_request) Has been cancelled
2026-03-31 20:01:41 -07:00
david 73ba929e36 fix: update release workflow to bump version on PR merge 2026-03-31 20:01:24 -07:00
david c9cd00a055 fix: handle existing git tags and use DOCKER_LOGIN/DOCKER_PASSWORD secrets 2026-03-31 19:58:43 -07:00
10 changed files with 51 additions and 170 deletions
+7 -8
View File
@@ -8,14 +8,17 @@ on:
jobs: jobs:
unit-tests: unit-tests:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: node:20-alpine
options: --user root
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
@@ -25,9 +28,6 @@ jobs:
acceptance-tests: acceptance-tests:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: unit-tests needs: unit-tests
container:
image: mcr.microsoft.com/playwright:v1.58.0-jammy
options: --user root
env: env:
DATABASE_PROVIDER: sqlite DATABASE_PROVIDER: sqlite
DATABASE_URL: file:./prisma/ci.db DATABASE_URL: file:./prisma/ci.db
@@ -41,14 +41,13 @@ jobs:
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: '20' node-version: '20'
cache: 'npm'
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
- name: Generate Prisma client - name: Generate Prisma client
run: npx prisma generate run: npx prisma generate
env:
DATABASE_URL: postgresql://user:pass@localhost:5432/dummy
- name: Setup SQLite database - name: Setup SQLite database
run: | run: |
-20
View File
@@ -78,38 +78,22 @@ jobs:
echo "New version: $NEW_VERSION" echo "New version: $NEW_VERSION"
- name: Commit version bump - name: Commit version bump
id: commit
run: | run: |
git add package.json CHANGELOG.md git add package.json CHANGELOG.md
if git diff --cached --quiet; then
echo "No changes to commit (version may already be at target version)"
echo "committed=false" >> $GITHUB_OUTPUT
else
git commit -m "chore: bump version to v${{ steps.version.outputs.new_version }}" git commit -m "chore: bump version to v${{ steps.version.outputs.new_version }}"
git push origin main git push origin main
echo "committed=true" >> $GITHUB_OUTPUT
fi
- name: Create git tag for release - name: Create git tag for release
if: steps.commit.outputs.committed == 'true'
run: | run: |
TAG_NAME="v${{ steps.version.outputs.new_version }}" TAG_NAME="v${{ steps.version.outputs.new_version }}"
echo "Creating tag $TAG_NAME" echo "Creating tag $TAG_NAME"
# Check if tag already exists
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
echo "Tag $TAG_NAME already exists, skipping tag creation"
else
git tag -a "$TAG_NAME" -m "Release $TAG_NAME" git tag -a "$TAG_NAME" -m "Release $TAG_NAME"
git push origin "$TAG_NAME" git push origin "$TAG_NAME"
fi
- name: Set up Docker Buildx - name: Set up Docker Buildx
if: steps.commit.outputs.committed == 'true'
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Build test-capable image - name: Build test-capable image
if: steps.commit.outputs.committed == 'true'
run: | run: |
docker build \ docker build \
--target test-runner \ --target test-runner \
@@ -118,7 +102,6 @@ jobs:
. .
- name: Run tests inside test-capable container - name: Run tests inside test-capable container
if: steps.commit.outputs.committed == 'true'
run: | run: |
docker run --rm \ docker run --rm \
-e DATABASE_URL="postgresql://user:pass@localhost:5432/dummy" \ -e DATABASE_URL="postgresql://user:pass@localhost:5432/dummy" \
@@ -126,7 +109,6 @@ jobs:
npm run test:run npm run test:run
- name: Build production image - name: Build production image
if: steps.commit.outputs.committed == 'true'
run: | run: |
docker build \ docker build \
--target runner \ --target runner \
@@ -136,7 +118,6 @@ jobs:
. .
- name: Push Docker images - name: Push Docker images
if: steps.commit.outputs.committed == 'true'
run: | run: |
echo "Pushing to ${{ env.REGISTRY }}..." echo "Pushing to ${{ env.REGISTRY }}..."
# Check if we can authenticate to the registry using DOCKER_LOGIN and DOCKER_PASSWORD secrets # Check if we can authenticate to the registry using DOCKER_LOGIN and DOCKER_PASSWORD secrets
@@ -161,7 +142,6 @@ jobs:
fi fi
- name: Deploy to dev (placeholder) - name: Deploy to dev (placeholder)
if: steps.commit.outputs.committed == 'true'
run: | run: |
echo "Deploying version ${{ steps.version.outputs.new_version }} to dev environment..." echo "Deploying version ${{ steps.version.outputs.new_version }} to dev environment..."
# TODO: Add actual deployment steps # TODO: Add actual deployment steps
+6 -3
View File
@@ -8,9 +8,6 @@ on:
jobs: jobs:
unit-tests: unit-tests:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: node:20-alpine
options: --user root
# Skip if this is an auto-generated version bump commit (handled by release workflow) # Skip if this is an auto-generated version bump commit (handled by release workflow)
if: "!contains(github.event.head_commit.message, 'chore: bump version')" if: "!contains(github.event.head_commit.message, 'chore: bump version')"
@@ -18,6 +15,12 @@ jobs:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
-23
View File
@@ -127,29 +127,6 @@ npm run db:setup-postgres
DATABASE_PROVIDER=sqlite DATABASE_URL=file:./prisma/ci.db npm run test:acceptance DATABASE_PROVIDER=sqlite DATABASE_URL=file:./prisma/ci.db npm run test:acceptance
``` ```
### CI Runner Image
**Note:** The CI runner image approach has been deprecated for Gitea Actions workflows.
The original attempt to use a pre-built CI runner image with pre-installed dependencies encountered fundamental issues with how Gitea Actions handles workspace mounting. When Gitea Actions runs a container job, it mounts the workspace at a specific path (e.g., `/workspace/david/euchre_camp`), which hides the container's `/app` directory where dependencies were installed.
**Current Approach:**
- Workflows use standard `node:20-alpine` or `mcr.microsoft.com/playwright` containers
- Dependencies are installed via `npm ci` in each workflow run
- This is the recommended approach for Gitea Actions
**Why the CI image approach doesn't work:**
1. Dockerfile.ci installs dependencies in `/app`
2. Gitea Actions mounts workspace at `/workspace/david/euchre_camp`
3. Workspace mount hides the `/app` directory
4. Symlinks from `/app/node_modules` don't work because `/app` is hidden
**Alternative for performance:**
If CI performance becomes an issue, consider:
- Using GitHub Actions cache for node_modules
- Using a self-hosted runner with persistent workspace
- Using the main Dockerfile's `test-runner` target for release workflows (which works because it builds a complete image)
### CI/CD Pipeline ### CI/CD Pipeline
The project uses Gitea Actions for continuous integration: The project uses Gitea Actions for continuous integration:
-25
View File
@@ -1,28 +1,3 @@
## [0.1.3] - 2026-04-01
### Patch Changes
- fix: skip release steps if no version bump commit was made
- fix: improve error handling in getCommitsSinceLastTag
- fix: add tag existence check in release workflow
- fix: resolve release workflow version bump issues
- ci-image-improvements (#18)
- fix: version bumping and Docker registry authentication (#17)
- fix: handle Docker registry authentication gracefully in release workflow
- fix: run unit tests on branch commits, skip main branch
- feat: add test workflow for every commit
- trigger: release with test-capable image
- feat: build test-capable image, run tests, then build production image
- trigger: release workflow
- fix: release workflow should not commit, only tag
- trigger: manual workflow trigger for docker.notsosm.art
- fix: update Docker build script to use docker.notsosm.art registry
- fix: update workflow to use docker.notsosm.art registry
- trigger: manual workflow trigger
- fix: update workflow to use correct Docker registries
- feat: add Gitea Actions release workflow
- feat: add view match link to admin matches page
## [0.1.2] - 2026-04-01 ## [0.1.2] - 2026-04-01
### Patch Changes ### Patch Changes
+1 -18
View File
@@ -368,28 +368,11 @@ The application uses Gitea Actions for continuous integration and deployment:
- Unit tests for quick feedback - Unit tests for quick feedback
- Skips auto-generated version bumps - Skips auto-generated version bumps
3. **Release Workflow** (`.gitea/workflows/release.yml`): Runs on main branch pushes 3. **Release Workflow** (`.gitea/workflows/release.yml`): Runs on main branch pushes
- Version bumping and tagging - Version bumping and tagging
- Docker image building and testing - Docker image building and testing
- Registry push and deployment - Registry push and deployment
### CI Runner Image
**Note:** The CI runner image approach has been deprecated for Gitea Actions workflows.
The original attempt to use a pre-built CI runner image with pre-installed dependencies encountered fundamental issues with how Gitea Actions handles workspace mounting. When Gitea Actions runs a container job, it mounts the workspace at a specific path (e.g., `/workspace/david/euchre_camp`), which hides the container's `/app` directory where dependencies were installed.
**Current Approach:**
- Workflows use standard `node:20-alpine` or `mcr.microsoft.com/playwright` containers
- Dependencies are installed via `npm ci` in each workflow run
- This is the recommended approach for Gitea Actions
**Why the CI image approach doesn't work:**
1. Dockerfile.ci installs dependencies in `/app`
2. Gitea Actions mounts workspace at `/workspace/david/euchre_camp`
3. Workspace mount hides the `/app` directory
4. Symlinks from `/app/node_modules` don't work because `/app` is hidden
### Database Strategy for CI ### Database Strategy for CI
- **CI Tests**: SQLite database (fast, no server required) - **CI Tests**: SQLite database (fast, no server required)
- **Production**: PostgreSQL (production-like environment) - **Production**: PostgreSQL (production-like environment)
-3
View File
@@ -57,7 +57,6 @@ format:
# --- Testing --- # --- Testing ---
# Run all tests (unit + acceptance with SQLite) # Run all tests (unit + acceptance with SQLite)
# Note: Uses Docker containers for consistent environment
test: test-unit test-acceptance-sqlite test: test-unit test-acceptance-sqlite
# Run all tests with PostgreSQL (Docker) # Run all tests with PostgreSQL (Docker)
@@ -246,8 +245,6 @@ workflow-status:
@echo "PR Workflow: Runs unit + acceptance tests on pull requests" @echo "PR Workflow: Runs unit + acceptance tests on pull requests"
@echo "Test Workflow: Runs unit tests on all branch pushes" @echo "Test Workflow: Runs unit tests on all branch pushes"
@echo "Release Workflow: Runs on main branch pushes (version bump + Docker build)" @echo "Release Workflow: Runs on main branch pushes (version bump + Docker build)"
@echo ""
@echo "Note: CI image approach deprecated due to Gitea Actions workspace mounting"
# Check current database provider # Check current database provider
db-status: db-status:
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "euchre_camp", "name": "euchre_camp",
"version": "0.1.3", "version": "0.1.2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "NEXT_PUBLIC_GIT_COMMIT=$(git rev-parse --short HEAD) next dev", "dev": "NEXT_PUBLIC_GIT_COMMIT=$(git rev-parse --short HEAD) next dev",
+9 -27
View File
@@ -48,22 +48,14 @@ function getCommitsSinceLastTag() {
if (!latestTag) { if (!latestTag) {
// No tags yet, get all commits // No tags yet, get all commits
const commits = execSync('git log --oneline --format=%s', { encoding: 'utf8' }).trim(); return execSync('git log --oneline --format=%s', { encoding: 'utf8' }).trim().split('\n');
return commits ? commits.split('\n') : [];
} }
const commits = execSync(`git log ${latestTag}..HEAD --oneline --format=%s`, { encoding: 'utf8' }).trim(); const commits = execSync(`git log ${latestTag}..HEAD --oneline --format=%s`, { encoding: 'utf8' }).trim();
return commits ? commits.split('\n') : []; return commits ? commits.split('\n') : [];
} catch (error) { } catch (error) {
// If no commits since tag or other error, get recent commits // If no commits since tag or other error, get recent commits
try { return execSync('git log --oneline --format=%s -n 20', { encoding: 'utf8' }).trim().split('\n');
const commits = execSync('git log --oneline --format=%s -n 20', { encoding: 'utf8' }).trim();
return commits ? commits.split('\n') : [];
} catch (innerError) {
// If all git log attempts fail, return empty array
console.warn('Warning: Could not retrieve commit history, defaulting to patch version');
return [];
}
} }
} }
@@ -183,20 +175,7 @@ function main() {
console.log(`New version: ${currentVersion}${newVersion}`); console.log(`New version: ${currentVersion}${newVersion}`);
} }
// Confirm with user (or skip if --yes flag is set) // Confirm with user
if (skipConfirm) {
// Update package.json
updatePackageJson(newVersion);
// Update changelog
if (bumpType !== 'custom') {
const commits = getCommitsSinceLastTag();
updateChangelog(newVersion, commits, bumpType);
}
console.log(`\n✅ Version bumped to ${newVersion}`);
process.exit(0);
} else {
const readline = require('readline'); const readline = require('readline');
const rl = readline.createInterface({ const rl = readline.createInterface({
input: process.stdin, input: process.stdin,
@@ -215,15 +194,18 @@ function main() {
} }
console.log(`\n✅ Version bumped to ${newVersion}`); console.log(`\n✅ Version bumped to ${newVersion}`);
process.exit(0); console.log(`\nNext steps:`);
console.log(` 1. Review changes: git diff`);
console.log(` 2. Commit changes: git commit -am "chore: bump version to v${newVersion}"`);
console.log(` 3. Create tag: git tag -a v${newVersion} -m "Release v${newVersion}"`);
console.log(` 4. Push changes: git push origin main`);
console.log(` 5. Push tag: git push origin v${newVersion}`);
} else { } else {
console.log('❌ Version bump cancelled'); console.log('❌ Version bump cancelled');
process.exit(1);
} }
rl.close(); rl.close();
}); });
}
} }
// Run main function // Run main function
-15
View File
@@ -1,15 +0,0 @@
#!/bin/bash
# Run tests in a Node.js container (for consistent environment)
set -e
echo "Running tests in node:20-alpine container..."
echo "This avoids Node.js setup time and ensures consistent environment."
echo ""
# Run unit tests in container
docker run --rm \
-v "$(pwd):/app" \
-w /app \
node:20-alpine \
sh -c "apk add --no-cache bash git && npm ci && npm run test:run"