# LocalGreenChain Production Deployment # Agent 4: Production Deployment # # Deploys to production when a release is published # or manually triggered name: Deploy Production on: release: types: [published] workflow_dispatch: inputs: environment: description: 'Deployment environment' required: true default: 'production' type: choice options: - production - staging concurrency: group: deploy-${{ github.event.inputs.environment || 'production' }} cancel-in-progress: false env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: # ========================================================================== # Build and Push Docker Image # ========================================================================== build: name: Build & Push Image runs-on: ubuntu-latest timeout-minutes: 20 permissions: contents: read packages: write outputs: image_tag: ${{ steps.meta.outputs.tags }} image_digest: ${{ steps.build.outputs.digest }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=branch type=ref,event=pr type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=sha - name: Build and push id: build uses: docker/build-push-action@v5 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max build-args: | NEXT_PUBLIC_API_URL=${{ vars.API_URL }} NEXT_PUBLIC_SENTRY_DSN=${{ vars.SENTRY_DSN }} # ========================================================================== # Deploy to Production # ========================================================================== deploy: name: Deploy runs-on: ubuntu-latest timeout-minutes: 15 needs: [build] environment: name: ${{ github.event.inputs.environment || 'production' }} url: ${{ vars.APP_URL }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Deploy notification (start) run: | echo "🚀 Starting deployment to ${{ github.event.inputs.environment || 'production' }}" echo "Image: ${{ needs.build.outputs.image_tag }}" # Add your deployment steps here # Examples: # - SSH and docker-compose pull/up # - Kubernetes deployment # - Cloud provider specific deployment - name: Deploy notification (complete) run: | echo "✅ Deployment completed successfully" # ========================================================================== # Post-Deployment Verification # ========================================================================== verify: name: Verify Deployment runs-on: ubuntu-latest timeout-minutes: 10 needs: [deploy] steps: - name: Wait for deployment to stabilize run: sleep 30 - name: Health check run: | for i in {1..5}; do status=$(curl -s -o /dev/null -w "%{http_code}" ${{ vars.APP_URL }}/api/health || echo "000") if [ "$status" = "200" ]; then echo "✅ Health check passed" exit 0 fi echo "Attempt $i: Status $status, retrying..." sleep 10 done echo "❌ Health check failed after 5 attempts" exit 1 - name: Smoke tests run: | # Verify critical endpoints curl -f ${{ vars.APP_URL }}/api/health/live || exit 1 curl -f ${{ vars.APP_URL }}/api/health/ready || exit 1 echo "✅ Smoke tests passed" # ========================================================================== # Rollback on Failure # ========================================================================== rollback: name: Rollback runs-on: ubuntu-latest needs: [verify] if: failure() steps: - name: Rollback notification run: | echo "⚠️ Deployment verification failed, initiating rollback..." # Add rollback logic here - name: Alert team run: | echo "🔔 Deployment failed - team has been notified"