Search

모노레포 CI/CD 문제 및 해결 정리

ws-ingestor 모노레포 CircleCI 설정 요약

목적

각 앱(ws-chat-ingestor, ws-chat-persistor 등)별 Docker 이미지 빌드
빌드된 이미지 AWS ECR에 자동 푸시
(EKS 배포는 별도 CD에서 처리)

환경 변수 (CircleCI > Project Settings > Environment Variables)

변수명
예시 값
설명
AWS_ACCESS_KEY_ID
(IAM 사용자 Access Key)
AWS 인증
AWS_SECRET_ACCESS_KEY
(IAM 사용자 Secret Key)
AWS 인증
AWS_REGION
ap-northeast-2
ECR/EKS 리전
AWS_ECR_REGISTRY
197565756669.dkr.ecr.ap-northeast-2.amazonaws.com
ECR 레지스트리

주요 워크플로우/잡

build-and-push
파라미터(app_dir, ecr_repo)로 앱별 재사용
Docker build context는 항상 레포 루트(.)
Dockerfile은 -f 옵션으로 각 앱별 지정
이미지는 $AWS_ECR_REGISTRY/<<ecr_repo>>:$CIRCLE_SHA1로 태깅 후 push
ECR 로그인 후 push
workflows
build-and-push-all: 각 앱별 build-and-push job 실행
예시:
chat-ingestor: chat-ingestor/fyc-chat-ingestor
chat-persistor: chat-persistor/fyc-chat-persistor

config.yml 예시

version: 2.1 executors: node-docker: docker: - image: cimg/node:20.12 jobs: build-and-push: executor: node-docker parameters: app_dir: type: string ecr_repo: type: string steps: - checkout - setup_remote_docker - run: name: Install AWS CLI command: | sudo apt-get update && sudo apt-get install -y awscli - run: name: Build Docker image command: | docker build -f &lt;&lt; parameters.app_dir &gt;&gt;/Dockerfile -t $AWS_ECR_REGISTRY/&lt;&lt; parameters.ecr_repo &gt;&gt;:$CIRCLE_SHA1 . - run: name: Login to ECR command: | aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_REGISTRY - run: name: Push Docker image command: | docker push $AWS_ECR_REGISTRY/&lt;&lt; parameters.ecr_repo &gt;&gt;:$CIRCLE_SHA1 workflows: version: 2 build-and-push-all: jobs: - build-and-push: name: build-and-push-chat-ingestor app_dir: apps/ws-chat-ingestor ecr_repo: chat-ingestor/fyc-chat-ingestor - build-and-push: name: build-and-push-chat-persistor app_dir: apps/ws-chat-persistor ecr_repo: chat-persistor/fyc-chat-persistor
YAML
복사

동작 순서

1.
커밋/푸시 → CircleCI가 전체 레포 체크아웃
2.
각 앱별 Docker 빌드 및 ECR 푸시
3.
ECR 이미지 → EKS 등에서 pull하여 배포

장점

모노레포 구조에 최적화(여러 앱 동시 관리)
환경 변수로 유연성 확보(ECR 주소, 리전 등 쉽게 변경)
완전 자동화(수동 빌드/배포 불필요)

주의사항

환경 변수 미설정 시 인증/빌드 에러 100% 발생
Docker build context는 항상 루트로 지정!→ 그렇지 않으면 packages, 공통 모듈 접근 불가
ECR 리포지토리/권한/네이밍 불일치 시 이미지 푸시 실패

추가 개선 포인트

develop/main 등 브랜치별 빌드/배포 분리
테스트/빌드/배포 job 분리 및 조건부 실행
EKS 자동 배포(job 추가)

설정 중 문제 & 해결 방법

1. Docker build context 문제

현상: COPY ../../packages ./packages 실행 시failed to compute cache key: ... "/packages": not found 에러
원인: build context를 앱 디렉토리로 잡으면 상위 디렉토리 접근 불가
해결: build context를 반드시 **레포 루트(.)**로 지정(docker build -f apps/ws-chat-ingestor/Dockerfile .)

2. TypeScript 빌드 에러 (존재하지 않는 export)

현상:
Cannot find module './types/websocket'
Module '"@ws-ingestor/util"' has no exported member 'parseMessage'
원인: 실제 없는 파일/타입/함수 import/export 시도
해결: 해당 코드 삭제/주석

3. SQS MessageGroupId 에러

현상:
The request must contain the parameter MessageGroupId.
원인: SQS FIFO 큐는 MessageGroupId, MessageDeduplicationId 필수
해결:
groupId: chat.extras.streamingChannelId
dedupId: ctime+uid → ctime+cid → ctime+type → uuid 순 fallback
값 없으면 에러 로그 후 skip

4. AWS CLI/ECR 인증 에러

현상:
Unable to locate credentials...
aws: error: argument --region: expected one argument
Cannot perform an interactive login from a non TTY device
원인: 환경 변수 미등록
해결: CircleCI Project Settings > Environment Variables에 정확히 등록

5. ECR 레지스트리 주소 관리

현상: config.yml에 ECR 주소 하드코딩 → 관리 불편
해결: AWS_ECR_REGISTRY 환경 변수 사용, config.yml에 치환