-
Notifications
You must be signed in to change notification settings - Fork 5
202 lines (175 loc) Β· 7.55 KB
/
backend-prod.yml
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
name: backend-push
on:
push:
branches: [ "main", "feature/#745" ]
paths:
- 'server/**'
- '.github/workflows/**'
jobs:
# build:
# runs-on: ubuntu-latest
#
# defaults:
# run:
# shell: bash
# working-directory: ./server
#
# permissions:
# contents: read
#
# steps:
# - name: CheckOut
# uses: actions/checkout@v4
# with:
# token: ${{secrets.CONFIG_SUBMODULE_TOKEN}}
# submodules: true
#
# - name: Set up JDK 17
# uses: actions/setup-java@v4
# with:
# java-version: '17'
# distribution: 'temurin'
#
# - name: Setup Gradle
# uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
#
# - name: Grant execute permission for gradlew
# run: chmod +x gradlew
#
# - name: Test with Gradle Wrapper
# run: ./gradlew clean build
#
# - name: Login to Docker Hub
# uses: docker/login-action@v3
# with:
# username: ${{ secrets.DOCKER_USERNAME }}
# password: ${{ secrets.DOCKER_PASSWORD }}
#
# - name: Set up Docker BuildX
# uses: docker/setup-buildx-action@v3
#
# - name: Build and push
# run: |
# docker buildx build --platform linux/arm64 -t \
# ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_BE_PROD }} --push .
deploy:
# needs: build
strategy:
matrix:
runner: [ prod-1 ] #, prod-2, prod-3 ]
runs-on: [ self-hosted, '${{ matrix.runner }}' ]
steps:
- name: Docker Image pull
run: sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_BE_PROD }}
- name: Check running container and determine the next port
id: check-port
run: |
echo "Checking if any container is running on ports 8080 or 8081..."
CURRENT_PORT=$(sudo docker ps --format "{{.Names}}" | grep "haengdong-backend" | grep -o '8080\|8081' || echo "")
echo "CURRENT_PORT on port $CURRENT_PORT."
# CURRENT_PORTκ° λΉ λ¬Έμμ΄μ΄κ±°λ 8081μΈ κ²½μ°
if [ "$CURRENT_PORT" == "8081" ]; then
echo "IF CURRENT_PORT : null or 8081"
NEXT_PORT=8080
else
echo "IF CURRENT_PORT : 8080"
NEXT_PORT=8081
fi
echo "Next container will run on port $NEXT_PORT."
echo "::set-output name=next_port::$NEXT_PORT"
echo "::set-output name=current_port::$CURRENT_PORT"
- name: Run new container on the alternate port
run: |
echo "Running new container on port ${{ steps.check-port.outputs.next_port }}..."
sudo docker run -d -p ${{ steps.check-port.outputs.next_port }}:8080 \
-e SPRING_PROFILES_ACTIVE=prod -v log-volume:/app/logs --name haengdong-backend-${{ steps.check-port.outputs.next_port }} \
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_BE_PROD }}
- name: Wait for Application Booting 30 seconds
run: |
echo "Waiting for the application to boot..."
for ((i=1;i<=30;i++)); do
echo -n "."
sleep 1
done
echo # μ€λ°κΏ
- name: Health check the new container
id: health-check
run: |
echo "Performing health check for the new container on port ${{ steps.check-port.outputs.next_port }}..."
HEALTH_STATUS=$(curl -s http://localhost:${{ steps.check-port.outputs.next_port }}/actuator/health | sed -n 's/.*"status":"\([^"]*\)".*/\1/p')
echo "Health check status: $HEALTH_STATUS"
if [ "$HEALTH_STATUS" != "UP" ]; then
echo "Health check failed. Rolling back..."
sudo docker rm -f haengdong-backend-${{ steps.check-port.outputs.next_port }}
exit 1
fi
echo "Health check passed."
- name: Update or create Nginx container to point to new container port
run: |
NGINX_CONTAINER_NAME="nginx-proxy"
echo "Checking if Nginx container exists..."
if sudo docker ps -a --filter "name=$NGINX_CONTAINER_NAME" --format "{{.Names}}" | grep -w $NGINX_CONTAINER_NAME; then
# Check if the Nginx container is running
if sudo docker ps --filter "name=$NGINX_CONTAINER_NAME" --format "{{.Names}}" | grep -w $NGINX_CONTAINER_NAME; then
echo "Nginx container is running."
else
echo "Nginx container exists but is not running. Starting Nginx container..."
sudo docker start $NGINX_CONTAINER_NAME
echo "Nginx container started."
fi
# Ensure nginx-conf directory and default.conf file exist
mkdir -p ./nginx-conf
# Create or update the default.conf file with the new configuration
echo "Creating or updating default.conf..."
cat > ./nginx-conf/default.conf <<EOF
server { listen 80; location / { proxy_pass http://127.0.0.1:${{ steps.check-port.outputs.next_port }}; }}
EOF
# Test Nginx configuration inside a temporary container
echo "Testing Nginx configuration..."
sudo docker run --rm -v $(pwd)/nginx-conf:/etc/nginx/conf.d:ro nginx nginx -t
if [ $? -eq 0 ]; then
echo "Nginx configuration test passed."
else
echo "Nginx configuration test failed. Please check the configuration file."
exit 1
fi
# Restart the Nginx container to apply changes
echo "Restarting Nginx container..."
sudo docker restart $NGINX_CONTAINER_NAME
echo "Nginx container restarted."
else
echo "Nginx container not found. Creating a new Nginx container..."
# Create nginx-conf directory
mkdir -p ./nginx-conf
# Create the default.conf file with the initial configuration
echo "Creating default.conf..."
cat > ./nginx-conf/default.conf <<EOF
server { listen 80; location / { proxy_pass http://127.0.0.1:${{ steps.check-port.outputs.next_port }}; }}
EOF
# Test Nginx configuration inside a temporary container
echo "Testing Nginx configuration..."
sudo docker run --rm -v $(pwd)/nginx-conf:/etc/nginx/conf.d:ro nginx nginx -t
if [ $? -eq 0 ]; then
echo "Nginx configuration test passed."
else
echo "Nginx configuration test failed. Please check the configuration file."
exit 1
fi
# Run a new Nginx container with the updated config
sudo docker run -d --name $NGINX_CONTAINER_NAME -p 80:80 \
-v $(pwd)/nginx-conf:/etc/nginx/conf.d:ro nginx
echo "New Nginx container created and running."
fi
- name: Stop and remove the old container
run: |
CURRENT_PORT=${{ steps.check-port.outputs.current_port }}
if [ -n "$CURRENT_PORT" ]; then
echo "Stopping on port $CURRENT_PORT..."
sudo docker ps --filter "publish=$CURRENT_PORT" --format "{{.ID}}" | xargs sudo docker stop
echo "Sleeping on port $CURRENT_PORT..."
sleep 15
echo "Removing on port $CURRENT_PORT..."
sudo docker ps -a --format "{{.Names}}" | grep "haengdong-backend-$CURRENT_PORT" | xargs sudo docker rm
else
echo "No container to stop and remove."
fi