CI/CD (GitHub Actions / 배포)¶
GitHub Actions로 빌드 → 이미지 → ECR/Docker Hub 푸시 → EC2/Lightsail SSH 실행. develop=Dev, main=Prod.
1. 파이프라인 (백엔드)¶
checkout → setup-java(21, temurin) → chmod +x gradlew
→ ./gradlew clean build -x test
→ Flyway 검증 (Dev: flywayInfo / Prod: flywayValidate)
→ Docker 이미지 빌드 → ECR push
→ EC2 SSH → 컨테이너 실행 (SPRING_PROFILES_ACTIVE=dev|prod)
- Jobs는 독립 환경 → 코드/산출물 공유는
actions/upload-artifact/download-artifact - secret 접근:
${{ secrets.<KEY> }}(Repo Settings → Secrets → Actions) → teams/engineering/infra/environments gradlew실행 권한: git이 권한 미보존 → CI에서chmod +x또는git update-index --chmod=+x
2. 배포 방식¶
- 현재: GitHub Actions가 이미지 빌드 → 레지스트리 push → 서버에서 pull/run (빌드/배포 분리, 서버 리소스 절약)
- 대안: 서버에서
docker-compose직접 빌드 (의존성 일괄 관리, 단 서버 리소스 소모)
3. 트러블슈팅 (요지)¶
React 빌드 시점 환경변수¶
React는 빌드 시점에 .env가 함께 번들됨(런타임 X). docker-compose env_file로 컨테이너 env에 넣어도 실행파일에 반영 안 됨 → CI 빌드 단계에서 시크릿을 .env로 주입해 빌드. 민감 정보면 --build-args + .dockerignore, nginx 동적 주입, 백엔드 config API 중 택일.
Spring 설정 우선순위¶
SPRING_CONFIG_LOCATION=classpath:/application.yml,file:/application-private.yml. 외부 파일이 classpath 기본을 덮어씀. 우선순위: application-private.yml > application-{profile}.yml > application.yml.
Mixed Content¶
HTTPS 페이지에서 HTTP 요청 시 브라우저 차단. nginx/ALB가 HTTPS→HTTP 변환만 하고 역변환 안 해서 발생. 해결: API를 그냥 HTTPS로 요청. 부득이하면 X-Forwarded-Proto로 ALB가 원 프로토콜 전달.
CORS¶
브라우저 origin 기준. 서버(또는 nginx 리버스 프록시)가 Access-Control-Allow-Origin: https://<frontend-origin> 헤더 주입. ALB는 전달만 하므로 origin은 그대로.
4. 관련¶
- teams/engineering/guides/db-migration — Flyway CD 검증
- teams/engineering/guides/docker — 컨테이너 구성
- teams/engineering/infra/architecture — 인프라 토폴로지