academia/.gitea/workflows/deploy.yaml

138 lines
4.4 KiB
YAML

name: CI/CD Pipeline
on:
push:
branches: [main]
workflow_dispatch:
env:
K3S_HOST: "100.67.198.92"
K3S_USER: "andres"
DOMAIN: "academia.ingeniumcodex.com"
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.K3S_SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ env.K3S_HOST }} >> ~/.ssh/known_hosts 2>/dev/null
- name: Deploy to K3s
run: |
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} 'bash -s' << 'ENDSSH'
set -e
cd ~/academia
echo "=== Pulling latest code ==="
git fetch origin main
git reset --hard origin/main
echo "=== Checking for dotnet ==="
if which dotnet > /dev/null 2>&1; then
echo "Running backend tests..."
dotnet test tests/Domain.Tests --verbosity minimal
dotnet test tests/Application.Tests --verbosity minimal
dotnet test tests/Integration.Tests --verbosity minimal
else
echo "WARN: dotnet not installed - skipping tests"
fi
echo "=== Building Docker images ==="
sudo docker build -f deploy/docker/Dockerfile.api -t student-api:latest . &
PID_API=$!
sudo docker build -f deploy/docker/Dockerfile.frontend -t student-frontend:latest . &
PID_FE=$!
wait $PID_API
wait $PID_FE
echo "=== Importing to K3s ==="
sudo sh -c 'docker save student-api:latest | k3s ctr images import -'
sudo sh -c 'docker save student-frontend:latest | k3s ctr images import -'
echo "=== Deploying ==="
sudo kubectl apply -k deploy/k3s/
sudo kubectl rollout restart deployment/student-api deployment/student-frontend -n academia
echo "=== Waiting for rollout ==="
sudo kubectl rollout status deployment/student-api -n academia --timeout=180s
sudo kubectl rollout status deployment/student-frontend -n academia --timeout=60s
echo "=== Deploy complete ==="
ENDSSH
smoke-tests:
runs-on: ubuntu-latest
needs: deploy
steps:
- name: Wait for services
run: sleep 15
- name: Basic Health Checks
run: |
echo "Checking health..."
curl -sf https://${{ env.DOMAIN }}/health | grep -q '"status":"Healthy"'
echo "Checking frontend..."
curl -sf https://${{ env.DOMAIN }}/ | grep -q 'Sistema de Estudiantes'
echo "Checking GraphQL..."
curl -sf -X POST https://${{ env.DOMAIN }}/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ subjects { id } }"}' | grep -q '"subjects"'
echo "Basic checks passed!"
e2e-tests:
runs-on: ubuntu-latest
needs: smoke-tests
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: src/frontend/package-lock.json
- name: Install dependencies
working-directory: src/frontend
run: npm ci --legacy-peer-deps
- name: Install Playwright browsers
working-directory: src/frontend
run: npx playwright install chromium --with-deps
- name: Run E2E Smoke Tests
working-directory: src/frontend
env:
CI: true
BASE_URL: https://${{ env.DOMAIN }}
run: npx playwright test smoke.spec.ts --reporter=list
- name: Upload test artifacts
if: failure()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: src/frontend/playwright-report/
retention-days: 7
rollback:
runs-on: ubuntu-latest
needs: e2e-tests
if: failure()
steps:
- name: Setup SSH and Rollback
run: |
mkdir -p ~/.ssh
echo "${{ secrets.K3S_SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ env.K3S_HOST }} >> ~/.ssh/known_hosts 2>/dev/null
echo "Rolling back deployments..."
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} \
'sudo kubectl rollout undo deployment/student-api deployment/student-frontend -n academia'
echo "Rollback complete"