Refactor GitHub Actions workflow to focus on building and pushing Docker images

This commit is contained in:
Matt 2025-08-06 14:50:08 +02:00
parent 0cb5135433
commit 44e6dbe410
1 changed files with 18 additions and 168 deletions

View File

@ -1,175 +1,25 @@
name: Build and Deploy MonacoUSA Portal
name: Build And Push Image
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
on: [push]
jobs:
test:
docker:
runs-on: ubuntu-latest
name: Test Application
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linting
run: npm run lint || echo "Linting not configured"
- name: Run type checking
run: npm run typecheck || echo "Type checking not configured"
- name: Build application
run: npm run build
- name: Test health endpoint
run: |
# Start the application in background
npm run preview &
APP_PID=$!
# Wait for app to start
sleep 10
# Test health endpoint
curl -f http://localhost:3000/api/health || exit 1
# Clean up
kill $APP_PID
- name: Login To Registry
uses: docker/login-action@v3
with:
registry: ${{ vars.REGISTRY_HOST }}
username: ${{ vars.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_TOKEN }}
build:
runs-on: ubuntu-latest
needs: test
name: Build and Push Docker Image
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Login To Registry
uses: docker/login-action@v3
with:
registry: ${{ vars.REGISTRY_HOST }}
username: ${{ vars.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Set Up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set Up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build And Push
uses: docker/build-push-action@v6
with:
platforms: linux/amd64
push: true
tags: |
${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:latest
${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:${{ github.ref_name }}
deploy-staging:
runs-on: ubuntu-latest
needs: build
name: Deploy to Staging
if: github.ref == 'refs/heads/develop'
environment: staging
steps:
- name: Deploy to staging server
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.STAGING_HOST }}
username: ${{ secrets.STAGING_USER }}
key: ${{ secrets.STAGING_SSH_KEY }}
port: ${{ secrets.STAGING_PORT || 22 }}
script: |
# Navigate to application directory
cd /opt/monacousa-portal-staging
# Pull latest image
docker pull ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:develop
# Update docker-compose with new image
sed -i 's|image:.*|image: ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:develop|' docker-compose.yml
# Deploy with zero downtime
docker-compose up -d --no-deps monacousa-portal
# Wait for health check
sleep 30
# Verify deployment
curl -f http://localhost:3000/api/health || exit 1
# Clean up old images
docker image prune -f
deploy-production:
runs-on: ubuntu-latest
needs: build
name: Deploy to Production
if: github.ref == 'refs/heads/main'
environment: production
steps:
- name: Deploy to production server
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USER }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
port: ${{ secrets.PRODUCTION_PORT || 22 }}
script: |
# Navigate to application directory
cd /opt/monacousa-portal
# Pull latest image
docker pull ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:latest
# Create backup of current deployment
docker tag monacousa-portal:current monacousa-portal:backup-$(date +%Y%m%d-%H%M%S) || true
# Update docker-compose with new image
sed -i 's|image:.*|image: ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:latest|' docker-compose.yml
# Deploy with zero downtime
docker-compose up -d --no-deps monacousa-portal
# Wait for health check
sleep 30
# Verify deployment
curl -f https://monacousa.org/api/health || exit 1
# Clean up old images (keep last 3)
docker images ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }} --format "table {{.Repository}}:{{.Tag}}\t{{.CreatedAt}}" | tail -n +4 | awk '{print $1}' | xargs -r docker rmi || true
notify:
runs-on: ubuntu-latest
needs: [deploy-staging, deploy-production]
name: Notify Deployment
if: always()
steps:
- name: Notify success
if: ${{ needs.deploy-staging.result == 'success' || needs.deploy-production.result == 'success' }}
run: |
echo "Deployment successful!"
# Add webhook notification here if needed
# curl -X POST ${{ secrets.WEBHOOK_URL }} -d "Deployment successful for ${{ github.ref }}"
- name: Notify failure
if: ${{ needs.deploy-staging.result == 'failure' || needs.deploy-production.result == 'failure' }}
run: |
echo "Deployment failed!"
# Add webhook notification here if needed
# curl -X POST ${{ secrets.WEBHOOK_URL }} -d "Deployment failed for ${{ github.ref }}"
- name: Build And Push
uses: docker/build-push-action@v6
with:
platforms: linux/amd64
push: true
tags: |
${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:latest