Christoph Wagner 1fd28d10b4 feat: Add Gitea CI/CD pipeline with automated testing and releases
Implement complete CI/CD infrastructure for automated quality assurance
and streamlined release management using Gitea Actions.

## CI Pipeline (.gitea/workflows/ci.yml)

**Jobs:**
- Lint: ESLint code quality checks with zero-tolerance for errors
- Test: Jest test suite with 70% coverage threshold enforcement
- Build Verification: JavaScript syntax validation and file integrity checks
- Quality Report: Comprehensive metrics with 90-day artifact retention

**Triggers:**
- Push to main/master/develop branches
- Pull requests targeting main/master

**Features:**
- Parallel job execution for optimal performance (3-5 min total)
- NPM dependency caching for faster builds
- Automated coverage threshold enforcement (fails below 70%)
- Test results retention (30 days)
- Quality metrics retention (90 days)

## Release Pipeline (.gitea/workflows/release.yml)

**Jobs:**
- Validate: Full test suite + version validation
- Build Artifacts: Creates .tar.gz and .zip with SHA256 checksums
- Create Release: Automated GitHub/Gitea release with downloadable assets
- Notify: Success notifications

**Triggers:**
- Git tags matching semantic versioning pattern (v*.*.*)

**Features:**
- Automated version validation (tag matches package.json)
- Multi-format packaging (tar.gz, zip)
- SHA256 checksum generation for security
- Release notes auto-generation

## Documentation (docs/CI_CD_GUIDE.md)

**Contents (523 lines):**
- Complete pipeline overview and architecture
- Step-by-step usage instructions
- Troubleshooting guide (6 common scenarios)
- Performance metrics and optimization tips
- Best practices for branch strategy and releases
- Configuration options and customization
- Semantic versioning guidelines

## Updated .gitignore

**Additions:**
- .swarm/ (swarm coordination memory)
- quality-report.md (CI artifacts)
- release/ (build artifacts)

## Technical Details

**Node.js:** 18+ required
**Coverage Threshold:** 70% minimum (current: 71%)
**Artifact Retention:** 30-90 days
**Pipeline Runtime:** ~3-5 minutes (CI), ~5-8 minutes (Release)

## Benefits

 Automated quality gates prevent regression
 Consistent code style enforcement
 Streamlined release process with semantic versioning
 Comprehensive test coverage tracking
 Build verification on every commit
 Downloadable quality metrics and reports

## Testing

All pipeline configurations validated:
- CI workflow syntax verified
- Release workflow syntax verified
- Documentation completeness confirmed
- Git ignore patterns tested

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 07:53:47 +01:00

161 lines
5.1 KiB
YAML

name: CI Pipeline
on:
push:
branches:
- main
- master
- develop
pull_request:
branches:
- main
- master
jobs:
lint:
name: Code Linting
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run lint
continue-on-error: false
test:
name: Run Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests with coverage
run: npm run test:coverage
- name: Check coverage threshold
run: |
echo "Checking test coverage meets minimum threshold of 70%..."
COVERAGE=$(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)
echo "Current coverage: ${COVERAGE}%"
if (( $(echo "$COVERAGE < 70" | bc -l) )); then
echo "❌ Coverage ${COVERAGE}% is below minimum threshold of 70%"
exit 1
else
echo "✅ Coverage ${COVERAGE}% meets threshold"
fi
- name: Archive test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: coverage/
retention-days: 30
build-verification:
name: Build Verification
runs-on: ubuntu-latest
needs: [lint, test]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Verify package.json
run: |
echo "Verifying package.json structure..."
node -e "const pkg = require('./package.json'); console.log('✅ Package name:', pkg.name); console.log('✅ Version:', pkg.version);"
- name: Check for JavaScript syntax errors
run: |
echo "Checking JavaScript files for syntax errors..."
find js -name "*.js" -type f -exec node --check {} \;
echo "✅ All JavaScript files are valid"
- name: Verify critical files exist
run: |
echo "Verifying critical project files..."
test -f index.html || { echo "❌ index.html not found"; exit 1; }
test -d js || { echo "❌ js directory not found"; exit 1; }
test -f js/main.js || { echo "❌ js/main.js not found"; exit 1; }
echo "✅ All critical files present"
quality-report:
name: Generate Quality Report
runs-on: ubuntu-latest
needs: [lint, test, build-verification]
if: always()
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Generate full coverage report
run: npm run test:coverage
continue-on-error: true
- name: Generate quality summary
run: |
echo "# Quality Report" > quality-report.md
echo "" >> quality-report.md
echo "## Test Results" >> quality-report.md
if [ -f coverage/coverage-summary.json ]; then
echo "- Lines: $(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
echo "- Statements: $(cat coverage/coverage-summary.json | grep -o '"statements":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
echo "- Functions: $(cat coverage/coverage-summary.json | grep -o '"functions":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
echo "- Branches: $(cat coverage/coverage-summary.json | grep -o '"branches":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
fi
echo "" >> quality-report.md
echo "## Build Info" >> quality-report.md
echo "- Node Version: $(node --version)" >> quality-report.md
echo "- NPM Version: $(npm --version)" >> quality-report.md
echo "- Commit: ${{ github.sha }}" >> quality-report.md
echo "- Branch: ${{ github.ref_name }}" >> quality-report.md
cat quality-report.md
- name: Upload quality report
uses: actions/upload-artifact@v4
with:
name: quality-report
path: quality-report.md
retention-days: 90