Skip to content

fix(tests): enhance smoke test script with response validation and cl… #120

fix(tests): enhance smoke test script with response validation and cl…

fix(tests): enhance smoke test script with response validation and cl… #120

Workflow file for this run

name: FieldTrack Backend CI/CD
on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:
inputs:
mode:
description: "Pipeline mode"
required: true
default: "deploy-and-test"
type: choice
options:
- deploy
- smoke-test
- deploy-and-test
jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "24"
cache: npm
# Cache key based on package-lock.json to correctly restore dependencies.
cache-dependency-path: "**/package-lock.json"
- name: Install dependencies
run: npm ci
- name: TypeScript compilation check
run: npm run typecheck
- name: Build (compile TypeScript)
run: npm run build
- name: Run tests
working-directory: apps/api
run: npm run test
build-and-deploy:
name: Build and Deploy
runs-on: ubuntu-latest
needs: test
if: |
github.event_name == 'push' ||
github.event.inputs.mode == 'deploy' ||
github.event.inputs.mode == 'deploy-and-test'
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Extract commit SHA
id: sha
run: echo "sha_short=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
file: ./apps/api/Dockerfile
push: true
tags: |
ghcr.io/rajashish147/fieldtrack-backend:${{ steps.sha.outputs.sha_short }}
ghcr.io/rajashish147/fieldtrack-backend:latest
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Deploy to VPS (Blue-Green)
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.DO_HOST }}
username: ${{ secrets.DO_USER }}
key: ${{ secrets.DO_SSH_KEY }}
script: |
cd /home/ashish/FieldTrack-2.0
git fetch origin
git reset --hard origin/master
chmod +x apps/api/scripts/deploy-bluegreen.sh
./apps/api/scripts/deploy-bluegreen.sh "${{ steps.sha.outputs.sha_short }}"
smoke-tests:
name: API Smoke Tests
runs-on: ubuntu-latest
needs: build-and-deploy
if: |
github.event.inputs.mode == 'smoke-test' ||
github.event.inputs.mode == 'deploy-and-test' ||
github.event_name == 'push'
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Wait for API health
run: |
echo "Waiting for API..."
for i in {1..30}; do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://api.fieldtrack.meowsician.tech/health)
if [ "$STATUS" = "200" ]; then
echo "API is healthy"
exit 0
fi
sleep 2
done
echo "API did not become healthy"
exit 1
- name: Install jq (needed for JSON parsing)
run: sudo apt-get update && sudo apt-get install -y jq
- name: Run API Smoke Tests
env:
FT_API_BASE_URL: ${{ secrets.FT_API_BASE_URL }}
FT_EMP_EMAIL: ${{ secrets.FT_EMP_EMAIL }}
FT_EMP_PASSWORD: ${{ secrets.FT_EMP_PASSWORD }}
FT_ADMIN_EMAIL: ${{ secrets.FT_ADMIN_EMAIL }}
FT_ADMIN_PASSWORD: ${{ secrets.FT_ADMIN_PASSWORD }}
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
run: |
chmod +x apps/api/scripts/smoke-test.sh
./apps/api/scripts/smoke-test.sh
- name: Upload smoke test report
uses: actions/upload-artifact@v4
with:
name: smoke-test-report
path: smoke-report.json
rollback:
name: Rollback Deployment
runs-on: ubuntu-latest
needs: smoke-tests
if: failure()
steps:
- name: Rollback on VPS
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.DO_HOST }}
username: ${{ secrets.DO_USER }}
key: ${{ secrets.DO_SSH_KEY }}
script: |
cd /home/ashish/FieldTrack-2.0
chmod +x apps/api/scripts/rollback.sh
./apps/api/scripts/rollback.sh --auto