Fixing required api field bug. #87
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: '🚀 Deploy NestJS API Docker App' | |
| permissions: | |
| contents: write | |
| on: | |
| push: | |
| branches: [main] | |
| jobs: | |
| build-and-deploy: | |
| runs-on: self-hosted | |
| name: '🐳 Build & Deploy' | |
| steps: | |
| - name: '🔍 Checkout Code' | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: 'recursive' | |
| - name: "📦 Setup Node.js" | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20.x | |
| - name: "🧩 Install dependencies (npm)" | |
| run: npm install --legacy-peer-deps | |
| - name: "🧩 Install semver for version bump" | |
| run: npm install semver --legacy-peer-deps | |
| - name: "🔄 Auto-bump version (main only)" | |
| if: github.ref == 'refs/heads/main' | |
| run: node scripts/bumpVersion.js | |
| - name: '🔧 Configure Git for Automation' | |
| if: github.ref == 'refs/heads/main' | |
| run: | | |
| git config --global user.name "GitHub Actions" | |
| git config --global user.email "[email protected]" | |
| - name: '💾 Commit Version Update' | |
| if: github.ref == 'refs/heads/main' | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| git add version.json package.json | |
| git commit -m "chore: Auto-increment version [skip ci]" || echo "No changes to commit" | |
| git push | |
| - name: "🧹 Version bump cleanup" | |
| run: rm -rf node_modules | |
| - name: '�🔒 Verify Secrets Exist' | |
| run: | | |
| if [ -z "${{ secrets.GOOGLE_SERVICES_JSON_BASE64 }}" ]; then | |
| echo "❌ Critical error: GOOGLE_SERVICES_JSON_BASE64 secret missing!" | |
| exit 1 | |
| fi | |
| echo "✅ All secrets present" | |
| - name: '📁 Create google-services.json' | |
| run: | | |
| echo "$GOOGLE_SERVICES_JSON_BASE64" | base64 --decode > google-services.json | |
| echo "🔄 Validating JSON..." | |
| if ! jq empty google-services.json; then | |
| echo "❌ JSON validation failed!" | |
| exit 1 | |
| fi | |
| env: | |
| GOOGLE_SERVICES_JSON_BASE64: ${{ secrets.GOOGLE_SERVICES_JSON_BASE64 }} | |
| - name: '⚙️ Create .env File' | |
| run: | | |
| echo "${{ secrets.ENV_FILE_CONTENT }}" > .env | |
| echo "" >> .env | |
| # ======================================================= | |
| # 🐳 Docker Operations | |
| # ======================================================= | |
| - name: '� Debug: List workspace files and show package.json' | |
| run: | | |
| echo '--- DEBUG: Listing workspace files ---' | |
| ls -alh | |
| echo '--- DEBUG: Showing package.json ---' | |
| cat package.json | |
| echo '--- DEBUG: Listing node_modules/.bin if exists ---' | |
| if [ -d node_modules/.bin ]; then ls -l node_modules/.bin; else echo "node_modules/.bin does not exist"; fi | |
| # Ensure the Postgres data volume exists before starting services | |
| - name: '🔧 Ensure Postgres data volume exists' | |
| run: | | |
| if [ -z "$(docker volume ls -q -f name=codebuilder-postgres-data)" ]; then | |
| echo "Volume 'codebuilder-postgres-data' not found. Creating it..." | |
| docker volume create codebuilder-postgres-data | |
| else | |
| echo "Volume 'codebuilder-postgres-data' already exists. Skipping creation." | |
| fi | |
| - name: '�🚀 Build, Launch, and Update Services' | |
| run: | | |
| # Step 1: Ensure the Docker network exists. | |
| if ! docker network ls | grep -q "codebuilder-net"; then | |
| echo "Network 'codebuilder-net' not found. Creating it..." | |
| docker network create codebuilder-net | |
| else | |
| echo "Network 'codebuilder-net' already exists. Skipping creation." | |
| fi | |
| # Step 2: Ensure the database container is running. | |
| DB_CONTAINER_NAME="codebuilder-postgres-db" | |
| if [ $(docker ps -a -q -f name=^/${DB_CONTAINER_NAME}$) ]; then | |
| if ! [ $(docker ps -q -f name=^/${DB_CONTAINER_NAME}$) ]; then | |
| echo "Database container exists but is stopped. Starting it..." | |
| docker start ${DB_CONTAINER_NAME} | |
| fi | |
| else | |
| echo "Database container not found. Creating it..." | |
| # Use 'codebuilder' as the stack prefix | |
| docker compose -p codebuilder up -d db | |
| fi | |
| # Step 3: Wait for the database to be healthy. | |
| echo "Waiting for database to become available on localhost:5434..." | |
| while ! nc -z localhost 5434; do sleep 1; done | |
| echo "✅ Database is healthy." | |
| # ===================================================================== | |
| # THE FIX: Force the build to run in default server mode. | |
| # This overrides any conflicting environment variables. | |
| # ===================================================================== | |
| echo "Ensuring build runs in default server mode..." | |
| export NEXT_OUTPUT_MODE='standalone' | |
| # Step 4: Build the latest api image. | |
| echo "Building the latest api image..." | |
| # Get the current commit hash of the prisma submodule | |
| # This ensures Docker rebuilds the prisma layer when the submodule is updated | |
| PRISMA_COMMIT=$(git submodule status prisma | awk '{print $1}' | sed 's/^+//') | |
| echo "Using Prisma submodule commit: $PRISMA_COMMIT" | |
| # Force a complete rebuild with no cache to ensure fresh prisma schema | |
| docker compose -p codebuilder build --no-cache api | |
| # Step 5: Forcefully remove the old api container to prevent conflicts. | |
| echo "Forcefully removing old api container if it exists..." | |
| docker rm -f codebuilder-api || true | |
| # Step 6: Deploy the new api container. | |
| echo "Deploying the new api container..." | |
| # Use 'codebuilder' as the stack prefix | |
| docker compose -p codebuilder up -d --no-deps api | |
| - name: '🗑 Prune Old Docker Images' | |
| if: always() | |
| run: docker image prune -af |