Skip to content

Feature/landing page setup (#156) #108

Feature/landing page setup (#156)

Feature/landing page setup (#156) #108

Workflow file for this run

name: CI/CD Pipeline
on:
push:
branches: [main, develop, staging]
pull_request:
branches: [main, develop, staging]
workflow_dispatch: # Allow manual triggering
env:
NODE_VERSION: '18'
PNPM_VERSION: '8'
jobs:
# Code Quality Checks
code-quality:
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: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run TypeScript type checking
run: npm run type-check
- name: Run ESLint
run: npm run lint
- name: Check Prettier formatting
run: npm run format:check
- name: Check for console.log statements
run: |
echo "πŸ” Checking for console.log statements..."
if grep -r "console\.log" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" src/ components/ hooks/ lib/ app/; then
echo "❌ Found console.log statements. Please remove them before committing."
exit 1
else
echo "βœ… No console.log statements found."
fi
- name: Check for TODO/FIXME comments
run: |
echo "πŸ” Checking for TODO/FIXME comments..."
if grep -r "TODO\|FIXME" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" src/ components/ hooks/ lib/ app/; then
echo "⚠️ Found TODO/FIXME comments. Please address them before merging."
# Don't fail the build, just warn
else
echo "βœ… No TODO/FIXME comments found."
fi
# Build & Test
build:
name: Build & Test
runs-on: ubuntu-latest
needs: code-quality
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 application
run: npm run build
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build-files
path: .next/
retention-days: 7
# Security Audit
security:
name: Security Audit
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 security audit
run: npm audit --audit-level=moderate
- name: Check for known vulnerabilities
run: |
echo "πŸ”’ Checking for known vulnerabilities..."
npm audit --audit-level=moderate --json > audit-report.json
if jq -e '.metadata.vulnerabilities.total > 0' audit-report.json; then
echo "❌ Found security vulnerabilities. Please fix them before merging."
cat audit-report.json | jq '.metadata.vulnerabilities'
exit 1
else
echo "βœ… No security vulnerabilities found."
fi
# Commit Message Validation
commit-message:
name: Commit Message Validation
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Validate commit messages
run: |
echo "πŸ“ Validating commit messages..."
# Conventional commit regex
commit_regex='^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\(.+\))?: .{1,50}'
# Get all commits in the PR
commits=$(git log --pretty=format:"%H %s" origin/main..HEAD)
invalid_commits=""
while IFS= read -r commit; do
hash=$(echo "$commit" | cut -d' ' -f1)
message=$(echo "$commit" | cut -d' ' -f2-)
if ! echo "$message" | grep -qE "$commit_regex"; then
invalid_commits="$invalid_commits\n$hash: $message"
fi
done <<< "$commits"
if [ -n "$invalid_commits" ]; then
echo "❌ Invalid commit messages found:"
echo -e "$invalid_commits"
echo ""
echo "βœ… Please use conventional commit format:"
echo " <type>(<scope>): <description>"
echo ""
echo "πŸ“ Examples:"
echo " feat: add new feature"
echo " fix(wallet): resolve issue"
echo " docs: update documentation"
echo " style: format code"
exit 1
else
echo "βœ… All commit messages follow conventional format."
fi
# Bundle Analysis
bundle-analysis:
name: Bundle Analysis
runs-on: ubuntu-latest
needs: build
if: github.event_name == 'pull_request'
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 with bundle analysis
run: |
npm run build
npx @next/bundle-analyzer .next/static/chunks/**/*.js --out dist/bundle-analysis.html
- name: Upload bundle analysis
uses: actions/upload-artifact@v4
with:
name: bundle-analysis
path: dist/bundle-analysis.html
retention-days: 30
# Performance Testing
performance:
name: Performance Testing
runs-on: ubuntu-latest
needs: build
if: github.event_name == 'pull_request'
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 application
run: npm run build
- name: Check bundle size
run: |
echo "πŸ“¦ Checking bundle size..."
# Get the main bundle size
main_bundle_size=$(du -s .next/static/chunks/ | grep main | awk '{print $1}')
# Set threshold (in KB)
threshold=500
if [ "$main_bundle_size" -gt "$threshold" ]; then
echo "⚠️ Bundle size ($main_bundle_size KB) exceeds threshold ($threshold KB)"
echo "Consider optimizing your bundle size."
else
echo "βœ… Bundle size ($main_bundle_size KB) is within acceptable limits."
fi
# Deploy to Staging (if on develop branch)
deploy-staging:
name: Deploy to Staging
runs-on: ubuntu-latest
needs: [code-quality, build, security]
if: github.ref == 'refs/heads/develop' && github.event_name == 'push'
environment: staging
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 application
run: npm run build
- name: Deploy to staging
run: |
echo "πŸš€ Deploying to staging environment..."
# Add your staging deployment commands here
# Example: npm run deploy:staging
echo "βœ… Successfully deployed to staging!"
# Deploy to Production (if on main branch)
deploy-production:
name: Deploy to Production
runs-on: ubuntu-latest
needs: [code-quality, build, security, commit-message]
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
environment: production
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 application
run: npm run build
- name: Deploy to production
run: |
echo "πŸš€ Deploying to production environment..."
# Add your production deployment commands here
# Example: npm run deploy:production
echo "βœ… Successfully deployed to production!"
# Notify on Failure
notify-failure:
name: Notify on Failure
runs-on: ubuntu-latest
needs: [code-quality, build, security]
if: failure()
steps:
- name: Notify failure
run: |
echo "❌ CI/CD pipeline failed!"
echo "Please check the logs and fix the issues before merging."
# Add your notification logic here (Slack, email, etc.)