name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
env:
NODE_VERSION: '18.x'
jobs:
lint-and-type-check:
name: Lint and Type Check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run lint
- name: Run TypeScript type check
run: npm run typecheck
- name: Build project
run: npm run build
unit-tests:
name: Unit 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: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run unit tests
run: npm run test:unit
- name: Upload unit test coverage
uses: codecov/codecov-action@v3
with:
files: ./coverage/lcov.info
flags: unit
name: unit-tests
fail_ci_if_error: false
integration-tests:
name: Integration Tests
runs-on: ubuntu-latest
needs: unit-tests
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Initialize database
run: npm run import:csf-framework
- name: Run integration tests
run: npm run test:integration
- name: Upload integration test coverage
uses: codecov/codecov-action@v3
with:
files: ./coverage/lcov.info
flags: integration
name: integration-tests
fail_ci_if_error: false
e2e-tests:
name: E2E Tests
runs-on: ubuntu-latest
needs: integration-tests
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Initialize database
run: npm run db:init
- name: Run E2E tests
run: npm run test:e2e
- name: Upload E2E test coverage
uses: codecov/codecov-action@v3
with:
files: ./coverage/lcov.info
flags: e2e
name: e2e-tests
fail_ci_if_error: false
security-tests:
name: Security 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: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Run security tests
run: npm run test:security
- name: Upload security test coverage
uses: codecov/codecov-action@v3
with:
files: ./coverage/lcov.info
flags: security
name: security-tests
fail_ci_if_error: false
performance-tests:
name: Performance Tests
runs-on: ubuntu-latest
needs: e2e-tests
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Initialize database
run: npm run db:init
- name: Run performance tests
run: npm run test:performance
- name: Upload performance test results
uses: actions/upload-artifact@v4
with:
name: performance-results
path: coverage/
coverage-report:
name: Generate Coverage Report
runs-on: ubuntu-latest
needs: [unit-tests, integration-tests, e2e-tests, security-tests]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Initialize database
run: npm run db:init
- name: Run all tests with coverage
run: npm run test:coverage
- name: Upload comprehensive coverage
uses: codecov/codecov-action@v3
continue-on-error: true
with:
files: ./coverage/lcov.info
flags: comprehensive
name: comprehensive-coverage
fail_ci_if_error: false
- name: Upload coverage reports to GitHub
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
docker-build:
name: Docker Build Test
runs-on: ubuntu-latest
needs: [lint-and-type-check, unit-tests]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
run: docker build -t nist-csf-mcp-server:test .
- name: Test Docker image
run: |
echo "Testing Docker container MCP protocol compliance..."
echo '{"jsonrpc":"2.0","method":"tools/list","params":{},"id":1}' | timeout 30s docker run -i --rm nist-csf-mcp-server:test node dist/index.js 2>/dev/null | grep -q '"tools"' && echo "✅ Docker MCP server test passed" || echo "❌ Docker MCP server test failed"
quality-gate:
name: Quality Gate
runs-on: ubuntu-latest
needs: [lint-and-type-check, unit-tests, integration-tests, e2e-tests, security-tests, performance-tests]
if: always()
steps:
- name: Check job results
run: |
echo "Lint and Type Check: ${{ needs.lint-and-type-check.result }}"
echo "Unit Tests: ${{ needs.unit-tests.result }}"
echo "Integration Tests: ${{ needs.integration-tests.result }}"
echo "E2E Tests: ${{ needs.e2e-tests.result }}"
echo "Security Tests: ${{ needs.security-tests.result }}"
echo "Performance Tests: ${{ needs.performance-tests.result }}"
if [[ "${{ needs.lint-and-type-check.result }}" != "success" ]]; then
echo "❌ Lint and Type Check failed"
exit 1
fi
if [[ "${{ needs.unit-tests.result }}" != "success" ]]; then
echo "❌ Unit Tests failed"
exit 1
fi
if [[ "${{ needs.integration-tests.result }}" != "success" ]]; then
echo "❌ Integration Tests failed"
exit 1
fi
if [[ "${{ needs.e2e-tests.result }}" != "success" ]]; then
echo "❌ E2E Tests failed"
exit 1
fi
if [[ "${{ needs.security-tests.result }}" != "success" ]]; then
echo "❌ Security Tests failed"
exit 1
fi
echo "✅ All quality gates passed!"
release-notification:
name: Release Notification
runs-on: ubuntu-latest
needs: [quality-gate, docker-build]
if: success() && github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Notify release readiness
run: |
echo "🚀 All tests passed! Ready for production deployment."
echo "Branch: ${{ github.ref }}"
echo "Commit: ${{ github.sha }}"
echo "Author: ${{ github.actor }}"