name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
release:
types: [ published ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
lint:
name: Code Quality & 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.14'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run lint
continue-on-error: false
- name: Run Prettier
run: npm run format:check
continue-on-error: false
- name: Lint markdown files (Informational)
uses: DavidAnson/markdownlint-cli2-action@v16
with:
globs: '**/*.md'
continue-on-error: true
test:
name: Test Suite
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['18.14', '20', '22']
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
env:
# Mock environment variables for testing
RIVERSYNC_PAT: test-token-riversync
MULA_PAT: test-token-mula
build:
name: Build & Type Check
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.14'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Type check
run: npm run type-check
- name: Build project
run: npm run build
- name: Check build output
run: |
if [ ! -f "dist/index.js" ]; then
echo "Build failed: dist/index.js not found"
exit 1
fi
echo "Build successful: dist/index.js created"
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build-artifacts-${{ github.sha }}
path: |
dist/
package.json
README.md
retention-days: 7
security:
name: Security Scanning
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.14'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run security audit
run: npm audit --audit-level moderate
- name: Run CodeQL Analysis
uses: github/codeql-action/init@v3
with:
languages: javascript
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
validate-mcp:
name: Validate MCP Server
runs-on: ubuntu-latest
needs: [build]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18.14'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts-${{ github.sha }}
- name: Test MCP server startup
run: |
timeout 10s node dist/index.js --test || true
echo "MCP server startup test completed"
- name: Validate MCP schema
run: npm run validate:mcp
release:
name: Release & Publish
runs-on: ubuntu-latest
needs: [lint, test, build, security, validate-mcp]
if: github.event_name == 'release' && github.event.action == 'published'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18.14'
cache: 'npm'
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: npm ci
- name: Build for release
run: npm run build
- name: Create release package
run: |
mkdir -p release
cp -r dist/ release/
cp package.json README.md LICENSE release/
cp config/environments.example.json release/
- name: Upload release artifacts
uses: actions/upload-artifact@v4
with:
name: release-package-${{ github.event.release.tag_name }}
path: release/
retention-days: 90
- name: Create GitHub Release Assets
run: |
tar -czf devops-enhanced-mcp-${{ github.event.release.tag_name }}.tar.gz -C release .
zip -r devops-enhanced-mcp-${{ github.event.release.tag_name }}.zip release/
- name: Upload Release Assets
uses: softprops/action-gh-release@v1
with:
files: |
devops-enhanced-mcp-${{ github.event.release.tag_name }}.tar.gz
devops-enhanced-mcp-${{ github.event.release.tag_name }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
post-deploy:
name: Post-Deployment Validation
runs-on: ubuntu-latest
needs: [release]
if: github.event_name == 'release' && github.event.action == 'published'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Validate release
run: |
echo "Release ${{ github.event.release.tag_name }} validation"
echo "✅ Build artifacts created successfully"
echo "✅ Security scans passed"
echo "✅ MCP server validation completed"
echo "✅ Release packages uploaded"
- name: Notify success
run: |
echo "🎉 Azure DevOps MCP Proxy ${{ github.event.release.tag_name }} deployed successfully!"