-
Notifications
You must be signed in to change notification settings - Fork 0
117 lines (99 loc) · 4.31 KB
/
deploy.yml
File metadata and controls
117 lines (99 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
name: '🚀 Deploy NestJS API Docker App'
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: self-hosted
name: '🐳 Build & Deploy'
steps:
- name: '⬇️ Setup Node.js'
uses: actions/setup-node@v4
with:
node-version: '20.x'
cache: 'pnpm'
cache-dependency-path: pnpm-lock.yaml
- name: '🔍 Checkout Code'
uses: actions/checkout@v4
- 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
# =======================================================
# 🧩 Initialize Git Submodules (for prisma)
# =======================================================
- name: '🧩 Init Git Submodules'
run: |
git submodule update --init --recursive
# =======================================================
# 🛠️ Generate Prisma Client
# =======================================================
- name: '🛠️ Run Prisma Generate'
run: |
npx prisma generate
working-directory: ./
# =======================================================
# 🐳 Docker Operations
# =======================================================
- 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 new webapp image.
echo "Building the latest webapp image..."
# Use 'codebuilder' as the stack prefix
docker compose -p codebuilder build webapp
# Step 5: Forcefully remove the old webapp container to prevent conflicts.
echo "Forcefully removing old webapp container if it exists..."
docker rm -f codebuilder-webapp || true
# Step 6: Deploy the new webapp container.
echo "Deploying the new webapp container..."
# Use 'codebuilder' as the stack prefix
docker compose -p codebuilder up -d --no-deps webapp
- name: '🗑 Prune Old Docker Images'
if: always()
run: docker image prune -af