UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

213 lines (190 loc) 6.99 kB
# GitHub Actions CD Template # Purpose: Continuous Deployment workflow for staging and production # Generated by: AIOS-FullStack @github-devops agent # # Usage: Copy to .github/workflows/cd.yml and customize name: CD on: push: branches: [main] tags: ['v*'] workflow_dispatch: inputs: environment: description: 'Deployment environment' required: true default: 'staging' type: choice options: - staging - production env: NODE_VERSION: '20.x' # Configure your deployment targets # VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} # VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} jobs: # ============================================================================ # DETERMINE ENVIRONMENT # ============================================================================ setup: name: Setup Deployment runs-on: ubuntu-latest outputs: environment: ${{ steps.set-env.outputs.environment }} version: ${{ steps.set-version.outputs.version }} steps: - name: Determine environment id: set-env run: | if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then echo "environment=production" >> $GITHUB_OUTPUT else echo "environment=staging" >> $GITHUB_OUTPUT fi - name: Set version id: set-version run: | if [[ "${{ github.ref }}" == refs/tags/v* ]]; then echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT else echo "version=${{ github.sha }}" >> $GITHUB_OUTPUT fi # ============================================================================ # BUILD FOR DEPLOYMENT # ============================================================================ build: name: Build for ${{ needs.setup.outputs.environment }} runs-on: ubuntu-latest needs: setup environment: ${{ needs.setup.outputs.environment }} 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 env: NODE_ENV: production # Add environment-specific build vars # NEXT_PUBLIC_API_URL: ${{ vars.API_URL }} - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: build-${{ needs.setup.outputs.environment }} path: dist/ retention-days: 7 # ============================================================================ # DEPLOY TO STAGING # ============================================================================ deploy-staging: name: Deploy to Staging runs-on: ubuntu-latest needs: [setup, build] if: needs.setup.outputs.environment == 'staging' environment: name: staging url: ${{ steps.deploy.outputs.url }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: build-staging path: dist/ # Vercel deployment example # - name: Deploy to Vercel # id: deploy # uses: amondnet/vercel-action@v25 # with: # vercel-token: ${{ secrets.VERCEL_TOKEN }} # vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} # vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} - name: Deploy (placeholder) id: deploy run: | echo "Deploying to staging..." echo "url=https://staging.example.com" >> $GITHUB_OUTPUT echo "::notice::Deployed to staging at https://staging.example.com" # ============================================================================ # DEPLOY TO PRODUCTION # ============================================================================ deploy-production: name: Deploy to Production runs-on: ubuntu-latest needs: [setup, build] if: needs.setup.outputs.environment == 'production' environment: name: production url: ${{ steps.deploy.outputs.url }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: build-production path: dist/ # Vercel production deployment # - name: Deploy to Vercel Production # id: deploy # uses: amondnet/vercel-action@v25 # with: # vercel-token: ${{ secrets.VERCEL_TOKEN }} # vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} # vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} # vercel-args: '--prod' - name: Deploy (placeholder) id: deploy run: | echo "Deploying to production..." echo "url=https://example.com" >> $GITHUB_OUTPUT echo "::notice::Deployed to production at https://example.com" # ============================================================================ # DATABASE MIGRATIONS (Optional) # ============================================================================ # migrations: # name: Run Database Migrations # runs-on: ubuntu-latest # needs: [setup, deploy-staging, deploy-production] # if: always() && (needs.deploy-staging.result == 'success' || needs.deploy-production.result == 'success') # environment: ${{ needs.setup.outputs.environment }} # steps: # - name: Checkout code # uses: actions/checkout@v4 # # - name: Run migrations # run: npm run db:migrate # env: # DATABASE_URL: ${{ secrets.DATABASE_URL }} # ============================================================================ # POST-DEPLOYMENT VERIFICATION # ============================================================================ verify: name: Verify Deployment runs-on: ubuntu-latest needs: [setup, deploy-staging, deploy-production] if: always() && (needs.deploy-staging.result == 'success' || needs.deploy-production.result == 'success') steps: - name: Health check run: | # Add your health check endpoint # curl -f https://${{ needs.setup.outputs.environment }}.example.com/health echo "Deployment verification passed" - name: Notify on success if: success() run: | echo "::notice::Successfully deployed to ${{ needs.setup.outputs.environment }}" - name: Notify on failure if: failure() run: | echo "::error::Deployment verification failed"