| """CI/CD pipeline generation.""" |
|
|
| from __future__ import annotations |
|
|
| from typing import Any, Dict, List, Optional |
|
|
|
|
| class CICDGenerator: |
| """Generates CI/CD pipeline configurations.""" |
|
|
| def generate_github_actions( |
| self, |
| framework: str, |
| platform: str, |
| test_command: Optional[str] = None |
| ) -> Dict[str, Any]: |
| """Generate GitHub Actions workflow.""" |
| |
| |
| test_commands = { |
| "next.js": "npm run test", |
| "react": "npm test", |
| "django": "python manage.py test", |
| "fastapi": "pytest", |
| "flask": "pytest", |
| "express": "npm test", |
| } |
| |
| test_cmd = test_command or test_commands.get(framework.lower(), "npm test") |
| |
| |
| deploy_steps = { |
| "vercel": """ |
| - name: Deploy to Vercel |
| uses: amondnet/vercel-action@v20 |
| with: |
| vercel-token: ${{ secrets.VERCEL_TOKEN }} |
| vercel-org-id: ${{ secrets.ORG_ID }} |
| vercel-project-id: ${{ secrets.PROJECT_ID }} |
| """, |
| "netlify": """ |
| - name: Deploy to Netlify |
| uses: netlify/actions/cli@master |
| with: |
| args: deploy --prod --dir=build |
| env: |
| NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} |
| NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} |
| """, |
| "aws": """ |
| - name: Deploy to AWS |
| run: | |
| aws s3 sync build s3://${{ secrets.S3_BUCKET }} |
| aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_ID }} --paths "/*" |
| env: |
| AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} |
| AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} |
| """, |
| } |
| |
| deploy_step = deploy_steps.get(platform.lower(), """ |
| - name: Deploy |
| run: echo "Configure deployment for ${{ secrets.DEPLOY_PLATFORM }}" |
| """) |
| |
| workflow = f"""name: CI/CD Pipeline |
| |
| on: |
| push: |
| branches: [ main, master ] |
| pull_request: |
| branches: [ main, master ] |
| |
| jobs: |
| test: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Setup Node.js |
| uses: actions/setup-node@v3 |
| with: |
| node-version: '18' |
| - name: Install dependencies |
| run: npm install |
| - name: Run tests |
| run: {test_cmd} |
| - name: Build |
| run: npm run build |
| |
| deploy: |
| needs: test |
| runs-on: ubuntu-latest |
| if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Setup |
| run: npm install |
| - name: Build |
| run: npm run build |
| {deploy_step} |
| """ |
| |
| return { |
| "workflow": workflow, |
| "file": ".github/workflows/deploy.yml", |
| "framework": framework, |
| "platform": platform, |
| "steps": ["test", "build", "deploy"] |
| } |
|
|
| def generate_gitlab_ci(self, framework: str, platform: str) -> Dict[str, Any]: |
| """Generate GitLab CI configuration.""" |
| config = f""".gitlab-ci.yml: |
| stages: |
| - test |
| - build |
| - deploy |
| |
| test: |
| stage: test |
| script: |
| - npm install |
| - npm test |
| |
| build: |
| stage: build |
| script: |
| - npm install |
| - npm run build |
| artifacts: |
| paths: |
| - build/ |
| |
| deploy: |
| stage: deploy |
| script: |
| - echo "Deploy to {platform}" |
| only: |
| - main |
| """ |
| return { |
| "config": config, |
| "file": ".gitlab-ci.yml", |
| "framework": framework, |
| "platform": platform |
| } |
|
|
|
|