Skip to content

Merge pull request #3 from hakutakuAi/development #15

Merge pull request #3 from hakutakuAi/development

Merge pull request #3 from hakutakuAi/development #15

Workflow file for this run

name: CI/CD Pipeline
on:
push:
branches: [main, development]
paths:
- 'src/**'
- 'tests/**'
- 'examples/**'
- 'package.json'
- 'bun.lock'
- 'tsconfig.json'
- '*.ts'
- '.github/**'
pull_request:
branches: [main, development]
paths:
- 'src/**'
- 'tests/**'
- 'examples/**'
- 'package.json'
- 'bun.lock'
- 'tsconfig.json'
- '*.ts'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
BUN_VERSION: '1.2.21'
jobs:
setup:
name: πŸ”§ Setup & Dependencies
runs-on: ubuntu-latest
outputs:
cache-key: ${{ steps.cache-key.outputs.key }}
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: 🐰 Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: ${{ env.BUN_VERSION }}
- name: πŸ”‘ Generate cache key
id: cache-key
run: echo "key=bun-${{ hashFiles('**/bun.lock', '**/package.json') }}" >> $GITHUB_OUTPUT
- name: πŸ’Ύ Cache dependencies
uses: actions/cache@v4
id: cache-deps
with:
path: |
~/.bun/install/cache
node_modules
examples/*/node_modules
key: ${{ steps.cache-key.outputs.key }}
restore-keys: |
bun-
- name: πŸ“¦ Install dependencies
if: steps.cache-deps.outputs.cache-hit != 'true'
run: bun install --frozen-lockfile
- name: πŸ“¦ Install example dependencies
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
cd examples/graphql-server && bun install --frozen-lockfile
cd ../type-graphql && bun install --frozen-lockfile
cd ../advanced-graphql && bun install --frozen-lockfile
typecheck:
name: πŸ” Type Check & Lint
runs-on: ubuntu-latest
needs: setup
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: 🐰 Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: ${{ env.BUN_VERSION }}
- name: πŸ’Ύ Restore dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
examples/*/node_modules
key: ${{ needs.setup.outputs.cache-key }}
- name: πŸ” Type check
run: bunx tsc --noEmit
- name: 🧹 Lint check
run: |
if [ -f "eslint.config.js" ] || [ -f ".eslintrc.json" ] || [ -f ".eslintrc.js" ]; then
bunx eslint src/ tests/ --ext .ts --max-warnings 0
else
echo "No ESLint configuration found, skipping lint check"
fi
unit-tests:
name: πŸ§ͺ Unit & Integration Tests
runs-on: ubuntu-latest
needs: setup
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: 🐰 Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: ${{ env.BUN_VERSION }}
- name: πŸ’Ύ Restore dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
examples/*/node_modules
key: ${{ needs.setup.outputs.cache-key }}
- name: πŸ§ͺ Run unit tests with coverage
run: bun run test:coverage
- name: πŸ“Š Generate coverage summary
run: |
echo "## πŸ§ͺ Test Coverage Report" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
bun run test:coverage | grep -A 20 "File.*% Funcs.*% Lines" || echo "Coverage report format changed"
echo '```' >> $GITHUB_STEP_SUMMARY
- name: πŸ“ˆ Upload coverage (if available)
uses: codecov/codecov-action@v4
with:
fail_ci_if_error: false
continue-on-error: true
- name: πŸ’Ύ Archive test results
if: always()
uses: actions/upload-artifact@v4
with:
name: unit-test-results
path: |
coverage/
test-results.xml
.coverage
retention-days: 7
continue-on-error: true
e2e-tests:
name: πŸš€ End-to-End Tests
runs-on: ubuntu-latest
needs: [setup, typecheck]
timeout-minutes: 15
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: 🐰 Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: ${{ env.BUN_VERSION }}
- name: πŸ’Ύ Restore dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
examples/*/node_modules
key: ${{ needs.setup.outputs.cache-key }}
- name: πŸ—οΈ Build project
run: bun run build
- name: πŸ“Š Cache build artifacts
uses: actions/cache@v4
with:
path: |
dist/
examples/*/dist/
examples/*/prisma/
key: build-${{ github.sha }}
- name: ⚑ Generate examples
run: bun run generate:all
- name: πŸ§ͺ Run E2E tests
run: bun run test:examples
- name: πŸ’Ύ Archive E2E results
if: always()
uses: actions/upload-artifact@v4
with:
name: e2e-test-results
path: |
examples/*/tests/
examples/*/*.test.ts
examples/*/schema.graphql
retention-days: 7
performance-tests:
name: ⚑ Performance Tests
runs-on: ubuntu-latest
needs: [setup, unit-tests]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: 🐰 Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: ${{ env.BUN_VERSION }}
- name: πŸ’Ύ Restore dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
examples/*/node_modules
key: ${{ needs.setup.outputs.cache-key }}
- name: ⚑ Run performance tests
run: bun test tests/performance/
security-scan:
name: πŸ”’ Security Scan
runs-on: ubuntu-latest
needs: setup
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: πŸ”’ Run security audit
run: |
bun audit --audit-level moderate || true
build-validation:
name: πŸ“¦ Build Validation
runs-on: ubuntu-latest
needs: [setup, typecheck]
steps:
- name: πŸ“₯ Checkout code
uses: actions/checkout@v4
- name: 🐰 Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: ${{ env.BUN_VERSION }}
- name: πŸ’Ύ Restore dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
examples/*/node_modules
key: ${{ needs.setup.outputs.cache-key }}
- name: πŸ—οΈ Test build process
run: |
bun run build
- name: βœ… Verify build output
run: |
[ -d "dist" ] || (echo "dist directory not found!" && exit 1)
[ -f "dist/index.js" ] || (echo "Main entry file not found!" && exit 1)
[ -f "dist/package.json" ] || (echo "Package.json not found in dist!" && exit 1)
echo "βœ… Build validation successful"
- name: πŸ’Ύ Archive build artifacts
uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: dist/
retention-days: 7
test-summary:
name: πŸ“‹ Test Summary
runs-on: ubuntu-latest
needs: [typecheck, unit-tests, e2e-tests, build-validation]
if: always()
steps:
- name: πŸ“‹ Generate summary
run: |
echo "## πŸ§ͺ Test Results Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Job | Status |" >> $GITHUB_STEP_SUMMARY
echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY
echo "| Type Check & Lint | ${{ needs.typecheck.result == 'success' && 'βœ…' || '❌' }} |" >> $GITHUB_STEP_SUMMARY
echo "| Unit Tests | ${{ needs.unit-tests.result == 'success' && 'βœ…' || '❌' }} |" >> $GITHUB_STEP_SUMMARY
echo "| E2E Tests | ${{ needs.e2e-tests.result == 'success' && 'βœ…' || '❌' }} |" >> $GITHUB_STEP_SUMMARY
echo "| Build Validation | ${{ needs.build-validation.result == 'success' && 'βœ…' || '❌' }} |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### πŸ“Š Coverage & Artifacts" >> $GITHUB_STEP_SUMMARY
echo "- Coverage reports available in artifacts" >> $GITHUB_STEP_SUMMARY
echo "- Test results archived for 7 days" >> $GITHUB_STEP_SUMMARY
- name: ❌ Fail if critical jobs failed
if: |
needs.typecheck.result == 'failure' ||
needs.unit-tests.result == 'failure' ||
needs.e2e-tests.result == 'failure' ||
needs.build-validation.result == 'failure'
run: |
echo "❌ Critical jobs failed. Please check the logs above."
exit 1