academia/.gitea/workflows/deploy.yaml

107 lines
3.6 KiB
YAML

name: Deploy to k3s
on:
push:
branches: [main]
workflow_dispatch:
env:
K3S_HOST: "100.67.198.92"
K3S_USER: "andres"
NAMESPACE: "student-enrollment"
DOMAIN: "academia.ingeniumcodex.com"
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- 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: Sync code to k3s
run: |
rsync -az --delete \
--exclude '.git' \
--exclude 'node_modules' \
--exclude 'dist' \
--exclude 'bin' \
--exclude 'obj' \
--exclude '.angular' \
--exclude 'tests' \
--exclude 'docs' \
./ ${{ env.K3S_USER }}@${{ env.K3S_HOST }}:~/student-enrollment/
- name: Build images (parallel)
run: |
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} << 'ENDSSH'
cd ~/student-enrollment
export DOCKER_BUILDKIT=1
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S docker build \
-f deploy/docker/Dockerfile.api -t student-api:latest . &
PID_API=$!
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S docker build \
-f deploy/docker/Dockerfile.frontend -t student-frontend:latest . &
PID_FE=$!
wait $PID_API || exit 1
wait $PID_FE || exit 1
ENDSSH
- name: Import to k3s
run: |
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} << 'ENDSSH'
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S sh -c \
'docker save student-api:latest | k3s ctr images import -'
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S sh -c \
'docker save student-frontend:latest | k3s ctr images import -'
ENDSSH
- name: Setup namespace if needed
run: |
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} << 'ENDSSH'
cd ~/student-enrollment/deploy/k3s
if ! echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S kubectl get ns student-enrollment &>/dev/null; then
echo "Creating namespace and resources..."
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S kubectl apply -k .
fi
ENDSSH
- name: Deploy
run: |
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} << 'ENDSSH'
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S kubectl rollout restart \
deployment/student-api deployment/student-frontend -n student-enrollment
ENDSSH
- name: Wait rollout
run: |
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} << 'ENDSSH'
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S kubectl rollout status \
deployment/student-api -n student-enrollment --timeout=120s
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S kubectl rollout status \
deployment/student-frontend -n student-enrollment --timeout=60s
ENDSSH
- name: Health check
run: |
sleep 5
curl -sf https://${{ env.DOMAIN }}/health || exit 1
curl -sf https://${{ env.DOMAIN }}/ || exit 1
- name: Rollback on failure
if: failure()
run: |
ssh ${{ env.K3S_USER }}@${{ env.K3S_HOST }} << 'ENDSSH'
echo "${{ secrets.K3S_SUDO_PASS }}" | sudo -S kubectl rollout undo \
deployment/student-api deployment/student-frontend -n student-enrollment 2>/dev/null || true
ENDSSH