-
Notifications
You must be signed in to change notification settings - Fork 0
130 lines (114 loc) · 3.89 KB
/
backend-deploy.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
name: Backend Deploy Pipeline
on:
push:
branches: [ 'main' ]
paths-ignore:
- '**/*.md'
- 'README*'
- 'LICENSE'
- '.gitignore'
- '.env.example'
- 'docs/**'
- 'docker-compose.dev.yml'
- 'docker-compose.db.yml'
- 'docker-compose.local.yml'
- 'docker/**/docker-compose*.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: [ self-hosted, linux, x64, backend ]
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Ensure buildx cache
run: mkdir -p /tmp/.buildx-cache
- name: Cache Docker layers
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
file: Dockerfile
push: true
tags: leonardomeireles55/quality-lab-pro-back-end:latest
cache-from: type=registry,ref=leonardomeireles55/quality-lab-pro-back-end:latest
cache-to: type=inline,mode=min
deploy:
runs-on: [ self-hosted, linux, x64, backend ]
needs: build
environment: Production
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Deploy
env:
DB_DATABASE: ${{ secrets.DB_DATABASE }}
DB_DATABASE_TEST: ${{ secrets.DB_DATABASE_TEST }}
DB_ROOT_PASSWORD: ${{ secrets.DB_ROOT_PASSWORD }}
DB_LOCAL_PORT: ${{ secrets.DB_LOCAL_PORT }}
DB_USER: ${{ secrets.DB_USER }}
DB_DOCKER_PORT: ${{ secrets.DB_DOCKER_PORT }}
SERVER_LOCAL_PORT: ${{ secrets.SERVER_LOCAL_PORT }}
SERVER_DOCKER_PORT: ${{ secrets.SERVER_DOCKER_PORT }}
SPRING_PROFILES_ACTIVE: ${{ secrets.SPRING_PROFILES_ACTIVE }}
SPRING_DATASOURCE_URL: ${{ secrets.SPRING_DATASOURCE_URL }}
API_SECURITY_ISSUER: ${{ secrets.API_SECURITY_ISSUER }}
API_SECURITY_TOKEN_SECRET: ${{ secrets.API_SECURITY_TOKEN_SECRET }}
SPRING_MAIL_USERNAME: ${{ secrets.SPRING_MAIL_USERNAME }}
SPRING_MAIL_PASSWORD: ${{ secrets.SPRING_MAIL_PASSWORD }}
EMAIL_TO_SEND_LIST: ${{ secrets.EMAIL_TO_SEND_LIST }}
run: |
for i in 1 2 3; do
if docker compose pull && docker compose up -d; then
exit 0
fi
echo "Retry $i/3..."
sleep 10
done
exit 1
health-check:
runs-on: [ self-hosted, linux, x64, backend ]
needs: deploy
timeout-minutes: 5
steps:
- name: Health check with timeout and retry
run: |
max_attempts=12
attempt=1
while [ $attempt -le $max_attempts ]; do
if curl -sSf https://lab-spec.systems/backend/actuator/health; then
echo "Service is healthy!"
exit 0
fi
echo "Attempt $attempt/$max_attempts - Service not healthy yet..."
sleep 15
attempt=$((attempt + 1))
done
echo "Health check failed after $max_attempts attempts"
exit 1
notify:
runs-on: [ self-hosted, linux, x64, backend ]
needs: [deploy, health-check, health-check]
if: always()
steps:
- name: Notify deployment status
run: |
if [ "${{ job.status }}" = "success" ]; then
echo "✅ Deployment completed successfully"
else
echo "❌ Deployment failed"
fi