Skip to content

Commit 47296e8

Browse files
committed
ci[test]: ci 테스트의 환경변수 세팅 수정 및 Repository secrets 세팅
1 parent 420fb32 commit 47296e8

File tree

2 files changed

+78
-93
lines changed

2 files changed

+78
-93
lines changed

.github/workflows/CI-CD_Pipeline.yml

Lines changed: 46 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,14 @@ on:
1414

1515
jobs:
1616
tests:
17-
strategy:
18-
fail-fast: false
19-
matrix:
20-
os: [ ubuntu-latest ]
21-
include:
22-
- os: ubuntu-latest
23-
gradle_cmd: "./gradlew"
24-
report_path: "backend/build/reports/tests"
25-
domain_tasks: "testUser testExchange testTrade_log testWallet testCoin"
26-
27-
runs-on: ${{ matrix.os }}
17+
runs-on: ubuntu-latest
2818
env:
19+
# 테스트 환경 설정
2920
SPRING_PROFILES_ACTIVE: test-ci
21+
# JWT 설정 (보안상 중요하므로 환경변수 처리)
22+
CUSTOM_JWT_SECRET_KEY: test-secret-key-for-ci-testing-only-minimum-32-characters-required
23+
CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS: 3600
3024

31-
# ✅ Redis 서비스 추가
3225
services:
3326
redis:
3427
image: redis:7-alpine
@@ -39,72 +32,59 @@ jobs:
3932
--health-interval 10s
4033
--health-timeout 5s
4134
--health-retries 5
42-
env:
43-
REDIS_PASSWORD: ""
4435
4536
steps:
4637
- uses: actions/checkout@v4
38+
4739
- name: Set up JDK 21
4840
uses: actions/setup-java@v4
4941
with:
5042
java-version: '21'
5143
distribution: 'temurin'
5244
cache: gradle
5345

54-
# ✅ gradlew 실행 권한 부여
5546
- name: Grant execute permission for gradlew
5647
run: chmod +x backend/gradlew
5748

58-
# ✅ Redis 연결 테스트
5949
- name: Test Redis connection
6050
run: |
6151
echo "Testing Redis connection..."
6252
timeout 10s bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/localhost/6379; do sleep 1; done'
6353
echo "Redis is ready!"
6454
65-
# ✅ application-test.yml에서 사용하는 모든 환경변수를 .env 파일에 생성
66-
- name: Create test .env file
67-
working-directory: backend
68-
run: |
69-
cat > .env << 'EOF'
70-
# Datasource 설정 (application-test.yml에서 참조)
71-
TEST_DATASOURCE_URL=jdbc:h2:mem:db_test;MODE=MySQL
72-
TEST_DATASOURCE_USERNAME=sa
73-
TEST_DATASOURCE_PASSWORD=
74-
TEST_DATASOURCE_DRIVER=org.h2.Driver
75-
76-
# JPA 설정 (application-test.yml에서 참조)
77-
TEST_JPA_HIBERNATE_DDL_AUTO=create-drop
78-
79-
# Redis 설정 (application-test.yml에서 참조, GitHub Actions 서비스 사용)
80-
TEST_REDIS_HOST=localhost
81-
TEST_REDIS_PORT=6379
82-
TEST_REDIS_PASSWORD=
83-
84-
# CI/CD 환경에서는 Embedded Redis 끄기
85-
SPRING_DATA_REDIS_EMBEDDED=false
86-
87-
# JWT 설정 (application-test.yml에서 참조)
88-
CUSTOM_JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}
89-
CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS=3600
90-
EOF
91-
92-
- name: Run unit, and domain tests
93-
run: ${{ matrix.gradle_cmd }} clean test
55+
- name: Run tests
56+
run: ./gradlew clean test
9457
working-directory: backend
9558

9659
- name: Upload Test Reports
9760
if: always()
9861
uses: actions/upload-artifact@v4
9962
with:
100-
name: test-reports-${{ matrix.os }}
101-
path: ${{ matrix.report_path }}
63+
name: test-reports
64+
path: backend/build/reports/tests
10265
retention-days: 7
10366

10467
build-artifacts:
10568
needs: tests
10669
runs-on: ubuntu-latest
107-
if: github.ref == 'refs/heads/main' # ✅ main 브랜치일 때만 실행
70+
if: github.ref == 'refs/heads/main'
71+
env:
72+
# 빌드용 최소 환경변수 (컴파일 시 @Value 바인딩용)
73+
SPRING_PROFILES_ACTIVE: prod
74+
CUSTOM_JWT_SECRET_KEY: build-secret-key-for-compilation-only-minimum-32-characters-required
75+
CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS: 3600
76+
# 빌드 시 필요한 더미 값들
77+
email_address: [email protected]
78+
send_email_password: build-password
79+
send_email_address: [email protected]
80+
PROD_DATASOURCE_URL: jdbc:mysql://localhost:3306/dummy
81+
PROD_DATASOURCE_DRIVER: com.mysql.cj.jdbc.Driver
82+
PROD_DATASOURCE_USERNAME: dummy
83+
PROD_DATASOURCE_PASSWORD: dummy
84+
PROD_JPA_HIBERNATE_DDL_AUTO: validate
85+
PROD_REDIS_HOST: localhost
86+
PROD_REDIS_PORT: 6379
87+
PROD_REDIS_PASSWORD: dummy
10888

10989
steps:
11090
- uses: actions/checkout@v4
@@ -115,20 +95,9 @@ jobs:
11595
java-version: 21
11696
cache: gradle
11797

118-
# ✅ gradlew 실행 권한 부여
11998
- name: Grant execute permission for gradlew
12099
run: chmod +x backend/gradlew
121100

122-
# ✅ 빌드용 .env 파일 생성 (Configuration Properties 바인딩용 최소 환경변수만)
123-
- name: Create build .env file
124-
working-directory: backend
125-
run: |
126-
cat > .env << 'EOF'
127-
# JWT Configuration Properties 바인딩용 (빌드 시 필요)
128-
CUSTOM_JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}
129-
CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS=3600
130-
EOF
131-
132101
- name: Gradle bootJar
133102
working-directory: backend
134103
run: ./gradlew --no-daemon clean bootJar -x test
@@ -148,7 +117,7 @@ jobs:
148117
docker-build:
149118
needs: build-artifacts
150119
runs-on: ubuntu-latest
151-
if: github.ref == 'refs/heads/main' # ✅ main 브랜치일 때만 실행
120+
if: github.ref == 'refs/heads/main'
152121
env:
153122
REGISTRY: ghcr.io
154123

@@ -173,7 +142,7 @@ jobs:
173142
username: ${{ github.actor }}
174143
password: ${{ secrets.GITHUB_TOKEN }}
175144

176-
- name: Build & push backend (runtime-only)
145+
- name: Build & push backend
177146
uses: docker/build-push-action@v6
178147
with:
179148
context: backend
@@ -184,10 +153,11 @@ jobs:
184153
${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/balaw:latest
185154
cache-from: type=gha
186155
cache-to: type=gha,mode=max
156+
187157
deploy:
188158
needs: docker-build
189159
runs-on: ubuntu-latest
190-
if: github.ref == 'refs/heads/main' # ✅ main 브랜치일 때만 실행
160+
if: github.ref == 'refs/heads/main'
191161
env:
192162
DOCKER_IMAGE_NAME: balaw
193163
REGISTRY: ghcr.io
@@ -197,19 +167,6 @@ jobs:
197167
run: |
198168
echo "IMAGE_PREFIX=$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
199169
200-
- name: Create prod .env file
201-
run: |
202-
cat > .env << 'EOF'
203-
SPRING_PROFILES_ACTIVE=prod
204-
PROD_DATASOURCE_URL=jdbc:mysql://mysql_1:3306/${{ secrets.DB_NAME }}
205-
PROD_DATASOURCE_USERNAME=${{ secrets.DB_USER }}
206-
PROD_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }}
207-
208-
PROD_REDIS_HOST=redis_1
209-
PROD_REDIS_PORT=6379
210-
PROD_REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
211-
EOF
212-
213170
- name: AWS SSM Send-Command
214171
uses: peterkimzz/aws-ssm-send-command@master
215172
id: ssm
@@ -221,27 +178,34 @@ jobs:
221178
working-directory: /
222179
comment: Deploy
223180
command: |
224-
# EC2 내부에서 prod.env 파일 생성
181+
# EC2에서 실제 운영 환경변수로 prod.env 파일 생성
225182
cat > /home/ec2-user/prod.env << 'EOF'
226183
SPRING_PROFILES_ACTIVE=prod
227-
184+
185+
# JWT 설정 (GitHub Secrets에서 가져옴)
228186
CUSTOM_JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}
229187
CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS=3600
230188
189+
# 데이터베이스 설정 (GitHub Secrets에서 가져옴)
231190
PROD_DATASOURCE_URL=jdbc:mysql://mysql_1:3306/${{ secrets.DB_NAME }}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul
232191
PROD_DATASOURCE_DRIVER=com.mysql.cj.jdbc.Driver
233192
PROD_DATASOURCE_USERNAME=root
234193
PROD_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }}
235-
194+
PROD_JPA_HIBERNATE_DDL_AUTO=validate
195+
196+
# Redis 설정 (GitHub Secrets에서 가져옴)
236197
PROD_REDIS_HOST=redis_1
237198
PROD_REDIS_PORT=6379
238199
PROD_REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
200+
201+
# 이메일 설정 (GitHub Secrets에서 가져옴)
202+
email_address=${{ secrets.EMAIL_ADDRESS }}
203+
send_email_password=${{ secrets.EMAIL_PASSWORD }}
204+
send_email_address=${{ secrets.SEND_EMAIL_ADDRESS }}
239205
EOF
240206
241-
# EC2에서 GHCR 로그인
207+
# GHCR 로그인 및 컨테이너 배포
242208
echo "${{ secrets.GHCR_PAT }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
243-
244-
# 최신 이미지 pull & 컨테이너 실행
245209
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/${{ env.DOCKER_IMAGE_NAME }}:latest
246210
docker stop app1 2>/dev/null || true
247211
docker rm app1 2>/dev/null || true
@@ -251,6 +215,6 @@ jobs:
251215
-p 8080:8080 \
252216
${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/${{ env.DOCKER_IMAGE_NAME }}:latest
253217
254-
# dangling image 정리 + .env 삭제
218+
# 정리
255219
docker rmi $(docker images -f "dangling=true" -q) || true
256220
rm -f /home/ec2-user/prod.env

backend/src/test/resources/application-test-ci.yml

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,31 @@ spring:
55
ansi:
66
enabled: always
77

8+
# CI 환경에서는 H2 메모리 DB 하드코딩 (환경변수 불필요)
89
datasource:
9-
url: ${TEST_DATASOURCE_URL}
10-
username: ${TEST_DATASOURCE_USERNAME}
11-
password: ${TEST_DATASOURCE_PASSWORD}
12-
driver-class-name: ${TEST_DATASOURCE_DRIVER}
10+
url: jdbc:h2:mem:db_test;MODE=MySQL
11+
username: sa
12+
password: ""
13+
driver-class-name: org.h2.Driver
1314

1415
jpa:
1516
show-sql: true
1617
hibernate:
17-
ddl-auto: ${TEST_JPA_HIBERNATE_DDL_AUTO}
18+
ddl-auto: create-drop
1819
properties:
1920
hibernate:
2021
use_sql_comments: true
2122
format_sql: true
2223
highlight_sql: true
2324

24-
# CI/CD 환경: 실제 Redis 서비스 사용, Embedded Redis 비활성화
25+
# Redis는 GitHub Actions 서비스 컨테이너 사용 (하드코딩)
2526
data:
2627
redis:
27-
host: ${TEST_REDIS_HOST:localhost}
28-
port: ${TEST_REDIS_PORT:6379}
29-
password: ${TEST_REDIS_PASSWORD:}
30-
embedded: false
28+
host: localhost
29+
port: 6379
30+
password: ""
3131

32+
# 테스트용 OAuth 설정 (하드코딩)
3233
security:
3334
oauth2:
3435
client:
@@ -55,6 +56,25 @@ spring:
5556
user-info-uri: https://openapi.naver.com/v1/nid/me
5657
user-name-attribute: response
5758

59+
# 테스트용 메일 설정 (하드코딩)
60+
mail:
61+
host: smtp.gmail.com
62+
port: 587
63+
64+
password: test-password
65+
66+
properties:
67+
mail:
68+
smtp:
69+
auth: true
70+
starttls:
71+
enable: true
72+
required: true
73+
connectiontimeout: 5000
74+
timeout: 5000
75+
writetimeout: 5000
76+
auth-code-expiration-millis: 1800000
77+
5878
springdoc:
5979
default-produces-media-type: application/json;charset=UTF-8
6080

@@ -65,8 +85,9 @@ logging:
6585
org.hibernate: INFO
6686
com.ai.lawyer: DEBUG
6787

88+
# JWT만 환경변수로 처리 (보안상 중요)
6889
custom:
6990
jwt:
7091
secretKey: ${CUSTOM_JWT_SECRET_KEY}
7192
accessToken:
72-
expirationSeconds: ${CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS}
93+
expirationSeconds: ${CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS:3600}

0 commit comments

Comments
 (0)