mirror of
https://github.com/ryankazokas/turbovault-app.git
synced 2026-04-16 21:02:52 +00:00
127 lines
4.2 KiB
YAML
127 lines
4.2 KiB
YAML
name: Build and Deploy
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*.*.*'
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
build-and-deploy:
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
packages: write # Required for pushing to ghcr.io
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Extract version from tag
|
|
id: version
|
|
run: |
|
|
if [[ "${{ github.ref }}" =~ ^refs/tags/v(.*)$ ]]; then
|
|
echo "version=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
|
|
echo "tag=${BASH_REMATCH[0]#refs/tags/}" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "version=latest" >> $GITHUB_OUTPUT
|
|
echo "tag=latest" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Log in to GitHub Container Registry
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GHCR_TOKEN }}
|
|
|
|
- name: Build and push Docker image
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
push: true
|
|
tags: |
|
|
ghcr.io/ryankazokas/turbovault-app:${{ steps.version.outputs.tag }}
|
|
ghcr.io/ryankazokas/turbovault-app:latest
|
|
cache-from: type=gha
|
|
cache-to: type=gha,mode=max
|
|
|
|
- name: Connect to Tailscale
|
|
uses: tailscale/github-action@v2
|
|
with:
|
|
oauth-client-id: ${{ secrets.TAILSCALE_CLIENT_ID }}
|
|
oauth-secret: ${{ secrets.TAILSCALE_CLIENT_SECRET }}
|
|
tags: tag:ci
|
|
|
|
- name: Setup kubectl
|
|
uses: azure/setup-kubectl@v3
|
|
|
|
- name: Configure kubeconfig
|
|
env:
|
|
KUBECONFIG_CONTENT: ${{ secrets.KUBECONFIG }}
|
|
run: |
|
|
mkdir -p ~/.kube
|
|
echo "$KUBECONFIG_CONTENT" | base64 -d > ~/.kube/config
|
|
chmod 600 ~/.kube/config
|
|
|
|
- name: Run database migrations
|
|
run: |
|
|
echo "🗄️ Running database migrations..."
|
|
|
|
# Delete old migration job if it exists
|
|
kubectl delete job turbovault-migrate -n turbovault --ignore-not-found=true
|
|
|
|
# Update the migration job with the new image version
|
|
sed "s|image: ghcr.io/ryankazokas/turbovault-app:.*|image: ghcr.io/ryankazokas/turbovault-app:${{ steps.version.outputs.tag }}|" \
|
|
k8s/migrate-job.yaml | kubectl apply -f -
|
|
|
|
# Wait for migration to complete
|
|
echo "⏳ Waiting for migrations to complete..."
|
|
kubectl wait --for=condition=complete --timeout=5m job/turbovault-migrate -n turbovault
|
|
|
|
echo "✅ Migrations complete!"
|
|
echo ""
|
|
echo "📋 Migration logs:"
|
|
kubectl logs job/turbovault-migrate -n turbovault
|
|
|
|
- name: Deploy to Kubernetes
|
|
run: |
|
|
echo "🚀 Deploying version ${{ steps.version.outputs.tag }} to Kubernetes..."
|
|
|
|
kubectl set image deployment/turbovault \
|
|
turbovault=ghcr.io/ryankazokas/turbovault-app:${{ steps.version.outputs.tag }} \
|
|
-n turbovault
|
|
|
|
echo "⏳ Waiting for rollout to complete..."
|
|
kubectl rollout status deployment/turbovault -n turbovault --timeout=5m
|
|
|
|
echo "✅ Deployment complete!"
|
|
echo ""
|
|
echo "📊 Current pods:"
|
|
kubectl get pods -n turbovault -l app=turbovault
|
|
|
|
- name: Deployment summary
|
|
if: success()
|
|
run: |
|
|
echo "✅ Build and deployment successful!"
|
|
echo ""
|
|
echo "📦 Image: ghcr.io/ryankazokas/turbovault-app:${{ steps.version.outputs.tag }}"
|
|
echo "🚀 Deployed to: turbovault namespace"
|
|
echo ""
|
|
echo "View logs:"
|
|
echo "kubectl logs -f -l app=turbovault -n turbovault"
|
|
|
|
- name: Rollback on failure
|
|
if: failure()
|
|
env:
|
|
KUBECONFIG_CONTENT: ${{ secrets.KUBECONFIG }}
|
|
run: |
|
|
echo "❌ Deployment failed! Attempting rollback..."
|
|
mkdir -p ~/.kube
|
|
echo "$KUBECONFIG_CONTENT" | base64 -d > ~/.kube/config
|
|
kubectl rollout undo deployment/turbovault -n turbovault || true
|
|
echo "⚠️ Rollback attempted. Check cluster status manually."
|